首先是两个定义:
在Cortex-M编程手册中,Exception是破坏正常程序流的任何东西,并从向量表调用处理程序,而Interrupts是Exceptions的子集,来自ARM核心之外的外设。因为SysTick是在Cortex-M内核中实现的,所以它被认为是异常,但不是中断。
异常具有异常编号,从0开始。中断具有IRQ编号,从0开始。因为所有中断都是异常,所以它们都获得异常编号,比IRQ编号高16。非中断的异常(包括SysTick)在0-15范围内具有异常编号,小于中断的异常编号。有点令人困惑的是,非中断的异常也有IRQ号,这可以延伸到-16到-1的范围内。SysTick的例外编号为15,IRQ编号为-1。
除Reset,NMI和Hardfault之外的所有异常都具有可配置的优先级。它只是为中断和其他异常配置不同。请参阅CMSIS实施作为一个明显的例子:
- __STATIC_INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)
- {
- if ((int32_t)(IRQn) < 0)
- {
- SCB->SHP[(((uint32_t)(int32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL);
- }
- else
- {
- NVIC->IP[((uint32_t)(int32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL);
- }
- }
您可以直接调用NVIC_SetPriority或操作SCB->SHP以使SysTick的优先级低于任何其他中断。
SysTick确实具有高于任何中断的默认优先级,但这仅仅是因为在复位时,所有优先级都设置为0,并且在平局的情况下,较低的IRQ编号获胜,在这种情况下,SysTick为-1。
首先是两个定义:
在Cortex-M编程手册中,Exception是破坏正常程序流的任何东西,并从向量表调用处理程序,而Interrupts是Exceptions的子集,来自ARM核心之外的外设。因为SysTick是在Cortex-M内核中实现的,所以它被认为是异常,但不是中断。
异常具有异常编号,从0开始。中断具有IRQ编号,从0开始。因为所有中断都是异常,所以它们都获得异常编号,比IRQ编号高16。非中断的异常(包括SysTick)在0-15范围内具有异常编号,小于中断的异常编号。有点令人困惑的是,非中断的异常也有IRQ号,这可以延伸到-16到-1的范围内。SysTick的例外编号为15,IRQ编号为-1。
除Reset,NMI和Hardfault之外的所有异常都具有可配置的优先级。它只是为中断和其他异常配置不同。请参阅CMSIS实施作为一个明显的例子:
- __STATIC_INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)
- {
- if ((int32_t)(IRQn) < 0)
- {
- SCB->SHP[(((uint32_t)(int32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL);
- }
- else
- {
- NVIC->IP[((uint32_t)(int32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL);
- }
- }
您可以直接调用NVIC_SetPriority或操作SCB->SHP以使SysTick的优先级低于任何其他中断。
SysTick确实具有高于任何中断的默认优先级,但这仅仅是因为在复位时,所有优先级都设置为0,并且在平局的情况下,较低的IRQ编号获胜,在这种情况下,SysTick为-1。
举报