下冰雹 · 2021年03月03日

STM32F103芯片中断优先级以及FreeRTOS优先级设置

STM32F103芯片中断优先级设置

CM3中,优先级数值越小,优先级越高。

STM32F103只用了4个位来表达优先级,因此最多支持16级的可编程优先级(0~15),15为最低优先级。

image.png
然而这16级可编程优先级并不一定都是抢占优先级,它会被优先级组分成两类:抢占优先级和亚优先级。

NVIC中有一个寄存器是“应用程序中断及复位控制寄存器”(内容见表7.5),它里面有一个位段名为“优先级组”。该位段的值对每一个优先级可配置的异常都有影响——把其优先级分为个位段:MSB所在的位段(左边的)对应抢占优先级,而LSB所在的位段(右边的)对应亚优先级,如表1所示。

表1:抢占优先级和亚优先级的表达,位数与分组位置的关系

image.png

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:优先级组、抢占优先级值和亚优先级值的关系

image.png
代码:

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系列文章。

推荐阅读
关注数
3247
内容数
54
介绍FreeRTOS的基本功能,移植与使用。主要介绍FreeRTOS的裁剪、任务、内存管理、队列、信号量、任务通知等基本组成,看完可以会用FreeRTOS,高级篇会深入介绍FreeRTOS的实现细节、方法、技巧。
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息