Cortex-M3 NVIC_EnableIRQ(Systick_IRQn) 导致硬故障异常

Cortex-M3 NVIC_EnableIRQ(Systick_IRQn) causes hard fault exception

我正在使用 NXP 的 Cortex-M3 LPC1548 和 uVision IDE。

main()函数中,如果我使用:

SysTick_Config(SystemCoreClock * SYSTICK_INT_FREQ); 
NVIC_EnableIRQ(SysTick_IRQn);  // <--- HardFault happens in this line.

我每次都遇到 HardFault 异常。

但是,如果我像这样删除 NVIC_EnableIRQ(...)

SysTick_Config(SystemCoreClock * SYSTICK_INT_FREQ); 

代码运行良好。

有谁知道为什么启用 Systick 中断会导致 HardFault?

我以前在 Cortex-M0 上做过这个,从来没有遇到过问题。

Systick_IRQn 是一个负值,你不能在 Systick 中使用 NVIC_EnableIRQ()。越界寄存器访问可能导致您的硬故障。

一旦 Systick->CTRL 中的相应位被设置,系统中断就会被启用。

但是,NVIC_SetPriority() 支持 Systick_IRQnPendSV_IRQn

这里需要非常明确的是,NVIC_EnableIRQ()只能用于enable/disable 异常数大于16的情况。

编号大于 16 的异常称为中断输入,而小于 16 的异常称为系统异常

这意味着下面列出的系统异常(Cortex-M3 的示例)不能与 NVIC_EnableIRQn():

一起使用
  • 1 重置
  • 2.NMU
  • 3.HardFault
  • 4.MemManage故障
  • 5.Bus故障
  • 6.Usage故障
  • 7-10。保留
  • 11 个 SVC
  • 12 调试监视器
  • 13 保留
  • 14 个 PendSV
  • 15 个系统

因此,永远不应使用 NVIC_EnableIRQ 激活 Systick 中断,因为它是系统异常。如果使用 CMSIS 函数 SysTick_Config() 则不需要激活中断,因为该函数负责激活 Systick 中断。

P.S. 信息取自 Joseph Yiu 的优秀书籍《ARM Cortex-M3 和 Cortex-M4 处理器权威指南》,并通过分析函数NVIC_EnableIRQ().