【发布时间】:2022-05-24 05:33:39
【问题描述】:
我想找出我在项目中看到的神秘微控制器重置的原因。我使用的微控制器是带有 STM32F3xx 驱动程序库的 STM32F3 设备。
我的设置还包括一个 J-link Ultra+ 调试器,但令人沮丧的是,我还没有弄清楚如何重现重置。它们几乎总是在设备运行 12 小时以上后发生,并且在连接到设计用于与调试器接口的编程夹具上时似乎不会发生。
我相信当重置发生时,会调用 HardFault 处理程序。我有许多这样的设备,鉴于我无法将它们全部连接到调试器并且重置发生在不合时宜的时间,我希望能够通过 HardFault 处理程序的串行线路发送一些信息。然后,外部设备将观察串行线路。
更复杂的事情是缺少未使用的 UART 引脚。我试图通过在硬故障处理程序中打开和关闭 GPIO 来创建一个穷人的 UART,两者之间有延迟。首先,我只想弄清楚如何以 50% 的占空比打开和关闭这个 LED。我的代码目前看起来像这样:
/**
* @brief This function handles Hard fault interrupt.
*/
void HardFault_Handler(void)
{
/* USER CODE BEGIN HardFault_IRQn 0 */
GPIO_InitTypeDef GPIO_InitStruct = {LED_Pin, GPIO_MODE_OUTPUT_PP,
GPIO_NOPULL, GPIO_SPEED_FREQ_LOW, 0};
HAL_GPIO_Init(LED_Port, &GPIO_InitStruct);
/* USER CODE END HardFault_IRQn 0 */
while (1)
{
/* USER CODE BEGIN W1_HardFault_IRQn 0 */
HAL_GPIO_WritePin(LED_Port, LED_Pin, GPIO_PIN_RESET);
HAL_Delay(10);
HAL_GPIO_WritePin(LED_Port, LED_Pin, GPIO_PIN_SET);
HAL_Delay(10);
/* USER CODE END W1_HardFault_IRQn 0 */
}
}
我正在通过触发除零重置来对此进行测试。我已经禁用了所有看门狗,但我发现当进入这个 while 循环时,它不会永远等待,实际上设备在第一次遇到 HAL_Delay() 命令时会重新启动。
问题:
- 在达到 HAL_Delay() 时可能导致重置的原因是什么?
- 我能否在 HardFault 处理程序中无限期地执行指令,或者在重置发生之前我必须做的事情的时间是否有限?
- 我可以在硬故障处理程序中使用计时器吗?
非常感谢您的帮助。
【问题讨论】:
-
未复位,检查复位原因。在 HardFault_Handler 内部,检查 sp。这样您就可以缩小问题范围并排除经典的堆栈溢出。