最近运用STM32时期望将systick的中止优先级下降,可是CMSIS里给出的比如都是相似
[plain] view plaincopy
仍是没有装备systick。
后来阅览CM3的技能参考手册,讲解了NVIC的装备。
中止分为内核中止和芯片的中止,装备的寄存器方位不同。芯片的中止装备在NVIC的IP内,内核的中止装备在SCB内。
能够直接调用core_cm3.h里的函数
[cpp] view plaincopy
这个函数完成了两类中止优先级的装备。
可是直观上来看看不到抢先式优先级与子优先级。
首要,装备优先级组,能够运用固件库的程序,也能够用core_cm3.h的函数。
[cpp] view plaincopy
或
[cpp] view plaincopy
- static
__INLINE void NVIC_SetPriorityGrouping(uint32_t PriorityGroup) - {
uint32_t reg_value; uint32_t PriorityGroupTmp = (PriorityGroup & 0x07); reg_value = SCB->AIRCR; reg_value &= ~(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk); reg_value = (reg_value | (0x5FA << SCB_AIRCR_VECTKEY_Pos) | (PriorityGroupTmp << 8)); SCB->AIRCR = reg_value; - }
参数规模为0~7,详细如下
随后装备各个中止的优先级,关于外设的中止能够运用固件库的程序,比较直观。如最前面所给出的比如,可是依据其完成,是不能够用来装备内核中止的,例如
[cpp] view plaincopy
这是过错的,由于内部运用IRQn寻址,而SysTick_IRQn为-1.
所以关于Sysick运用core_cm3.h的函数
[cpp] view plaincopy
- NVIC_SetPriority(SysTick_IRQn,
4);
这时不能显式的看出抢先式优先级与子优先级,写入的优先级需求依据优先级组的装备来挑选。
[cpp] view plaincopy
- NVIC_SetPriority(SysTick_IRQn,
n); - n=0x00~0x03
设置Systick为抢占优先级0 - n=0x04~0x07
设置Systick为抢占优先级1 - n=0x08~0x0B
设置Systick为抢占优先级2 - n=0x0C~0x0F
设置Systick为抢占优先级3
NV%&&&&&%_SetPriority函数指定中止优先级的寄存器位(STM32只用4位来表明优先级)的数据,例如中止优先级组设置为了2,即高2位用于指定抢占式优先级,低2位用于指定呼应优先级,0x00~0x03高2位为0,所以抢占优先级为0;0x04~0x07高2位为1,所以抢占优先级为1,以此类推。