我就喜欢用寄存器操作 , 敲代码很爽很爽~~!! 工作中为方便查阅 , 把各个外设整理成了表格 .
- 寄存器完整Excel : STM32F429之寄存器表
- 寄存器工程模板 : 完整工作模板
- 10.1寸_真实工作代码 : STM32 LTDC 汉字输出
SCB
- 分组号决定: 抢占级和优先级的位数. SCB_AIRCR[10:8]的值, 决定NVIC_IP[x]高四位中, 几位抢占级,几位优先级. 低4位无效.
- 这寄存器中我们只需写入 分组号 , 0~7. 写值时,要同时写密匙.下面代码有例子,简单.
NVIC
- NVIC 芯片内处理中断优先级关系的内部小系统, 也简单,系统在内部都安排好了. 只理解3项: 向量表, 寄存器IP, 寄存器ISER
- 优先级嵌套向量表 ,名词很唬, 人话 : 主级和子级的优先关系默认排序表 , 详表: DataSheet的237页.
- NVIC_IP[x] , x : 向量表中的中断通道编号 , NVIC_IP[37]=xx; //USART1中断通道写入主级和子级优先值.
- NVIC_ISER , 通道使能, 3组32位,顺序 对应 向量表 , 每一位代表一个通道, 写入要计算好位置 .
没了 , 就这四个知识点, NVIC就是优先级分级,分主级和子级, 各种教程吹得太深而已
NVIC的寄存器表没有, 有点难查, 没整理好, 好了再补全吧
/*****************************************************************************
* @brief 中断优先级
* @note 默认设置为组2,即IP[]中,[7:6]抢占, [5:4]响应
* @arg [Channel] 中断通道预设值, 值在 stm32f4xx.h文件 86行
* @art [Preemption] 抢占级 <=3
* @arg [SUB] 响应级 <=3
* @retval None
* @data 2019-4-1
**/
void NVIC_Config(uint8_t NVIC_Channel,uint8_t Preemption,uint8_t SUB)
{
// 全局分级设置,统一为组2, 主级2位, 子级2位
SCB->AIRCR = ((u32)0x05FA0000)|(0x05<<8); // 优先级分组设置
// 通道中断优先级设置
NVIC->IP[NVIC_Channel] &= ~(0xF<<4); // 清空 ,
NVIC->IP[NVIC_Channel] = (Preemption&0x3)<<6|(SUB&0x3)<<4; // 写入抢占级\优先级
// 通道中断使能
NVIC->ISER[NVIC_Channel/32] |= 1 << (NVIC_Channel % 32); // 使能中断通道
}