1. 问题描述
调试APM32E103(类似STM32F103的一款芯片)板子时,程序运行一段时间后总是会发生HardFault_Handler()。
2. 解决过程
- 网上查各种资料,总结可能的原因如下:
现象:跑着跑着进入了 HardFault_Handler() 死循环。
原因:
1、内存溢出或者访问越界。
2、堆栈溢出,程序指针指飞。
3、空指针的调用。
4、硬件电路错误!
- 仔细检查程序后发现在定时器中断里有对函数指针的调用,且定时器配置和使能在函数指针的初始化之前,所以确实导致了中断里对空指针进行了调用,导致HardFault。
- 步骤2进行完后,程序运行30s左右,还是会进入HardFault_Handler(),且Peripherals->Core Peripherals->Fault Reports里的故障标志不尽相同。
- 最后发现是SystemInit()中时钟配置的问题,板子上的HSE是16MHz,而用的示例程序中的SystemInit()中时钟配置都是按照外部8MHz的晶振来配置的,所以导致系统时钟是设想的两倍,原本想配置为72MHz,实际变成了144MHz,超频导致程序运行不稳定,所以会发生HardFault!!!
- 把apm32e10x.h中HSE_VALUE由8000000改为16000000.
#ifndef HSE_VALUE
#define HSE_VALUE ((uint32_t)16000000)
#endif
在system_apm32e10x.c中SystemClock72M()中把PLL配置在原来按照8MHz的HSE来配置的基础上进行2分频。
问题解决 ^-^