STM32外部中断 中断优先级讲解及配置

2023-11-09

1.概念

对于几乎所有的微控制器,中断都是一种常见的特性。中断一般是由硬件(如外设和外部输入引脚)产生的事件,它会引起程序流偏离正常的流程(如给外设提供服务),转去执行其他的流程。

CPU在正常执行程序的过程中,由于内部/外部事件的触发或程序的预先安排引起CPU暂停当前正在运行的程序,而转去执行中断服务子程序,待中断服务子程序执行完毕后,CPU继续执行原来的程序,这一过程称为中断;

2.中断执行过程

 图1 中断执行过程说明

1、外设发出中断请求

2、处理器暂停当前执行的任务,保护现场(拓展:CPU内部有R0-R15寄存器,中断发生时会保存里边的值),将当前位置的PC地址压栈;

3、程序跳转到中断服务程序,执行中断服务程序;

4、恢复现场,将栈顶的值回送给PC;

5、跳转到被中断的位置开始执行下一个指令

中断服务函数:相对于正常子函数,中断服务函数有以下需要注意的地方:

1、中断服务函数不能传入参数;

2、中断服务函数不能有返回值;

3、中断服务函数应该做到短小精悍,快入快出,禁止延时性的过程。

4、不要在中断函数中使用printf函数,会带来重入和性能问题,不要出现浮点运算。

       printf是一个无法重入的函数:

   中断重入:就是在一个中断程序执行过程中又被另一个中断打断,转而又去执行另一个中断程序。

3.中断的部分专业术语

中断源:引起中断的原因,或者能够发出中断请求信号的来源统称为中断源

中断优先级:中断同时到来,谁先执行。数字越小,优先级越高。

中断响应:中断事件发生,Cortex-M3内核准备执行该事件,即为中断响应。

中断嵌套:可嵌套的内核   -- 中断可以被其他中断打断。(Cortex-M)

不可嵌套的内核 -- 不可以打断。

中断挂起:中断事件发生了,但是Cortex-M内核还没准备去执行。

中断服务函数: 中断发生后,要执行的程序。(固定格式)

中断通道:对于 Cortex-M 内核所支持的 240 个外部中断,使用了“中断通道”这个概念,因为尽管每个中断对应一个外围设备,但该外围设备通常具备若干个可以引起中断的中断源或中断事件[外围设备与中断源的关系为1对N]。而该设备的所有的中断都只能通过该指定的“中断通道”向内核申请中断。因此,关于中断优先级的概念都是针对“中断通道”的。当该中断通道的优先级确定后,也就确定了该外围设备的中断优先级,并且该设备所能产生的所有类型的中断,都享有相同的通道中断优先级。至于该设备本身产生的多个中断的执行顺序,则取决于用户的中断服务程序。

 4.STM32中的中断分类

中断:异常(内核里的中断)+外部(片上外设)中断

异常是指由于执行指令时的一个错误条件而产生的故障。按照ARM的说法,中断也是与一种异常。

异常:可以理解为是Cortex-M内核的中断,包含错误异常以及其他用于OS支持的系统异常。Stm32中的

 

Cortex-M处理器的异常架构具有多种特性,支持多个系统异常和外部中断。编号1~15的为系统异常16及以上的则为中断输入(处理器的输入,不必从封装上的I/O引脚上访问)。包括所有中断在内的多数异常﹐都具有可编程的优先级,一些系统异常则具有固定的优先级。

不同Cortex-M3或Cortex-M4微控制器的中断源的编号(1~240)可能会不同,优先级也可能会有所差异。这是因为为了满足不同的应用需求,芯片设计者可能会对Cortex-M3或Cortex-M4设计进行相应的配置。

启动文件里已经定义好了,所有的中断服务函数

 单片机复位之后的执行流程:第一步系统初始化,第二步执行main函数

 

 5.STM32中的中断优先级

对于ARM处理器:中断优先级的配置有8位可用  0~255

       对于STM32来说:在设计芯片时候,只采用其中4位  0-15

       中断优先级分为:抢占(占先)优先级         响应(次级)优先级

       1.抢占优先级高的任务可以打断抢占优先级低的任务

       2.抢占优先级一样,响应优先级高的先执行,响应优先级无法打断其他优先级的任务

       优先级数值越小,优先级越高

  

                                   抢占 2位                  响应2位                   

