打印

程序死在HardFault_Handler里

[复制链接]
25027|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 的手册吧
另外特别要说明的是, 有些故障是异步的, 也就是说, 可能不是发生故障前的最后一条指令导致的, 是再前面的指令导致的

使用特权

评论回复
5
sjnh| | 2012-7-11 08:59 | 只看该作者
查看几个方面,都会出现HardFault_Handler:
1、是否有未初始化的指针、或越界的指针;
2、堆、栈分配是否合理,避免出现堆、栈溢出;
3、防止看门狗(例如调试到断点时,看门狗复位,不过你描述的不太像);

使用特权

评论回复
6
香水城| | 2012-7-11 11:43 | 只看该作者
导致HARDFAULT的原因很多,楼上说了很多可能

具体原因是需要调试的

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

LZ可以在产生HARDFAULT时,查看堆栈,此时堆栈最新的那个地址值,基本就靠近事故区域,找到确定的地址,再单步执行,基本就可以发现问题了

使用特权

评论回复
7
悠然科技| | 2012-7-12 11:36 | 只看该作者
可以先找一下 数组溢出
据说这个可能性比较大,我也遇到过一次

使用特权

评论回复
8
thammer| | 2015-3-31 19:09 | 只看该作者
悠然科技 发表于 2012-7-12 11:36
可以先找一下 数组溢出
据说这个可能性比较大,我也遇到过一次

一般来讲如果是数组溢出,那么就是数组溢出后,对越界的地址访问,破坏了堆栈。

使用特权

评论回复
9
294479435| | 2015-3-31 19:57 | 只看该作者
有可能是时钟频率有问题,我遇到过一次,时钟频率和引脚输出频率冲突,就进了硬件中断,你可以把程序附上,好分析

使用特权

评论回复
10
Ω囿圉Ω| | 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);
}

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

使用特权

评论回复
11
xmshao| | 2016-3-29 11:55 | 只看该作者
你是用哪个系列MCU,基本上每个系列都有相关的IAP官方历程的。

使用特权

评论回复
12
wtj7603| | 2016-4-15 10:17 | 只看该作者
还有可能是编译时的优化级别设置问题.
我遇到在优化级别为 0 时, 就会死在HardFault_Handler里. 而选择优化级别 3 时就正常了.

使用特权

评论回复
13
turmary| | 2016-4-15 19:23 | 只看该作者
看看栈里的PC和LR寄存器,就知道死哪了

使用特权

评论回复
14
crjmail| | 2016-10-29 08:26 | 只看该作者
294479435 发表于 2015-3-31 19:57
有可能是时钟频率有问题,我遇到过一次,时钟频率和引脚输出频率冲突,就进了硬件中断,你可以把程序附上, ...

你好,我现在也遇到了时钟频率的问题。我把程序从stm32f103zet6移植到stm32f103c8t6后,发现定时器2的时钟就不对了,理论上应该是72M,但是现在是8M。但是我却不知道哪里会导致这个问题。

使用特权

评论回复
15
hugo0chen| | 2017-2-7 11:12 | 只看该作者
香水城 发表于 2012-7-11 11:43
导致HARDFAULT的原因很多,楼上说了很多可能

具体原因是需要调试的

靠谱,调试时看堆栈果然有效。赞

使用特权

评论回复
16
springvirus| | 2017-2-7 11:43 | 只看该作者
碰到过while(i--);的操作,一开始i就被赋值0了,所以进了hardfault,MDK有选项可以进入此异常的上一处运行位置,试试看吧

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

175

主题

424

帖子

1

粉丝