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();
外部中断配置
- 管脚复用–配置成复用功能 并设置中断线
- 对中断参数进行配置
- 对中断优先级进行配置
- 编写中断服务函数
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); }
今天的文章
stm32f4外部中断_中断响应优先级和中断处理优先级分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/80855.html