STM32中断没有子优先级?

关注+星标公众,不错过精彩内容

39ab57676d1b8bee2e2fba0ab8cd818e.gif

作者 | strongerHuang

微信公众号 | strongerHuang

看到一个交流群在讨论关于【关于STM32中断优先级的话题】,其中就有小伙伴提到:为什么有些STM32中断没有【子优先级】?

比如,有时候你在使用STM32CubeMX配置时,你会发现只有Preemption Priority【抢占优先级】,而没有Sub Priority【次优先级】:

6c928041472ab3dda26c53ec450cfcf3.png

然而,有时候你会发现又有Sub Priority【次优先级】:

3cc948eaf2d30b9d3e1c740d87a35a48.png

这个问题就牵涉到STM32,准确的来说的是 Cortex-M NVIC 嵌套向量中断控制器的问题。

下面就展开来说说关于ARM单片机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有分组功能。

731dcf6df35015caf122b68bf401f623.jpeg

所以,你在使用STM32CubeMX配置时,M0/M0+内核的STM32是没有【次优先级】那个选项的。

Cortex-M0包含STM32F0、L0、G0等处理器。

对底层感兴趣的朋友可以继续往下看。

NVIC寄存器

NVIC寄存器,需查看对应的内核(Cortex-M)手册,在ARM官网能找到(

M3也有对应的中文翻译版,大家可以自己网上搜索)。

内核中的寄存器和我们STM32参考手册中寄存器一样,不同的Bit位代表含义不同。

但是,对于NVIC来说,由于包含众多优先级相关配置,寄存器数量相对较多(NVIC寄存器族)。

b5722cbe6f81021fe5aa1cec17f1c754.jpeg

拿M3来说,优先级分组的配置,位于NVIC的AIRCR应用程序中断及复位控制寄存器中:

54ca57b7ced751113c0610696a9d8747.jpeg

这里推荐阅读之前我写过的一篇文章:Cortex-M中断在RTOS中的应用及注意事项

中断入口

额外提下一个小伙伴问的问题:为什么外部中断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不同通道捕获中断等。

------------ END ------------

bb297eedbdba7b586a4f94737b9052f7.gif

●专栏《嵌入式工具

●专栏《嵌入式开发》

●专栏《Keil教程》

●嵌入式专栏精选教程

关注公众号回复“加群”按规则加入技术交流群,回复“1024”查看更多内容。

3b741c064d521bc670b266b9ab5ae034.jpeg

41df52174a80012db17c427971f67f8a.png

点击“阅读原文”查看更多分享。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值