未配置时STM32 WWDG中断触发

get*_*ter 16 embedded arm gnu cortex-m3 stm32

由于许可证问题,我有一个应用程序,我从Keil IDE移植到使用GNU工具链构建.我已经成功地能够在设备上设置,构建,刷新和运行应用程序.

GNU端的应用程序由于某种原因被卡在WWDG的弱链接IRQ处理程序中,这是一个无限循环.应用程序未启用WWDG,默认情况下在重置时禁用.我还验证了配置寄存器的默认启动值.

除编译器之外,唯一的区别是链接器和启动文件.但是,两个工具链使用的启动文件和链接器文件都是STM生成的默认值.

知道可能导致这种情况的原因吗?我在这里结束了我的智慧.

使用stm32f103XX,让我知道是否有任何其他信息会有所帮助.

编辑:使用下面的评论,我能够确定它实际上是正在被触发的HardFault_Handler.如果可能有帮助,我已经在下面包含了回溯输出

GDB BT:

0 HardFault_Handler()

1(信号处理程序调用)

2 0x720a3de在?? ()

3 foo(0x80005534)

Backtrace已停止:前一帧与此帧相同(损坏的堆栈?)

2件事对我来说很突出,虽然我没有gdb专家.1)foo不是一个函数,它是一个const数组的字符和2)0x0720a3de不是一个有效的内存地址,闪存地址范围从0x08000000开始

get*_*ter 11

所以感谢D Krueger穿着裤子.我能够发现HardFault_Handler实际上是被调用的.因此,任何偶然发现这篇文章的人,通过编写临时函数来覆盖可能的罪魁祸首即HardFault来验证哪个IRQ真正被调用.IRQ调用的真正问题是memcpy的内存访问错误,我正在寻找下一步解决的问题.

  • 最后的罪魁祸首是我未能与正在编译的正确选项联系起来.我忘了链接-mthumb和-mcpu = cortex-m3选项.所以我用不正确的c库链接. (3认同)

小智 6

由于与awilhite相同的根本原因,我遇到了这个问题。我正在使用 Atollic TrueStudio 8.0.0。我用它来为 STM32F030 启动一个项目,并(可能手动)添加了带有 stm32f0xx.h 的库文件夹,它定义了 ADC1_IRQn(NVIC 设置中使用的 IRQ 通道号)。

我在我的 main.c 中实现了 ADC1_IRQHandler(void)(因为我已经习惯了,到目前为止它一直有效——x_IRQn -> x_IRQHandler)

但是经过 2 天的挫折后,我发现我的项目中的 startup_stm32f0xx.s 定义了 ADC1_COMP_IRQHandler。

所以,最终,我的 ADC 中断处理程序是未定义的,当 ADC 产生中断时,程序崩溃(WWDG 中断)。

我希望这对像我这样的人有所帮助,他们认为他们确实实施了他们的处理程序,但实际上他们没有。


小智 5

将STM32F3发现板的示例移植到带有STM32Cube F3库(v1.1.0)的CooCox CoIDE 1.7.7中时,我遇到了与OP完全相同的错误(明显的WWDG中断,但实际上是HardFault_Handler触发)。只要我不尝试使用任何中断,代码就可以正常运行,但是一旦我打开SysTick计时器中断,HardFault异常就会跳闸。

问题是我忽略了在项目中包含stm32f3xx_it.h和stm32f3xx_it.c文件。他们的缺席并没有引起任何编译器警告/错误。编译并链接它们后,带有中断的代码运行良好。


awi*_*ite 5

在合并由 STM32CubeMX 为 STM32F2XX 处理器单独生成的两个项目时,我遇到了非常类似的问题。一个项目使用以太网外设,而另一个项目则没有。除了这一差异之外,这两个项目还使用相同的一组外围设备。

通过手动复制文件将两个项目集成在一起后,应用程序将在启动第一个任务(第一次启用中断时)后进入 WWDG_IRQHandler。我首先确认WWDG寄存器的WDGA位确实没有被设置,因此WWDG外设被禁用。接下来,我验证了中断向量表是否已正确初始化。最后,经过几个小时的挖掘,我意识到我没有在 stm32f2xx_it.c 中定义 ETH_IRQHandler 函数,这导致以太网中断由默认处理程序处理,将自身伪装为 WWDG_IRQHandler - 可能是由于优化。