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

2019-07-14 17:20发布

我在使用STM32F303 MCU时注意到Systick可以设置为导致异常,这个情况好像在各种用户指南中经常提到。这样,它的优先级将高于常规中断。另一方面,似乎也可以将Systick设置为NVIC中的中断。它有自己的中断请求号,可以设置为挂起状态。由于NVIC中断具有可编程的优先级,我们也可以通过这种方式进行设置。我不太清楚使用SysTick这两种方法之间的区别。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
9条回答
daitz
2019-07-15 07:14
只有中断可以通过NVIC寄存器进行配置,SysTick不是中断。NVIC寄存器无法在位掩码或其他位置使用负IRQ编号。
SysTick确实可以设置为挂起状态,但这是通过SCB->ICSRNVIC完成的。
请注意,NVIC_SetPriority()并NVIC_GetPriority()在CMSIS具有消极IRQ号妥善处理的唯一NVIC_功能。其他函数喜欢NVIC_SetPendingIRQ()或NVIC_EnableIRQ()只是接受负IRQ数字,对它们进行一些改组,导致与NVIC寄存器的巨大偏移,并乱写一些遥远的内存地址,可能导致严重故障或其他奇怪的行为。当您USE_FULL_ASSERT在标头中启用时,HAL_NVIC_函数会执行一些边界检查,否则它们只会将无效参数传递给CMSIS NVIC函数。
有一个巧妙的技巧来找到使用负参数调用函数的所有位置。把它放到一个公共标题中:
#define NVIC_EnableIRQ(x) ((void)sizeof(char[x]))
每当使用负数调用此构造时,这是一个编译时错误。对除除 NVIC_SetPriority()和之外的每个NVIC函数重复此操作NVIC_GetPriority()。

一周热门 更多>