大家好,又见面了,我是你们的朋友全栈君。
NVIC终端优先级分组(Nest Vector Interrupt Control 嵌套式向量中断控制器)
CM4内核支持256个中断,其中包含了16个内核中断和240个外部中断,并且具有256级的可编程中断设置。STM32F4只是使用了其中的一部分。
STM32F40xx/STM32F41xx的92个中断里面,包括10个内核中断,82个可屏蔽中断(常用)
“` 分组寄存器SCB->AIRCR [10:8] , IP bit[7:4]分配情况 AIRCR————–应用程序中断控制寄存器 “`
一般情况下,代码在执行过程中,只设置一次中断优先级分组,比如分组2,设置好之后一般不会再改变分组,随意改变分组会导致中断混乱,程序出现意想不到的事情
中断优先级分组函数
“` void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);
单个中断的抢占优先级和响应优先级的设置
中断优先级控制寄存器组:IP[240] (Interrupt Priority Registers)
240个8位寄存器,每个中断只能使用一个寄存器来确定优先级。
STM32F40x系列一共82个可屏蔽中断,使用IP[81]-IP[0]
NVIC_Init();设置每个中断的抢占优先级和响应优先级
中断使能寄存器:ISER[8];32位
中断失能寄存器组:ICER[8];32位
中断挂起控制寄存器组 :IPCR[8];
中断解挂控制寄存器 : ICPR[8];
中断激活标志位寄存器:IABR[8]; 作用,了解当前正在执行的中断是哪一个。如果对应位为1则正在执行。
static __INLINE uint32_t NVIC_GetActive(IRQn_Type IRQn)
中断优先级设置步骤
系统运行后先设置中断优先级分组。调用函数:
void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);//执行过程中,只设置一次中断优先级分组。
针对每个中断,设置对应的抢占优先级和响应优先级:
void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/140411.html原文链接:https://javaforall.cn