嵌入式 – 如何在STM32设备中调试意外的重置?

我正在使用STM32F107芯片在C中进行一些开发,并且在某些时候,当我调用特定功能时,器件开始重置.我没有调试器,我的调试只是一个串行端口的纯文本.

我使用了一些其他的微控制器,我可以在其中访问一个寄存器来查看重置的原因,但是我似乎找不到这个设备的等价物.我知道Cortex-M3的硬件例外,但是我不知道其中一个是否被触发,因为当我处于这些处理程序中时,似乎无法发送文本(也许是因为我的TX功能使用中断?).

所以,我决定询问比这个设备更多的经验的人:调试这些情况通常会做些什么?

编辑

其中一个开发人员激活了WWDG看门狗,并且正在重置硬件,然后才能从故障处理程序中获取我的信息.由于通过指向错误位置的指针调用函数,这是一个硬故障.但是,我将会保留这个问题,希望有人会提供更多的细节(或材料),以便从保存的寄存器中指出C代码,就是说硬故障(@dwelch想法).

解决方法

Cortex M3具有出色的故障处理功能,可以使您的生活更轻松.在发生故障时,它会自动堆叠多个寄存器,如PC和LR,故障状态寄存器会告诉您总线故障的地址等.

您应该实现一个好的故障处理程序(例如,硬故障处理程序在这里:http://blog.frankvh.com/2011/12/07/cortex-m3-m4-hard-fault-handler/)打印堆栈寄存器和调试故障状态寄存器.

您应该使用UART进行打印,只需编写自己的简单的自定义版本的printf,以便您的故障处理程序使用,而不依赖于中断.直接将字节直接写入uart Tx数据寄存器并轮询字节完成.

相关文章

Java中的String是不可变对象 在面向对象及函数编程语言中,不...
String, StringBuffer 和 StringBuilder 可变性 String不可变...
序列化:把对象转换为字节序列的过程称为对象的序列化. 反序...
先说结论,是对象!可以继续往下看 数组是不是对象 什么是对...
为什么浮点数 float 或 double 运算的时候会有精度丢失的风险...
面试题引入 这里引申出一个经典问题,看下面代码 Integer a ...