为什么要把中断优先级配置为NVIC_PriorityGroup_4 STM32系列MCU是基于ARM公司Cortex-M3内核设计开发。ARM Cortex_m3 内核支持 256 个中断(16个内核+240 外部)和可编程 256 级中断优先级的设置,中断控制和中断优先级控制寄存器也都属于Cortex M3 内核的部分。
STM32在例化与设计实现中仅支持84个中断,包括16个内核中断和68个可屏蔽中断,具有16级可编程的中断优先级。
STM32支持的68个外部中断通道已经固定的分配给响应的外部通道,如(DMA,TIM等)。
每个中断通道都有自己的中断优先级控制字节PRI_n(8位,STM32中只是用高四位),每4个通道的8位中断优先级控制字PRI_n构成一个32位的优先级寄存器(Priority Register)。68个外部通道可以构成17个32位的优先级寄存器。
对于4bit的中断优先级控制位可以进行对抢占式优先级和响应式优先级(又称子优先级、亚优先级)进行分配,其中抢占式优先级在高位,响应式在低位,可以通过设置AIRCR(Application Interrupt / Reset Control Register)寄存器的[10:8]但来确认抢占式和响应式分别能在4bit的中断优先级控制位中占到几个通过分配可以有以下几种情况: view plaincopy to clipboardprint?
- #define NVIC_PriorityGroup_0 ((uint32_t)0x700) /*!< 0 bits for pre-emption priority
- 4 bits for subpriority */
- #define NVIC_PriorityGroup_1 ((uint32_t)0x600) /*!< 1 bits for pre-emption priority
- 3 bits for subpriority */
- #define NVIC_PriorityGroup_2 ((uint32_t)0x500) /*!< 2 bits for pre-emption priority
- 2 bits for subpriority */
- #define NVIC_PriorityGroup_3 ((uint32_t)0x400) /*!< 3 bits for pre-emption priority
- 1 bits for subpriority */
- #define NVIC_PriorityGroup_4 ((uint32_t)0x300) /*!< 4 bits for pre-emption priority
在新版本的stm32CubeMX软件,配置完成工程后,其自动生成的代码里,均将中断配置参考选择了NVIC_PriorityGroup_4。那么问题来了,为什么会推荐或者默认使用这个参数呢?
STM32 有 5 个分组(STM32 中定义的分组 0 对应的值是 7!)如果我们选择分组 4,即 NVIC_PriorityGroup_4 的话,那 4 位优先级就都全是抢占优先级了,没有亚优先级,那么就有 0~15 共 16 个优先级。这就是关键!全部应用了抢占式优先级。
对于中断优先级的知识分享还有好多!比如,在FreeRTOS中,抢占式优先级怎么使用?带来哪些优势?等静待版主补充吧!
P.S. 当然,论坛里面的小伙伴也欢迎来补充!
|