stm32f4外部中断_中断响应优先级和中断处理优先级

stm32f4外部中断_中断响应优先级和中断处理优先级主要介绍了中断的概念、执行过程以及相关的术语和配置方法

1.概念

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

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

2.中断执行过程

stm32f4外部中断_中断响应优先级和中断处理优先级

 图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中的

stm32f4外部中断_中断响应优先级和中断处理优先级

 

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

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

stm32f4外部中断_中断响应优先级和中断处理优先级

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

stm32f4外部中断_中断响应优先级和中断处理优先级 单片机复位之后的执行流程:第一步系统初始化,第二步执行main函数

stm32f4外部中断_中断响应优先级和中断处理优先级 

 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 优先级最低。指定软件优先级后,硬件优先级(默认优先级)无效。

stm32f4外部中断_中断响应优先级和中断处理优先级

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

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

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

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

第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]等。

中断使能寄存器如下图:stm32f4外部中断_中断响应优先级和中断处理优先级

 中断失能寄存器如下图:

stm32f4外部中断_中断响应优先级和中断处理优先级

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

stm32f4外部中断_中断响应优先级和中断处理优先级

stm32f4外部中断_中断响应优先级和中断处理优先级 

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

NVIC_SetPriorityGrouping();

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

NVIC_SetPriority();

3.使能中断通道。

NVIC_EnableIRQ();

外部中断配置

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

7.EXTI中断

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

stm32f4外部中断_中断响应优先级和中断处理优先级

 

外部中断触发的流程:

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

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

stm32f4外部中断_中断响应优先级和中断处理优先级

EXTI硬件中断选择过程: 

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

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

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

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

需要了解的5个寄存器:

stm32f4外部中断_中断响应优先级和中断处理优先级

stm32f4外部中断_中断响应优先级和中断处理优先级 

stm32f4外部中断_中断响应优先级和中断处理优先级 

 PR寄存器:

stm32f4外部中断_中断响应优先级和中断处理优先级

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

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

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

stm32f4外部中断_中断响应优先级和中断处理优先级

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

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注