看到一个交流群在讨论关于【关于STM32中断优先级的话题】,其中就有小伙伴提到:为什么有些STM32中断没有【子优先级】?
比如,有时候你在使用STM32CubeMX配置时,你会发现只有Preemption Priority【抢占优先级】,而没有Sub Priority【次优先级】:
然而,有时候你会发现又有Sub Priority【次优先级】:
这个问题就牵涉到STM32,准确的来说的是 Cortex-M NVIC嵌套向量中断控制器的问题。
关于Cortex-M的NVIC
NVIC:Nested Vectored Interrupt Controller,嵌套向量中断控制器。
在每个Cortex-M内核中都有这么一个NVIC嵌套向量中断控制器,当MCU使用的内核不同,其中的NVIC也可能不同。
比如,Cortex-M0和Cortex-M3内核中NVIC功能就不同。
其中,中断优先级分组功能就不同。
Cortex-M0的NVIC没有优先级分组功能,Cortex-M3、 M4、M7有分组功能。
所以,你在使用STM32CubeMX配置时,M0/M0+内核的STM32是没有【次优先级】那个选项的。
Cortex-M0包含STM32F0、L0、G0等处理器。
对底层感兴趣的朋友可以继续往下看。
NVIC寄存器
NVIC寄存器,需查看对应的内核(Cortex-M)手册,在ARM官网能找到( M3也有对应的中文翻译版,大家可以自己网上搜索)。
内核中的寄存器和我们STM32参考手册中寄存器一样,不同的Bit位代表含义不同。
但是,对于NVIC来说,由于包含众多优先级相关配置,寄存器数量相对较多(NVIC寄存器族)。
拿M3来说,优先级分组的配置,位于NVIC的AIRCR应用程序中断及复位控制寄存器中:
中断入口
额外提下一个小伙伴问的问题:为什么外部中断8和9都使用同一个中断?
void EXTI9_5_IRQHandler(void) { if(EXTI_GetITStatus(EXTI_Line8) != RESET) { /* 代码 */ EXTI_ClearITPendingBit(EXTI_Line8); } if(EXTI_GetITStatus(EXTI_Line9) != RESET) { /* 代码 */ EXTI_ClearITPendingBit(EXTI_Line9); } }我想,这个问题应该不难。好比一个main程序入口,进入之后需要处理很多事情,只是在里面需要区分事件。
很多外设中断,都会使用同一个中断入口,有一个原因:节约中断入口资源分配。
像USART发送和接收中断,TIM不同通道捕获中断等。
审核编辑:刘清
-
STM32
+关注
关注
2270文章
10896浏览量
355768 -
Cortex-M
+关注
关注
2文章
229浏览量
29754 -
ARM单片机
+关注
关注
0文章
45浏览量
9834 -
中断优先级
+关注
关注
0文章
22浏览量
9368 -
stm32cubemx
+关注
关注
5文章
283浏览量
14791
原文标题:STM32中断没有子优先级?
文章出处:【微信号:strongerHuang,微信公众号:strongerHuang】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论