萌新的STM32学习-17 中断的基本概念2
STM32中断优先级的基本概念
抢占优先级: 高抢占优先级可以打断正在执行的低抢占优先级中断
响应优先级: 这个也叫子优先级 抢占优先级相同,响应优先级高的中断不能打断响应优先级低的中断。还有一种情况就是当两个或者多个中断的抢占式优先级和响应优先级相同时,那么就遵循自然优先级,看中断向量表的中断排序,数值越小,优先级越高。
在 NVIC 中由寄存器 NVIC_IPR0-NVIC_IPR59 共 60 个寄存器控制中断优先级,每个寄存器的 8 位,所以就有了 240 个宽度为 8bit 的中断优先级控制寄存器,原则上每个外部中断可配置的优先级为 0~255,数值越小,优先级越高。但是实际上 M3 芯片为了精简设计,只使用了高四位[7:4],低四位取零,这样以至于最多只有 16 级中断嵌套,即 2^4=16。
对于 NVCI 的中断优先级分组:STM32F103 将中断分为 5 个组,组 0~4。该分组的设置是由 SCB->AIRCR 寄存器的 bit10~8 来定义的。
特别提示: 一个工程中,一般只设置一次中断优先级分组。
这到底是怎么一个说法和分配呢
我们拿STM32中断优先级2 举例 假设分组为2
那么一共4个 分为 2部分 前面2个被称为抢占优先级 后面2个位组成 响应优先级
抢占优先级的级别高于响应优先级。而数值越小所代表的优先级就越高。
结合实例说明一下:假定设置中断优先级分组为 2,然后设置中断 3(RTC_WKUP 中断)的抢占优先级为 2,响应优先级为 1。中断 6(外部中断 0)的抢占优先级为 3,响应优先级为 0。中断 7(外部中断 1)的抢占优先级为 2,响应优先级为 0。那么这 3 个中断的优先级顺序为:中断 7>中断 3>中断 6。上面例子中的中断 3 和中断 7 都可以打断中断 6 的中断。而中断 7 和中断 3 却不可以相互打断!
关于STM32 NVIC的使用
1.设置中断 AIRCR[10:8]
HAL_NVIC_SetPriorityGrouping
2.设置中断优先级 IPRx bit [7:4]
HAL_NVIC_SetPriority
3.使能中断 ISERx
HAL_NVIC_EnablelRQ
ST 公司把 core_cm3.h 文件的 NVIC 相关函数封装到 stm32f1xx_hal_cortex.c 文件中,下面
列出我们较为常用的函数进行,想了解更多其他的函数请自行查阅。
- HAL_NVIC_SetPriorityGrouping 函数
HAL_NVIC_SetPriorityGrouping 是设置中断优先级分组函数。其声明如下:
void HAL_NVIC_SetPriorityGrouping(uint32_t PriorityGroup);
⚫ 函数描述:
用于设置中断优先级分组。
⚫ 函数形参:
形参 1 是中断优先级分组号,可以选择范围:NVIC_PRIORITYGROUP_0 到
NVIC_PRIORITYGROUP_4(共 5 组)。
⚫ 函数返回值:
无
⚫ 注意事项:
这个函数在一个工程里基本只调用一次,而且是在程序 HAL 库初始化函数里面已经被调
用,后续就不会再调用了。因为当后续调用设置成不同的中断优先级分组时,有可能造成前面
设置好的抢占优先级和响应优先级不匹配。 - HAL_NVIC_SetPriority 函数
HAL_NVIC_SetPriority 是设置中断优先级函数。其声明如下:
void HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority,
uint32_t SubPriority);
⚫ 函数描述:
用于设置中断的抢占优先级和响应优先级(子优先级)。
⚫ 函数形参:
形参 1 是中断号,可以选择范围:IRQn_Type 定义的枚举类型,定义在 stm32f103xe.h。
形参 2 是抢占优先级,可以选择范围:0 到 15。
形参 3 是响应优先级,可以选择范围:0 到 15。⚫ 函数返回值:无3. HAL_NVIC_EnableIRQ 函数HAL_NVIC_EnableIRQ 是中断使能函数。其声明如下:void HAL_NVIC_EnableIRQ(IRQn_Type IRQn);⚫ 函数描述:用于使能中断。⚫ 函数形参:形参 IRQn 是中断号,可以选择范围:IRQn_Type 定义的枚举类型,定义在 stm32f103xe.h。⚫ 函数返回值:无
EXIT
基本概念
简介是外部(扩展)中断事件控制器
包含20个产生事件/中断请求的边沿检测器 ,即总共: 20条EXTI线(F1)
EXTI 即是外部中断和事件控制器,它是由 20 个产生事件/中断请求的边沿检测器组成。每一条输入线都可以独立地配置输入类型(脉冲或挂起)和对应的触发事件(上升沿或下降沿或者双边沿都触发)。每个输入线都可以独立地被屏蔽。挂起寄存器保持着状态线的中断请求。
中断和事件的
中断: 要进入NVIC,有相应的中断服务区函数,需要CPU 处理
事件: 不进入NVIC,仅用于内部硬件自动控制的,如: TIM DMA ADC
这里19根因为在设计的时候就没设计成互联型 互联型的是带上以太网的所以是20根
每条EXTI线都可以单独配置:选择类型(中断或者事件) ,触发方式(上升沿,下降沿,或者双边沿触发) ,支持软件触发,开启/屏蔽,有挂起状态位
EXTI的工作原理
标号①是一个边沿检测电路,包括边沿检测电路,上升沿触发选择寄存器(EXTI_RTSR)和下降沿触发选择寄存器(EXTI_FTSR)。边沿检测电路以输入线作为信号输入端,如果检测到有边沿跳变就输出有效信号‘1’,就输出有效信号‘1’到标号②部分电路,否则输入无效信号‘0’。边沿跳变的标准在于开始的时候对于上升沿触发选择寄存器或下降沿触发选择寄存器对应位的设置,对应位的设置可以参照一下表 16.1.2.1。标号②是一个或门电路,它的两个信号输入端分别是软件中断事件寄存器(EXTI_SWIER)和边沿检测电路的输入信号。或门电路只要输入端有信号‘1’,就会输出‘1’,所以就会输出‘1’到标号③电路和标号④电路。通过对软件中断事件寄存器的读写操作就可以启动中断/事件线,即相当于输出有效信号‘1’到或门电路输入端。标号③是一个与门电路,它的两个信号输入端分别是中断屏蔽寄存器(EXTI_IMR)和标号②电路输出信号。与门电路要求输入都为‘1’才输出‘1’,这样子的情况下,如果中断屏蔽寄存器(EXTI_IMR)设置为 0 时,不管从标号②电路输出的信号特性如何,最终标号③电路输出的信号都是 0;假如中断屏蔽寄存器(EXTI_IMR)设置为 1 时,最终标号③电路输出的信号才由标号②电路输出信号决定,这样子就可以简单控制 EXTI_IMR 来实现中断的目的。标号④电路输出‘1’就会把请求挂起寄存器(EXTI_PR)对应位置 1。最后,请求挂起寄存器(EXTI_PR)的内容就输出到 NVIC 内,实现系统中断事件的控制。接下来我们看看 EXTI 功能框图的产生事件的线路。产生事件线路是从标号②之后与中断线路有所不用,之前的线路都是共用的。标号④是一个与门,输入端来自标号②电路以及来自于事件屏蔽寄存器(EXTI_EMR)。如果 EXTI_EMR 寄存器设置为 0,那不管标号②电路输出的信号是‘0’还是‘1’,最终标号④输出的是‘0’;如果 EXTI_EMR 寄存器设置为 1,最终标号④电路输出信号就由标号③电路输出的信号决定,这
样子就可以简单的控制 EXTI_EMR 来实现是否产生事件的目的。
标号④电路输出有效信号 1 就会使脉冲发生器电路产生一个脉冲,而无效信号就不会使其
产生脉冲信号。脉冲信号产生可以给其他外设电路使用,例如定时器,模拟数字转换器等,这
样的脉冲信号一般用来触发 TIM 或者 ADC 开始转换。
产生中断线路目的使把输入信号输入到 NVIC,进一步运行中断服务函数,实现功能。而产
生事件线路目的是传输一个脉冲信号给其他外设使用,属于硬件级功能。
对于第一部分就是说 我使得上升沿置1 那么我通过边沿检测器进来一个上升沿 就允许传输到第二部分 如果是置为0 那么即使上升沿来了也不会
然后来到第二部分 第二部分是一个或门 因为我们收到的一部分内容是来自于前者通过边沿检测电路的(1)
因为上面连接的是软件中断事件寄存器 意思就是这一部分和块1的是并列的 大家都通过或门只要是1 都能传入下一级
这就是属于我们在选择触发上 可以选择硬件触发还是软件触发
接下来进入第三部分模块
硬件触发得到的1到了之后还得进入一个请求挂起寄存器 (因为对我们来说想要完成一次触发 不仅要保证 时序上的正确 还要保证 系统层面上 允许中断存在,不然真就随便一个中断就打断我现在做的事情吗) 1 来了之后回自动的使得请求挂起寄存器对应位置为1,然后和中断屏蔽寄存器共同连接至一个与门上 (所以中断屏蔽寄存器必须为1才能一起通过与门传输到NVIC中断控制器上)
上升沿触发选择寄存器(EXTI_RTSR)
我们只用到了0到19 但是第19位是只适用于互联型的所以只用到了0到18 因为板子正好只有19根中断线 当寄存器输入1时才会允许 输入线上的上升沿触发
同理下降沿也是类似的
中断屏蔽也是同理19根线
挂机EXTI_PR也是同理
假设EXTI-8发生了选择的边沿事件, 该为被置入1 那么我们可以通过在该位写入‘1’ 来清除它
EXTI_FTSR 下降沿触发
EXTI_RTSR 上升沿触发
EXTI_IMR 中断屏蔽寄存器
EXTI_PR 请求挂起寄存器