STM32 NVIC
这个概念查了半天也没弄清楚,后来看正点原子资料里的一篇文章弄明白了。现将理解的加以纪录,以备忘。
首先说一下优先级分组 这个概念应该是直译的英文。这个词本身就不对。准确的说是组织形式。分组给人感觉同时有好多人,分成好多组,大家选一组。。实质上分组的形式。也就是怎么分,分的方式,所以你只能选一种,这并非让我们选一个分组,而是选一个分组的方法。
以嵌入式而言,这个选的过程,肯定就是一个对寄存器赋值的过程。
首先,给出CORTEX-M3权威指南里的一个图,这个图原汁原味!
这个图的意思是如果
赋值为0 则8位里面第0位是亚优先级 1~7位是抢占优先级 128级抢断式优先级 每个抢断优先级里2个平等优先级 以下类推
0 [7:1] [0:0]==> 128 2
1 [7:2] [1:0]==> 64 4
2 [7:3] [2:0]==> 32 8
3 [7:4] [3:0]==> 16 16
4 [7:5] [4:0]==> 8 32
5 [7:6] [5:0]==> 4 64
6 [7:7] [6:0]==> 2 128
7 [ ] [7:0]==> 1 256
根本不存在分组,只是要我们选哪种分组模式而已,这个词很容易让人产生误会!!!
从图里可以看出 至少有一个亚优先级,也即平等优先级,也即平等优先级至少占1位
上面是CORTEX-M3自己规定的东西,但是STM32说了,它搞不定这么复杂的东西,它说它只用4位表示优先级,不用8位
按道理说,它应该设计成如下左边这样, 实际设计成了右边这样
4 [3:0] [ ]==> 16 1
0 [3:1] [0:0]==> 8 2 3 [3:1] [0:0]==> 8 2
1 [3:2] [1:0]==> 4 4 2 [3:2] [1:0]==> 4 4
2 [3:3] [2:0]==> 2 8 1 [3:3] [2:0]==> 2 8
3 [ ] [3:0]==> 1 16 0 [ ] [3:0]==> 1 16
它打破了至少有1位平等优先级的约定,实际上这样才好,这是很可取的一点。
STM32设计成这样,它们有解释权,CORTEX-M3规定7号分组方式无抢断优先级位 6号分组方式1个抢断优先级位。
STM解释为0号分组方式无抢断优先级位 1号分组方式1个抢断优先级位。
我们再看实际情况,CORTEX-M3里面7号分组方式的时候3位全1。
对应的STM32 0号分组方式时3位全1。这中间就差了一个取反。
所以正点原子有如下代码
1 void MY_NVIC_PriorityGroupConfig( u8 NVIC_Group ) 2 { 3 u32 temp, temp1; 4 temp1 = ( ~NVIC_Group ) & 0x07; //取后三位 5 temp1 <<= 8; 6 temp = SCB->AIRCR; //读取先前的设置 7 temp &= 0X0000F8FF; //清空先前分组 8 temp |= 0X05FA0000; //写入钥匙 9 temp |= temp1; 10 SCB->AIRCR = temp; //设置分组 11 }
中间这个取反,向上STM32自圆其说,向下暗合CORTEX-M3规范。这应该也是STM32库函数里的东西,具体没看过,不作评论。
这篇文章仅为个人备忘,至少能解释的通。但错误难免。