程序死在HardFault_Handler里

[复制链接]
25815|15
 楼主| motor666 发表于 2012-7-10 22:41 | 显示全部楼层 |阅读模式
我的STM32F105板,调试的过程中突然不动了,停止后发现死在void HardFault_Handler(void)里,以后,每次运行都在这个程序里,不知是什么原因。
figo20042005 发表于 2012-7-10 23:45 | 显示全部楼层
那就是跑死在这个程序里,看死在这个程序里哪一局,再改
figo20042005 发表于 2012-7-10 23:45 | 显示全部楼层
airwill 发表于 2012-7-11 08:50 | 显示全部楼层
HardFault_Handler 有很多种故障因素, 详细请看 Cortex_M3 的手册吧
另外特别要说明的是, 有些故障是异步的, 也就是说, 可能不是发生故障前的最后一条指令导致的, 是再前面的指令导致的
sjnh 发表于 2012-7-11 08:59 | 显示全部楼层
查看几个方面,都会出现HardFault_Handler:
1、是否有未初始化的指针、或越界的指针;
2、堆、栈分配是否合理,避免出现堆、栈溢出;
3、防止看门狗(例如调试到断点时,看门狗复位,不过你描述的不太像);
香水城 发表于 2012-7-11 11:43 | 显示全部楼层
导致HARDFAULT的原因很多,楼上说了很多可能

具体原因是需要调试的

调试时出现的HARDFAULT是最好找原因的

LZ可以在产生HARDFAULT时,查看堆栈,此时堆栈最新的那个地址值,基本就靠近事故区域,找到确定的地址,再单步执行,基本就可以发现问题了
悠然科技 发表于 2012-7-12 11:36 | 显示全部楼层
可以先找一下 数组溢出
据说这个可能性比较大,我也遇到过一次
thammer 发表于 2015-3-31 19:09 | 显示全部楼层
悠然科技 发表于 2012-7-12 11:36
可以先找一下 数组溢出
据说这个可能性比较大,我也遇到过一次

一般来讲如果是数组溢出,那么就是数组溢出后,对越界的地址访问,破坏了堆栈。
294479435 发表于 2015-3-31 19:57 | 显示全部楼层
有可能是时钟频率有问题,我遇到过一次,时钟频率和引脚输出频率冲突,就进了硬件中断,你可以把程序附上,好分析
Ω囿圉Ω 发表于 2016-3-29 09:09 | 显示全部楼层
做IAP升级

void InterruptRemap(void)
{
    uint8_t i;
    uint32_t Data;
    uint32_t Address;

    for(i=1; i<48; i++)
    {
        Data =  *(__IO uint32_t *)(0x08003000+i*4);
        Address = 0x20000000 + (i*4);
        *(__IO uint32_t *)Address= (uint32_t)Data;
    }

    /* Enable the SYSCFG peripheral clock*/
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
       
    /* Remap SRAM at 0x00000000 */
    SYSCFG_MemoryRemapConfig(SYSCFG_MemoryRemap_SRAM);
}

跳转是成功了,可是发生中断就会死掉
感觉是中断向量表没有重定义
好烦啊……

xmshao 发表于 2016-3-29 11:55 | 显示全部楼层
你是用哪个系列MCU,基本上每个系列都有相关的IAP官方历程的。
wtj7603 发表于 2016-4-15 10:17 | 显示全部楼层
还有可能是编译时的优化级别设置问题.
我遇到在优化级别为 0 时, 就会死在HardFault_Handler里. 而选择优化级别 3 时就正常了.
turmary 发表于 2016-4-15 19:23 | 显示全部楼层
看看栈里的PC和LR寄存器,就知道死哪了
crjmail 发表于 2016-10-29 08:26 | 显示全部楼层
294479435 发表于 2015-3-31 19:57
有可能是时钟频率有问题,我遇到过一次,时钟频率和引脚输出频率冲突,就进了硬件中断,你可以把程序附上, ...

你好,我现在也遇到了时钟频率的问题。我把程序从stm32f103zet6移植到stm32f103c8t6后,发现定时器2的时钟就不对了,理论上应该是72M,但是现在是8M。但是我却不知道哪里会导致这个问题。
hugo0chen 发表于 2017-2-7 11:12 | 显示全部楼层
香水城 发表于 2012-7-11 11:43
导致HARDFAULT的原因很多,楼上说了很多可能

具体原因是需要调试的

靠谱,调试时看堆栈果然有效。赞
springvirus 发表于 2017-2-7 11:43 | 显示全部楼层
碰到过while(i--);的操作,一开始i就被赋值0了,所以进了hardfault,MDK有选项可以进入此异常的上一处运行位置,试试看吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则

176

主题

426

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部