首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在STM32F411发现上实现HD44780液晶屏时调试HardFault

在STM32F411发现上实现HD44780液晶屏时调试HardFault
EN

Stack Overflow用户
提问于 2018-10-04 16:50:59
回答 1查看 222关注 0票数 0

我在STM32F411 Discovery上使用这个库:https://stm32f4-discovery.net/2015/07/hal-library-15-hd44780-for-stm32fxxx/编程液晶HD44780时遇到了问题,问题是在实现这个库并运行代码后,我通常会卡在HardFault_Handler函数中。我在互联网上读了一些关于调试硬故障的文章,我从这个网站上实现了HardFault_HandlerC函数:https://community.nxp.com/thread/389002程序现在被这个函数卡住了,这让我对寄存器中的内容有了深入的了解,但现在我真的不知道我下一步应该做什么,因为这些值完全没有告诉我任何东西。

以下是上述寄存器的值:

代码语言:javascript
复制
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):

代码语言:javascript
复制
/* 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有关,但我认为我应该首先专注于调试硬故障。

EN

回答 1

Stack Overflow用户

发布于 2018-10-04 19:38:41

调试硬故障是出了名的困难。您很可能进入了硬故障处理程序,因为发生了一个没有处理程序可用的异常,尽管这可能是因为处理程序本身生成了异常。

正如Lundin在评论中所说的那样,如果你有一个不错的调试器,你也许能够在硬故障处理程序中放置一个断点,并让调试器向你展示一个完整的调用堆栈。但如果不是这样,你将不得不以一种艰难的方式来完成它。

当CPU进入处理程序模式来处理异常时,硬件会将各种寄存器推送到活动堆栈,您所实现的处理程序会将这些寄存器从堆栈中取出,供您检查。首先要查看的是堆栈程序计数器(PC)的内容。尝试获取十六进制值;然后,通过使用调试器,您应该能够将其与生成错误的指令的地址相关联。

如果堆叠的PC地址不对应于合理的代码地址,则可能是另一行代码试图分支到这个无意义的地址,这就是触发故障的原因。在这种情况下,您可以通过查看堆栈链接寄存器(LR)地址来获取一些信息-该地址应包含CPU上次遇到call指令时的程序计数器的值。这可能与生成恶意分支的行并不完全对应,但它应该使您足够近,可以放置另一个断点并逐步执行,直到异常发生。

如果这些建议不能让你找到罪魁祸首,我很乐意为你提供进一步的建议--请留下评论,我会回复你的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52642699

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档