Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
STM32F4错误处理程序和允许的操作_Stm32 - Fatal编程技术网

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

STM32F4错误处理程序和允许的操作,stm32,Stm32,摘要:在硬故障中,哪里可以输出调试信息 通过SPI的EEPROM UART USB 详情: 我的问题是错误处理程序每隔一段时间被触发一次,不可复制。我怀疑这是一个硬故障,因为错误是_Handler(),我确实向USB端口打印了一些东西,但没有收到任何东西 公开硬故障信息的标准方法是将printf打印到调试端口。但由于这种情况发生在移动设备上,而且仅在几个小时内发生一次,所以我不能一直连接调试器。 我假设在硬故障中只能做这么多,例如USB不再工作,UART不工作,通过SPI写入EEPROM也不

摘要:在硬故障中,哪里可以输出调试信息

  • 通过SPI的EEPROM
  • UART
  • USB
详情:

我的问题是错误处理程序每隔一段时间被触发一次,不可复制。我怀疑这是一个硬故障,因为错误是_Handler(),我确实向USB端口打印了一些东西,但没有收到任何东西

公开硬故障信息的标准方法是将printf打印到调试端口。但由于这种情况发生在移动设备上,而且仅在几个小时内发生一次,所以我不能一直连接调试器。
我假设在硬故障中只能做这么多,例如USB不再工作,UART不工作,通过SPI写入EEPROM也不工作。对吗?如果是,您会怎么做?

硬故障处理程序正在执行代码,您可以在那里随心所欲地执行,但请注意,在那里出现了一些问题。如果您使用的是USB,则可能是堆栈处于错误状态,因此,您可能需要完全重新初始化它和外围设备。您可能已溢出堆栈,因此可以对其进行消毒

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


如果你不能让它们运行,一个解决方案是在你的链接器脚本中定义一个在重置时未初始化的内存块,存储你在那里的任何相关信息,重置,然后在主代码中重置,检查内存区域并输出你希望通过的任何介质存储的任何内容。如果数据不多,并且您还没有使用它们,STM32中的RTC外围设备有一些寄存器,可以自由用于任意数据,并且不受重置的影响。

硬故障处理程序正在执行代码,您可以在那里随心所欲地执行,但请注意,在那里出现了一些错误。如果您使用的是USB,则可能是堆栈处于错误状态,因此,您可能需要完全重新初始化它和外围设备。您可能已溢出堆栈,因此可以对其进行消毒

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


如果你不能让它们运行,一个解决方案是在你的链接器脚本中定义一个在重置时未初始化的内存块,存储你在那里的任何相关信息,重置,然后在主代码中重置,检查内存区域并输出你希望通过的任何介质存储的任何内容。如果数据不多,并且您还没有使用它们,STM32中的RTC外围设备有一些寄存器可以自由用于任意数据,并且不受重置的影响。

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

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

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

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