深入的Cortex-M3内核问题,程序跑飞了,HardFault_Handler
在调试can通信过程产生的问题,我是用定时器中断每隔一定时间,就让单片机(一个节点)发送一帧数据给另一个节点。这些都不是关键。关键是在我没有使用定时器TIM4的时候(此时,已经打开了串口,can接收中断),一切都ok。在初始化TIM4后,打开了TIM4_IRQHandler定时器中断,问题出现了
在进入定时器中断 1 到 2次后,pc跳入了STM32的启动文件里,下面这个地方:(且R14(LR)寄存器的值为一个莫名的地址0xfffffff1)
HardFault_Handler\
PROC
EXPORT HardFault_Handler [WEAK]
B .
ENDP
这里先排除掉几个方面,TIM4_IRQHandler是定义里的有入口地址,STM32F103RET6启动文件配置正确。(我没有用OS操作系统,只是简单单片机程序)。
这两天简单研究了一下M3核的汇编指令,试着解决问题。对于跳入HardFault_Handler的问题,网上的答案,只隔靴挠痒,没有解决实质问题,说是什么,指针指向系统不允许的地方、数据数组溢出了,硬件错误,等等。
且不说是不是这些原因。我也单步调试了,关键是怎么知道数组是否越界?怎么找硬件出错的地方。或者写个汇编代码,把问题出错的地方打印出来。捣腾3天了……只好求助于各位大侠了!先谢谢
[解决办法]
定时器4中断代码有问题,这不是显而易见的吗?
[解决办法]
且R14(LR)寄存器的值为一个莫名的地址0xfffffff1
从这个说明你对M3不了解,别人说再多也是白说
发到有专门的stm32子论坛的版块去吧,或许有人会从0开始教你
对于出现HardFault,怎么找出问题的时候的pc值,网上一大堆文章已经说的很详细
[解决办法]
今天刚解决了一个出现跳入HardFault_Handler的问题,原因是指针指向系统不允许的地方。
如果你有条件仿真,跟踪一下是在那里出的问题