STM32F103芯片中断优先级设置
CM3中,优先级数值越小,优先级越高。
STM32F103只用了4个位来表达优先级,因此最多支持16级的可编程优先级(0~15),15为最低优先级。
然而这16级可编程优先级并不一定都是抢占优先级,它会被优先级组分成两类:抢占优先级和亚优先级。
NVIC中有一个寄存器是“应用程序中断及复位控制寄存器”(内容见表7.5),它里面有一个位段名为“优先级组”。该位段的值对每一个优先级可配置的异常都有影响——把其优先级分为个位段:MSB所在的位段(左边的)对应抢占优先级,而LSB所在的位段(右边的)对应亚优先级,如表1所示。
表1:抢占优先级和亚优先级的表达,位数与分组位置的关系
STM32F103只使用4个位(即bit[7:4])来表达优先级,因此它的优先级组有5个,分组位置分别是3、4、5、6、7。他们对应了可以使用的抢占优先级数目和亚优先级数目。“优先级组”位段上电默认值为0,这意味着对于STM32F103而言,上电时,16级优先级全部是可抢占优先级。
在设置抢占优先级和亚优先级的有效位数时,必须先了解以下项目:
芯片实际使用了多少位来表达优先级
优先级组是如何划分的。
对于STM32F103芯片,实际使用4位来表达优先级,而优先级组有5种选择。
使用库函数void NVIC_PriorityGroupConfig(uint32_t
NVIC_PriorityGroup)设置优先级组,参数必须是以下5个宏定义中一个:
#define NVIC_PriorityGroup_0 ((uint32_t)0x700) /*!< 0 bits 抢占优先级,4 bits 亚优先级 */
#define NVIC_PriorityGroup_1 ((uint32_t)0x600) /*!< 1 bits 抢占优先级,3 bits 亚优先级 */
#define NVIC_PriorityGroup_2 ((uint32_t)0x500) /*!< 2 bits 抢占优先级,2 bits 亚优先级 */
#define NVIC_PriorityGroup_3 ((uint32_t)0x400) /*!< 3 bits 抢占优先级,1 bits 亚优先级 */
#define NVIC_PriorityGroup_4 ((uint32_t)0x300) /*!< 4 bits 抢占优先级,0 bits 亚优先级 */
在设定好优先级组的前提下,就可以使用库函数void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct)
设置中断的优先级。
中断优先级由抢占优先级和亚优先级共同组成NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority
表示抢占优先级、NVIC_InitStruct->NVIC_IRQChannelSubPriority
表示亚优先级。
优先级组、抢占优先级值和亚优先级值的关系如表2所示:
表2:优先级组、抢占优先级值和亚优先级值的关系
代码:
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 13;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
表示设置优先级组4,表示16级优先级全部为可抢占优先级;那么在设置TIM5中断优先级时,NVIC_IRQChannelSubPriority
只能设置为0(没有亚优先级),NVIC_IRQChannelPreemptionPriority
设置为13表示使用优先级为13的可抢占优先级。
FreeRTOS优先级设置
根据FreeRTOSConfig.h
页面中对宏configKERNEL_INTERRUPT_PRIORITY configMAX_SYSCALL_INTERRUPT_PRIORITY and configMAX_API_CALL_INTERRUPT_PRIORITY
描述,STM32F103(CORTEX-M架构)即需要配置宏configKERNEL_INTERRUPT_PRIORITY
,也需要配置宏configMAX_SYSCALL_INTERRUPT_PRIORITY
。
1.configKERNEL_INTERRUPT_PRIORITY
:设置RTOS内核本身使用的中断优先级,因为RTOS内核中断不允许抢占用户使用的中断,因此这个宏一般定义为硬件最低优先级。对于STM32F103而言,定义为15。
2.configMAX_SYSCALL_INTERRUPT_PRIORITY
:用来设置可以在中断服务程序中调用中断安全的FreeRTOS API函数的最高中断优先级。优先级高于这个值的中断,不受FreeRTOS管控,FreeRTOS无权禁止这些中断,因此也不能在这些中断中调用任何FreeRTOS API函数,否则系统会有崩溃的风险(这这些中断中,进入临界区函数因优先级原因失效了)
因此,如果将此宏设置为优先级5,那么在中断中调用了FreeRTOS API的中断,其优先级小于5,比如4,则系统会有崩溃的风险;如果使能了configASSERT宏,也会触发断言失败。
推荐阅读
Cortex-M3/M4内核处理器一次中断事件可能产生两次中断问题
LwIP BUG之TCP连接丢失
作者:zhzht19861011
首发博客:https://freertos.blog.csdn.net/article/details/112767877关注FreeRTOS从基础到高级专栏,即时收取FreeRTOS系列文章。