Arm 未配置时STM32 WWDG中断触发

Arm 未配置时STM32 WWDG中断触发,arm,embedded,gnu,stm32,cortex-m3,Arm,Embedded,Gnu,Stm32,Cortex M3,由于许可证问题,我从KeilIDE移植了一个应用程序,以使用GNU工具链进行构建。我已成功地在设备上设置、构建、闪存和运行应用程序 GNU端的应用程序由于某种原因被困在WWDG的弱链接IRQ处理程序中,这是一个无限循环。应用程序不启用WWDG,默认情况下在重置时禁用。我还验证了配置寄存器是否处于默认启动值 除了编译器之外,唯一的区别是链接器和启动文件。但是,两个工具链使用的启动文件和链接器文件都是STM生成的默认文件 你知道这是什么原因吗?我在这里快不知所措了 使用stm32f103XX,让我知

由于许可证问题,我从KeilIDE移植了一个应用程序,以使用GNU工具链进行构建。我已成功地在设备上设置、构建、闪存和运行应用程序

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

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

你知道这是什么原因吗?我在这里快不知所措了

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

编辑: 使用下面的注释,我能够确定它实际上是被触发的HardFault_处理程序。 如果可能有帮助的话,我已经在下面包含了回溯输出

GDB BT:

0硬故障\u处理程序()

1(调用信号处理程序)

2 0x720a3de英寸??()

3 0x80005534英寸的foo()

反向跟踪停止:上一帧与此帧相同(堆栈损坏?)


虽然我不是gdb专家,但有两件事对我来说很突出。1) foo不是一个函数,它是一个字符的常量数组,2)0x0720a3de不是一个有效的内存地址闪存地址范围从0x08000000开始,所以多亏了D Krueger的“踢裤子”。我能够弄清楚HardFault_处理程序实际上被称为什么。因此,任何一个偶然发现这篇文章的人,通过编写临时函数来覆盖可能的罪魁祸首,即HardFault,来验证哪个IRQ是真正被调用的。IRQ调用的真正问题是MeMyPy的内存访问不足,这是我在路上解决下一个问题。

< P>我在与STM32 F3发现板一起移植一个例子时,与OP(表观WWDG中断,但实际上是HealFruttHuffer-Tunle射击)完全相同,用TM32 Cube F3库(V1.1.0)编译在COOCox COID1.7.7中。只要我没有尝试使用任何中断,代码就可以正常运行,但只要我打开SysTick定时器中断,硬故障异常就会触发


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

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


在通过手动复制文件将两个项目集成在一起之后,应用程序将在启动第一个任务后(当第一次启用中断时)在WWDG_IRQHandler中结束。我首先确认WWDG寄存器的WDGA位确实未设置,因此WWDG外围设备已禁用。接下来,我验证了中断向量表是否正确初始化。最后,经过几个小时的挖掘,我意识到我没有在stm32f2x_it.c中定义ETH_IRQHandler函数,这导致以太网中断由默认处理程序处理,将自身屏蔽为WWDG_IRQHandler——可能是由于优化。我遇到这个问题的根本原因与。我正在使用Atolic TrueStudio 8.0.0。我用它为STM32F030启动了一个项目,并(可能是手动)用stm32f0xx.h添加了libraries文件夹,该文件夹定义了ADC1_IRQn(NVIC设置中使用的IRQ通道号)

我在main.c中实现了ADC1_IRQHandler(void)(正如我习惯的那样,到目前为止它一直工作--x_IRQn->x_IRQHandler)

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

因此,最终,我的ADC中断处理程序未定义,当ADC生成中断时,程序崩溃(WWDG中断)


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

我将进一步阐述是什么导致我出现在这里,以及我如何使用来自的见解来纠正它

我有一个项目在EclipseSW4STM32中的一个演示项目上运行得很好,但是源代码和标题分散在各个地方,所以我希望有一个更“紧凑”的项目,更易于定制,并用作小修改的基础(在Git中也更易于遵循)

我创建了一个针对同一个板的空AC6项目。它生成了HAL驱动程序、
startup_stm32.s
LinkerScript.ld
。然后,我将原始项目中的所有
.c
和相应的
.h
复制到我的新项目中(这本身就是一个难题,因为它们分散在BSP、CMSI、组件、中间件等目录中)。在我开始修改之前,所有的东西都编译好了,似乎都能正常工作

在调试器中,似乎所有函数调用都在工作,直到
while(1)
主循环结束,我在
启动stm32.s
中定义的
默认\u处理程序中结束,似乎来自
WWDG\u IRQHandler
。事实上,这是非用户定义处理程序的默认IRQ处理程序(
WWDG_IRQHandler
是第一个声明的处理程序,gdb报告了它,如@D Krüger所示)

我开始研究编译器和链接器选项或链接器脚本,但运气不太好,直到我意识到我唯一没有检查的文件是
startup_stm32.s
,这确实不同

我盲目地复制粘贴了它,瞧

我可以给出的解释是,当中断o时,STM32正在调用
启动中定义的IRQ处理程序
extern "C"
{
    void TIM7_IRQHandler(void);
}
(gdb) c
+c
Continuing.

Program received signal SIGINT, Interrupt.
WWDG_IRQHandler () at ...startup_stm32f40_41xxx.s:121

(gdb) bt
#0  WWDG_IRQHandler () at ...startup_stm32f40_41xxx.s:12
#1  <signal handler called>
#2  RTOS_SysTick_Handler () at ...osKernel.s:18
#3  <signal handler called>
#4  0x0800021a in task0 () at ...main.cpp:10
#5  0x08000214 in frame_dummy ()
#6  0x00000000 in ?? ()