STM32学习之路-AIRCR寄存器PRIGROUP位的配置

AIRCR是NIVC配置中一个关键的寄存器.而PRIGROUP又是AIRCR中关键的位

让我们看看CM3技术手册中该为是怎么配置的

STM32学习之路-AIRCR寄存器PRIGROUP位的配置_第1张图片

上面说得很清楚,PRIGROUP的值是代表一个从LSB左边开始的小数值.怎么理解呢?看看下面

CM3使用8bit位来设置这里, 也就是说从0-7位.在寄存器中是这样的

|7| 6| 5| 4| 3| 2 |1| 0|

当PRIGROUT[10:8]的值为111时,即为7时,就是说7位(第8位)为有效位的开始位,用数值代表就像这样 0.76543210

110(6)时,就是7.6543210 依次类推

而STM32原理和它一样,不过只是用了4bit来表示,看看下图

STM32学习之路-AIRCR寄存器PRIGROUP位的配置_第2张图片

好,那现在来说说为什么要这样搞.

让我们时光倒流一下,谈谈中断优先级的问题,请看图

STM32学习之路-AIRCR寄存器PRIGROUP位的配置_第3张图片

可以看到优先组别总用有5组, 0-4,分为占先式优先级和副优先级,为什么要搞成这样,原因在下面:

因为STM32有很多中断,要处理这些中断的时候总是需要先后顺序的,所以来给他们给级别了!

怎么设置组号呢?

在misc.h可以看到这些宏的定义

#define NVIC_PriorityGroup_0         ((uint32_t)0x700) /*!< 0 bits for pre-emption priority

                                                            4 bits for subpriority */
#define NVIC_PriorityGroup_1         ((uint32_t)0x600) /*!< 1 bits for pre-emption priority
                                                            3 bits for subpriority */
#define NVIC_PriorityGroup_2         ((uint32_t)0x500) /*!< 2 bits for pre-emption priority
                                                            2 bits for subpriority */
#define NVIC_PriorityGroup_3         ((uint32_t)0x400) /*!< 3 bits for pre-emption priority
                                                            1 bits for subpriority */
#define NVIC_PriorityGroup_4         ((uint32_t)0x300) /*!< 4 bits for pre-emption priority
                                                            0 bits for subpriority */

在看看,它的值是0x700, 在看看 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);这个函数,这就是配置AIRCR寄存器的函数

再看看它的内容

void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)
{
  /* Check the parameters */
  assert_param(IS_NVIC_PRIORITY_GROUP(NVIC_PriorityGroup));
  
  /* Set the PRIGROUP[10:8] bits according to NVIC_PriorityGroup value */
  SCB->AIRCR = AIRCR_VECTKEY_MASK | NVIC_PriorityGroup;
}

OK, AIRCR_VECTKEY的值为 #define AIRCR_VECTKEY_MASK    ((uint32_t)0x05FA0000)

再来看看这小坏蛋为什么要这样设置:

STM32学习之路-AIRCR寄存器PRIGROUP位的配置_第4张图片

看到了吧31:16位要写0X05FA,然后与上0X700那就设置了[10:8]这里为111.再想想上面分析的,0组就是这么实现的呀!

已经晚了,今天就记录这么多吧.. 见下一篇.

你可能感兴趣的:(STM32学习之路)