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_IRQn
等 PendSV_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()
.
我正在使用 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_IRQn
等 PendSV_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()
.