【发布时间】:2019-03-09 14:36:13
【问题描述】:
我在使用这个库在 STM32F411 Discovery 上编程 LCD HD44780 时遇到问题:https://stm32f4-discovery.net/2015/07/hal-library-15-hd44780-for-stm32fxxx/ 问题是在实现库并运行代码后,我通常会卡在 HardFault_Handler 函数中。我阅读了互联网上有关调试硬故障的几篇文章,并从该站点实现了HardFault_HandlerC 函数:https://community.nxp.com/thread/389002 该程序现在卡在此函数中,这让我了解了寄存器中的内容,但现在我真的不知道我接下来应该做什么,因为这些值完全没有告诉我。
这些是提到的寄存器的值:
stacked_r0 volatile unsigned long 0
stacked_r1 volatile unsigned long 0
stacked_r2 volatile unsigned long 0
stacked_r3 volatile unsigned long 1
stacked_r12 volatile unsigned long 45000000
stacked_lr volatile unsigned long 11018266
stacked_pc volatile unsigned long 553682714
stacked_psr volatile unsigned long 8192
_CFSR volatile unsigned long 256
_HFSR volatile unsigned long 1073741824
_DFSR volatile unsigned long 11
_AFSR volatile unsigned long 0
_BFAR volatile unsigned long 3758157112
_MMAR volatile unsigned long 3758157108
谁能告诉我下一步我应该怎么做才能进一步检查问题?
我的随机运行程序也卡在了这段代码中(而不是 HardFault):
/* Wait till LSE is ready */
while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET)
{
if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE)
{
return HAL_TIMEOUT;
}
}
这似乎与单元化LSE有关,但我认为我应该首先专注于调试硬故障。
【问题讨论】:
-
如果你有一个带跟踪的调试器,检查一下。通过在处理程序中设置断点并检查跟踪,它将立即显示哪个代码是罪魁祸首。或者,一些调试器可能会显示调用堆栈。
-
前段时间我给出了一个答案,描述了如何在代码中找到导致错误的位置 - 请参见此处:stackoverflow.com/questions/51085240/...。此外,即使使用调试器,也不能始终保证它在 HardFault 处理程序中显示方便的调用堆栈。
标签: c eclipse arm stm32 stm32f4discovery