stm32 设置systick中断抢先式优先级

本文详细介绍了STM32微控制器中NVIC中断优先级的配置方法,包括优先级分组、抢占优先级和子优先级的概念及其实际应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://blog.youkuaiyun.com/sunjiajiang/article/details/7741715

每个中断都可以配置自己的优先级
但是NVIC本身又比较复杂。首先要将优先级分组(整个芯片的优先级系统分组),可以分成4组

#define NVIC_PriorityGroup_0         ((uint32_t)0x7) /*!< 0 bits for pre-emption priority   4 bits for subpriority */                                               
#define NVIC_PriorityGroup_1         ((uint32_t)0x6) /*!< 1 bits for pre-emption priority   3 bits for subpriority */                                                  
#define NVIC_PriorityGroup_2         ((uint32_t)0x5) /*!< 2 bits for pre-emption priority   2 bits for subpriority */                                                   
#define NVIC_PriorityGroup_3         ((uint32_t)0x4) /*!< 3 bits for pre-emption priority   1 bits for subpriority */                                                   
#define NVIC_PriorityGroup_4         ((uint32_t)0x3) /*!< 4 bits for pre-emption priority   0 bits for subpriority */

首先解释2个名词:
pre-emption priority 将占优先级: 比子优先级高端。。 也就是说,抢占优先级高的(0比1高,越小越高) 可以打断正在执行的低抢占优先级中断。

subpriority 子优先级。 只有2个中断具有相同的抢占优先级的情况下,才有意义。这种情况下,同时2个中断发生时,子优先级高的先发生。

说白了就是,我抢占优先级高的,我就是霸权~ 比我抢占优先级低的,你们子优先级是多少也没用。我一律最优先。但是和我同属一个抢占优先级的中断我就搞不定了,那就看我们谁子优先级高谁先发生吧。。。

例子: 
printf("NVIC Test\r\n");
uint32_t PreemptPriority, SubPriority;
NVIC_SetPriorityGrouping(NVIC_PriorityGroup_2);
printf("SystemPrioirityGroup:%d\r\n",   NVIC_GetPriorityGrouping());  
NVIC_SetPriority(PORTA_IRQn,NVIC_EncodePriority(NVIC_GetPriorityGrouping(), 2, 1));
NVIC_SetPriority(PORTB_IRQn,NVIC_EncodePriority(NVIC_GetPriorityGrouping(), 2, 2));

首先将系统NVIC分组设置为2. 即有2位抢占,2位子优先级。这“2位”的意思就是 2个二进制数,可以代表 0,1,2,3 对吧? 所以抢占可以配成0,1,2,3四个等级,子优先也可以配成0,1,2,3 四个等级。

NVIC_SetPriority(PORTA_IRQn,NVIC_EncodePriority(NVIC_GetPriorityGrouping(), 2, 1));

这句啥意思呢, NVIC_SetPriority 和 NVIC_EncodePriority 都是ARM系统库函数,EncodePrioirity 需要3个参数,原型如下

uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority)

第一个参数,中断分组,直接用NVIC_GetPriorityGrouping() 获得即可,其实就是2.
PreemptPriority,SubPriority 我就不用说了吧, 他们每个的取值范围都是0-3 这里 PreemptPriority = 2; SubPriority = 1;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值