STM32中PRIGROUP值优先级分组与SysTick定时器优先级理解

一、PRIGROUP值

下图为PRIGROUP值表对应的抢占优先级和次级优先级

其对应8位优先级字段的理论表

PRIGROUP二进制二进制点位置抢占优先级位亚优先级位抢占级数亚优先级数
0 (0b000)bxxxxxxxx.y位0之后[7:1][0]1282
1 (0b001)bxxxxxxx.yy位1之后[7:2][1:0]644
2 (0b010)bxxxxxx.yyy位2之后[7:3][2:0]328
3 (0b011)bxxxxx.yyyy位3之后[7:4][3:0]1616
4 (0b100)bxxxx.yyyyy位4之后[7:5][4:0]832
5 (0b101)bxxx.yyyyyy位5之后[7:6][5:0]464
6 (0b110)bxx.yyyyyyy位6之后[7][6:0]2128
7 (0b111)b.yyyyyyyyy位7之后None[7:0]1256

     由此可知其PRIGROUP值对应的为亚优先级位数,PRIGROUP值为0时[0]代表亚优先级占据0位,而抢占优先级位数为[7:1]七位,PRIGROUP值为7时,[7:0]代表亚优先级占据八位,抢占不占位,而表右侧抢占优先级级数为1,是因为哪怕抢占优先级不占据任何一位,只是没法区分抢占优先级高低了,表示为同一级0级,所以其级数还是有1级的。

     上图为STM32里杂项里的优先级分组。在STM32中其优先级分组只取高四位,看图可知0~4(STM32中分组)对应PRIGROUP值7~3。比如说分组2,其对应的PRIGROUP值为5,代表[5:0]位为亚级优先级共计占6位,所以抢占占2位,按八位11(抢占)111111(亚级),取高四位,也就是抢占占2位,亚优先级2位,对照图中Group_2的注释和我们的分析结果是一致的。

二、SysTick定时器优先级理解

        图为滴答定时器配置调用函数,其中设置优先级关键句为NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL);先分析(1UL << __NVIC_PRIO_BITS) - 1UL。

        1UL其中1 // 数值:1; U // Unsigned:无符号; L // Long:长整型(通常32位);  // 合起来:32位无符号长整型数值1。如果1不这么写,没有后缀(默认为有符号int)可能溢出或产生负数。这个道理就像咱们平时写代码的时候,写小数后面习惯加一个f,1.0f这是因为如果单写1.0编译器默认识别为double型,如果在1.0后面加f编译器就会认为是float型。

        __NVIC_PRIO_BITS由图可知是宏定义值为4,代入进来为(1UL << 4) - 1UL,其结果为16-1=0xF。

        上图函数为优先级设置函数,分析重点为优先级写入(uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL),代入0xF为(uint8_t)((0xF<< (8U - 4)) & (uint32_t)0xFFUL),得到(uint8_t)(0xF0 & (uint32_t)0xFFUL),因为0xF传参传进来是uint32_t的类型与上(uint32_t)0xFFUL是为了保留低八位,清零剩余的所有高位,以防传进来的数据高位不干净。(uint8_t)再强转为八位,即被保留的八位。此时值为0xF0,又因为STM32优先级只看高四位,即值为1111,全1优先级,无论优先级分组选择0,1,2,3,4组其优先级都垫底,其优先级数越低,其优先级越高。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值