AIRCR是NIVC配置中一个关键的寄存器.而PRIGROUP又是AIRCR中关键的位
让我们看看CM3技术手册中该为是怎么配置的
上面说得很清楚,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来表示,看看下图
好,那现在来说说为什么要这样搞.
让我们时光倒流一下,谈谈中断优先级的问题,请看图
可以看到优先组别总用有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)
再来看看这小坏蛋为什么要这样设置:
看到了吧31:16位要写0X05FA,然后与上0X700那就设置了[10:8]这里为111.再想想上面分析的,0组就是这么实现的呀!
已经晚了,今天就记录这么多吧.. 见下一篇.
上一篇:在STM32如何在我需要的时候关闭或打开外部中断EXTI
下一篇:意法半导体在 GitHub网站上开设 STM32 Hotspot社区
推荐阅读最新更新时间:2024-11-17 15:52
设计资源 培训 开发板 精华推荐
- 【长沙理工大学】法拉电容循迹小车car_receive_1
- PM8908 单片降压转换器的典型应用
- LT3507A 演示板,具有 LDO 的三路单片式降压稳压器
- 单片机开发板扩展
- FRDM-KW019032,用于 Kinetis KW0x MCU 的 Freedom 开发板
- LD39100PUR 1A 低静态电流、低噪声稳压器的可调输出典型应用
- DEV-15165,SparkFun Qwiic MP3 触发器开发套件
- 60W、19V AC 到 DC 单路输出电源,用于适配器 AC 到 DC 电源
- 使用 Richtek Technology Corporation 的 RT8811A 的参考设计
- 【训练营】鸿蒙DOG