__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)
{
//当外设号大于0时设置外设中断优先级
//原理为priority << (8U - __NVIC_PRIO_BITS左移, __NVIC_PRIO_BITS在F103系列中为4,因为在优先
级寄存器中(Interrupt priority registers (NVIC_IPRx))只有高四位有用,故需要将设定优先级
priority的值左移四位;
if ((int32_t)(IRQn) >= 0)
{
NVIC->IP[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL);
}
//当IRQn号小于0时执行下方指令
else
{
SCB->SHP[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL);
}
}
本文主要说明IRQn小于0时,代码运行原理:
MemoryManagement_IRQn = -12, /*!< 4 Cortex-M3 Memory Management Interrupt */
BusFault_IRQn = -11, /*!< 5 Cortex-M3 Bus Fault Interrupt */
Usage