任务A                          0                                 2                   0010

任务B                          1                                 3                   0111

任务C                          1                                 1                   0101

任务D                          1                                 1                   0101

 中断分组:4位里有几位是抢占用的,几位是响应用的?中断分组,一个工程只分1次

对于Cortex-M处理器(包括ARMv6-M和ARMv7-M)异常是否能被处理器接受以及何时被处理器接受并执行异常处理,是由异常的优先级和处理器当前的优先级决定的

更高优先级的异常(优先级编号更小)可以抢占低优先级的异常(优先级编号更大),这就是异常/中断嵌套的情形

有些异常(复位,NMI和 HardFault)具有固定的优先级,其优先级由负数表示,这样,它们的优先级就会比其他的异常高其他异常则具有可编程的优先级﹐范围为0~255

NVIC 支持由软件指定的优先级。通过对中断优先级寄存器的8位 IPR_N 区执行写操作,来将中断的优先级指定为 0~255,见中断优先级寄存器。硬件优先级随着中断号的增加而降低。 0 优先级最高, 255 优先级最低。指定软件优先级后,硬件优先级(默认优先级)无效。

特性:抢占优先级+次级优先级

           抢占优先级:低优先级的中断正在执行,高优先级的可以打断低优先级运行

           次级优先级:抢占优先级相同的多个中断同时请求,次级优先级越高先执行。

优先级具体是多少,根据分组来看的,程序里要先设置分组,只需要设置一次。在设置优先级。

第0组  -------四位都是次级优先级

第1组  -------三位都是次级优先级  一位是抢占优先级

第2组  -------二位都是次级优先级  二位是抢占优先级

第3组  -------一位都是次级优先级  三位是抢占优先级

第4组  -------                                  四位是抢占优先级

6.中断的使能

 

外部中断或部分内部中断(异常),如果需要用中断,需要先在NVIC中使能中断中断使能寄存器可由两个寄存器进行配置。要设置使能位,需要写人NVIC->ISERLn]寄存器地址;要清除使能位,需要写入NVIC->ICER[n]寄存器地址。这样,使能或禁止一个中断时就不会影响其他的中断使能状态,ISER/ICER寄存器都是32位宽,每个位代表一个中断输入。

由于Cortex-M3或Cortex-M4 处理器中可能存在32个以上的外部中断,因此ISER和ICER寄存器也会不止一个,如NVIC->ISER[O]和NVIC->ISER[1]等。

中断使能寄存器如下图:

 中断失能寄存器如下图:

内核提供的操作NVIC的函数说明: 

 

1.中断优先级分组:整个工程只需要一次分组就可以,一般放在主函数的最开头。

NVIC_SetPriorityGrouping();

2.配置中断通道的优先级。

NVIC_SetPriority();

3.使能中断通道。

NVIC_EnableIRQ();

外部中断配置

  1. 管脚复用--配置成复用功能   并设置中断线
  2. 对中断参数进行配置  
  3. 对中断优先级进行配置
  4. 编写中断服务函数

7.EXTI中断

外部中断内部框图以及外部中断线路映像

 

外部中断触发的流程:

       边沿检测电路检测到对应的信号(上升沿或下降沿),请求挂起寄存器置位,开启中断屏蔽寄存器,交给NVIC去处理

112通用I/O端口以下图的方式连接到16个外部中断/事件线上

EXTI硬件中断选择过程: 

通过下面的过程来配置20个线路做为中断源:

1、配置20个中断线的屏蔽位(EXTI_IMR)

2、配置所选中断线的触发选择位(EXTI_RTSR和EXTI_FTSR);

3、配置对应到外部中断控制器(EXTI)的NVIC中断通道的使能和屏蔽位,使得20个中断线中的请求可以被正确地响应。

需要了解的5个寄存器:

 

 

 PR寄存器:

外部中断(EXTI)的配置过程:

1、配置要中断检测的IO引脚模式为:浮空输入模式,具体查阅参考手册8.1.11以及自己的硬件电路来设置

