找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2197|回复: 0
打印 上一主题 下一主题
收起左侧

HardFault_Handler问题查找方法

[复制链接]
跳转到指定楼层
楼主
ID:94349 发表于 2015-11-9 15:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STM32出现HardFault_Handler故障的原因主要有两个方面:

1、内存溢出或者访问越界。这个需要自己写程序的时候规范代码,遇到了需要慢慢排查。

2、堆栈溢出。增加堆栈的大小。

出现问题时排查的方法:

发生异常之后可首先查看LR寄存器中的值,确定当前使用堆栈为MSP或PSP,然后找到相应堆栈的指针,并在内存中查看相应堆栈里的内容。由于异常发生时,内核将R0~R3、R12、Returnaddress、PSR、LR寄存器依次入栈,其中Return address即为发生异常前PC将要执行的下一条指令地址。

注意:寄存器均是32位,且STM32是小端模式。(参考Cortex-M3权威)

编写问题代码如下:

  1. void StackFlow(void)

  2. {

  3. int a[3],i;

  4. for(i=0; i<10000; i++)

  5. {

  6. a[i]=1;

  7. }

  8. }

  9. void SystemInit(void)

  10. {

  11. /* Reset the RCC clock configuration to the default reset state ------------*/

  12. /* Set HSION bit */

  13. RCC->CR |= (uint32_t)0x00000001;

  14. /* Reset CFGR register */

  15. RCC->CFGR = 0x00000000;

  16. /* Reset HSEON, CSSON and PLLON bits */

  17. RCC->CR &= (uint32_t)0xFEF6FFFF;

  18. /* Reset PLLCFGR register */

  19. RCC->PLLCFGR = 0x24003010;

  20. StackFlow();

  21. /* Reset HSEBYP bit */

  22. RCC->CR &= (uint32_t)0xFFFBFFFF;

  23. 。。。。。。。。。。。。。。

  24. }
复制代码


DEBUG如下图
SP值为0x20008560,查看堆栈里面的值依次为R0~R3、R12、Return address、PSR、LR, 例如R0(10 27 00 00),  显然堆栈后第21个字节到24字节即为Return  address,该地址0x08001FFD即为异常前PC将要执行的下一条指令地址(即StackFlow()后面的语句处 RCC->CR &=  (uint32_t)0xFFFBFFFF)



另一种方法:
默认的HardFault_Handler处理方法不是B .这样的死循环么?楼主将它改成BX  LR直接返回的形式。然后在这条语句打个断点,一旦在断点中停下来,说明出错了,然后再返回,就可以返回到出错的位置的下一条语句那儿
  1. __asm void wait()

  2. {

  3. BX lr

  4. }

  5. void HardFault_Handler(void)

  6. {

  7. /* Go to infinite loop when Hard Fault exception occurs */

  8. wait();

  9. }
复制代码





分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表