STM32F4错误处理程序和允许的操作

时间:2018-02-26 08:14:22

标签: stm32

总结:在硬故障中,我可以在哪里发出调试信息?

  • 通过SPI的EEPROM?
  • UART?
  • USB?

详细信息:

我遇到的问题是错误处理程序会被触发一次,而不是可重现的。我怀疑这是一个很难的错误,就像Error_Handler()我打印到USB端口但没有收到任何东西。

公开硬故障信息的标准方法是printf到调试端口。但是,由于这种情况发生在移动设备上,并且只在几小时内发生一次,我无法一直连接调试器。 我认为在一个硬故障中只能做很多事情,例如USB不再工作,UART不工作,也不通过SPI写入EEPROM。那是对的吗?如果是的话,你会做什么?

2 个答案:

答案 0 :(得分:3)

hardfault处理程序正在执行代码,你可以按照自己的意愿执行代码,但要注意,因为你在那里出了点问题。如果您使用USB,可能是您的堆栈处于错误状态,因此,您可能需要完全重新初始化它和外围设备。您可能已经溢出了堆栈,因此可以对其进行消毒。

没有什么可以阻止您在异常处理程序中运行复杂的代码。但是,处理程序具有-1的固定优先级,因此您无法为任何中断提供服务,因为它们不会中断异常处理程序。这可能是外围设备无法工作的原因,请尝试轮询它们。

如果你无法解决问题的解决方案是在链接器脚本中定义一块内存块,该内存块在重置时未初始化,存储您在那里的任何相关信息,重置,并在主代码中重置检查存储区域并输出您希望存储的任何介质。如果它没有太多数据并且你还没有使用它们,STM32中的RTC外设有一些寄存器可以随意用于任意数据,并且不受复位的影响。 / p>

答案 1 :(得分:1)

您当然应该假设系统内存和外围设备处于不可预测的状态,并重新初始化将在处理程序中使用的所有内容。

  • 堆栈可能已损坏,或堆栈指针无效。保存所有寄存器并将堆栈重新定位到内部SRAM中的已知安全位置,这是故障处理程序中的第一件事,而不调用任何函数。更好地在装配中实施。
  • 宠爱看门狗。
  • 使用RCC复位寄存器复位所有内部外设。
  • 将内部时钟设置为已知的安全频率。
  • 如果适用,重置外围设备和总线,例如如果外部存储器有复位线,则将其脉冲。如果您要写入I 2 C EEPROM,请将SCL脉冲10次以重置总线。
  • printf()stdio基础设施有太多内部状态,例如输出缓冲区和工作区分配有malloc(),因此最好不要使用它们,而是简单的输出函数用于文本和十六进制数字。
相关问题