2、把要中断检测的IO引脚映射到对应的EXTI中断线上,通过AFIO来设置。

3、配置对应的EXTI中断线,触发的边沿、使能屏蔽位

4、通过NVIC配置EXTI中断的优先级、使能NVIC的EXTI中断

 8.外部中断代码

外部中断引脚初始化。

void exti_config(void){//KEY1
	
	//开时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC, ENABLE);
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);
	
	//配置中断
	EXTI_InitTypeDef EXTI_InitStruct;
	EXTI_InitStruct.EXTI_Line=EXTI_Line0;
	EXTI_InitStruct.EXTI_LineCmd=ENABLE;
	EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;
	EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Rising_Falling;
	EXTI_Init(&EXTI_InitStruct);
	
	//设置中断优先级
	NVIC_InitTypeDef NVIC_InitStruct;
	NVIC_InitStruct.NVIC_IRQChannel=EXTI0_IRQn;
	NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=0;
	NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;
	NVIC_Init(&NVIC_InitStruct);
	
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32外部中断 中断优先级讲解及配置 的相关文章

  • unl构件图与部署图

    构件是系统中可替换的物理部分 它包装了实现而且遵从并提供一组接口的实现 五个要素 规格说明 对于构件 必须有一个它所提供服务的抽象描述 通俗地说 每个构件都必须提供特定的服务 一个或多个实现 构件是一种物理概念 必须被一个或多个实现所支持
  • .NET 6 Linux 系统服务 Systemd (案例版)

    Net Core Windows 系统服务 之前已经写过了 但是 对于Linux的系统服务 却没有写过 主要是因为 大部分Linux的 Net服务都直接Docker了 当然 不排除有这种使用的 可能搞成启动执行了 也有可能用守护进程的方式搞
  • iOS开发学习之触摸事件和手势识别

    iOS的输入事件 触摸事件 手势识别 手机摇晃 一 iOS的输入事件 触摸事件 滑动 点击 运动事件 摇一摇 手机倾斜 行走 不需要人为参与的 远程控制事件 耳机控制手机声音 1 iOS事件对象都是UIEvent类的实例 UIEvent类对
  • 【Linux】重启后进入了紧急模式&应急模式(emergency mode)

    本章进行测试 复现问题 将 etc fstab 挂载 home 参数defaults写错 一般在编辑 etc fstab后都会去执行mount a 这里可以看到执行后并未出现错误 那么咱们重启测试一下 可以看到如图所示出现的错误信息 解决办

