在NVIC中设置SysTick中断并将其用作例外有什么区别?

2019-07-14 17:20发布

我在使用STM32F303 MCU时注意到Systick可以设置为导致异常,这个情况好像在各种用户指南中经常提到。这样,它的优先级将高于常规中断。另一方面,似乎也可以将Systick设置为NVIC中的中断。它有自己的中断请求号,可以设置为挂起状态。由于NVIC中断具有可编程的优先级,我们也可以通过这种方式进行设置。我不太清楚使用SysTick这两种方法之间的区别。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
9条回答
daitz
2019-07-15 04:11
首先是两个定义:
在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实施作为一个明显的例子:
  1. __STATIC_INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)
  2. {
  3.   if ((int32_t)(IRQn) < 0)
  4.   {
  5.     SCB->SHP[(((uint32_t)(int32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL);
  6.   }
  7.   else
  8.   {
  9.     NVIC->IP[((uint32_t)(int32_t)IRQn)]               = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL);
  10.   }
  11. }
复制代码
您可以直接调用NVIC_SetPriority或操作SCB->SHP以使SysTick的优先级低于任何其他中断。

SysTick确实具有高于任何中断的默认优先级,但这仅仅是因为在复位时,所有优先级都设置为0,并且在平局的情况下,较低的IRQ编号获胜,在这种情况下,SysTick为-1。

一周热门 更多>