随机推荐

  • 系统移植部署开发阶段

    环境搭建 家目录下安装tftp服务器 实现linux系统对tftp目录得文件传输 准备文件 将uboot镜像文件 TF A镜像文件反在tftp目录下 开发板与linux系统得连接 在串口工具打印信息ums 0 mmc 0 将TF卡挂载到Ub
  • Zotero及其插件的安装及使用

    Zotero及其插件的安装及使用 对于学生而言 或多或少得看论文 现在市场上最流行的论文管理工具当属Zotero 作为一个开源的软件 其包括了获取文献 查看文献 文献分类 即时编写笔记等功能 此外还能利用不少插件方面学习 例如Zotero
  • java中将List数据平均切分成N份

    话不多说 直接上代码 直接用 public static
  • 栈与递归

    文章目录 递归 函数调用 递归工作栈 递归算法的效率分析 递归转换为非递归 递归算法优点 递归 若在一个函数 过程或数据结构定义的内部又直接 或间接 出现定义本身的应用 则称它们是递归 三种常使用递归的情况 定义是递归的 例1 阶乘函数 l
  • 网络安全(黑客)必备工具包

    1 NMap 作为Network Mapper的缩写 NMap是一个开源的免费安全扫描工具 可用于安全审计和网络发现 它适用于Windows Linux HP UX Solaris BSD变体 包括Mac OS 以及AmigaOS Nmap
  • PHP的pack/unpack

    前言 直接参照官网 PHP pack Manual PHP中文手册 PHP中国镜像 php 国内镜像 PHP官方网站 PHP unpack Manual PHP中文手册 PHP中国镜像 php 国内镜像 PHP官方网站 1 作用 1 pac
  • Cannot determine path to ‘tools.jar‘ library for openjdk-17

    idea错误 Cannot determine path to tools jar library for openjdk 17 解决方法 把project structure 1 7全部去掉 只留1 8 再运行tomcat7就不报错了
  • vue-cli3打包文件增加hash值

    vue config js中加入以下代码 module exports filenameHashing true 打包后为文件名增加hash值 chainWebpack config gt config output filename js
  • [Python]windows平台python第三方模块安装gcc failed with exit status 1问题的解决

    在windows平台命令行用pip install安装库的时候 经常遇到not found vcvarsall bat这种问题 手动下载源码自己编译 又经常有很多问题 1 在单位没有安装VS 安了mingw32 编译设置成python se
  • [转]增强型N沟道mos管(如si2300)开关条件

    增强型N沟道mos管 如si2300 开关条件 增强型N沟道mos管的S source源极 和 D drain漏极 导通条件取决与Vgs 即栅极和源极间的电压压差 只有当 Vgs gt 2 5V 也就是 Vg G极电压 Vs S极电压 gt
  • Qt类中使用函数指针数组

    接上文例子 将其改成函数指针数组 class Widget public QWidget public int add int x int y int mul int x int y int Widget func p 2 int x in
  • RN 使用第三方组件之react-native-image-picker(拍照/从相册获取图片)

    首先给个github地址 https github com react community react native image picker 英文不行的看下面这个笔记 该插件可以同时给iOS和Android两个平台下使用 但是需要配置下各
  • 京东如何处理数据中心网络对应用性能的影响

    随着现代数据中心规模的不断扩张 网络拓扑和路由转发变得越来越复杂 传统的数据中心使用大型机和小型机 网络规模相对较小 普通的机框式交换机就能满足网络的需求 随着CLOS集群架构的普及 标准的x86服务器集群以低成本和高扩展性逐渐取代大型机和
  • 解决:Failed to connect to repository : Error performing command: git.exe ls-remote -h xxxxxxx HEAD...

    在jenkins新建工程 配置源码管理时 发现输入gitlab的Repository URL 总会抛出一个错误 后来在网上各种百度 终于找到了一篇比较靠谱的文章 顺着文章的提示 去Manage Jenkins Global Tool Con
  • linux 新建文件夹命令

    今天学习了几个命令 是创建 删除文件和文件夹的 在linux里 文件夹是目录 下面说下我学习的命令 创建文件夹 mkdir 一 mkdir命令使用权限 所有用户都可以在终端使用 mkdir 命令在拥有权限的文件夹创建文件夹或目录 二 mkd
  • 集成学习-Voting

    一 什么是集成学习 集成学习是使用一系列学习器进行学习 并使用某种规则把各个学习结果进行整合从而获得比单个学习器更好的学习效果的一种机器学习方法 一般情况下 集成学习中的多个学习器都是同质的 弱学习器 上面的描述来自百度百科 看定义的话知道
  • Qt关于QProcess使用startDetached函数问题

    最近项目编写自动升级程序使用进程通讯 网上查看大部分资料都使用QProcess类 再使用函数startDetached过程发现一种很奇怪现象 父进程通过startDetached调用子进程 原则上父进程和子进程脱离关系 关闭父进程不会关闭子
  • PyQt5无法导入QtCore问题解决

    今天安装PyQt 执行下面语句的时候出现问题 python3 configure py pyqt PyQt5 搞了一下午 吐血 具体 import PyQt5 完全ok 但是 from PyQt5 import QtCore 就出错 就这个
  • 07:MYSQL----多表查询

    目录 1 多表查询概述 2 多表查询分类 3 内连接 3 外连接 4 自连接 5 联合查询 union union all 6 子查询 1 多表查询概述 select from emp dept emp 表中有6条数据 dept表中有5条数
  • STM32外部中断 中断优先级讲解及配置

    1 概念 对于几乎所有的微控制器 中断都是一种常见的特性 中断一般是由硬件 如外设和外部输入引脚 产生的事件 它会引起程序流偏离正常的流程 如给外设提供服务 转去执行其他的流程 CPU在正常执行程序的过程中 由于内部 外部事件的触发或程序的