MyException - 我的异常网
当前位置:我的异常网» 单片机 » stm32出现HardFault,应该如何解决

stm32出现HardFault,应该如何解决

www.MyException.Cn  网友分享于:2013-01-05  浏览:216次
stm32出现HardFault,应该怎么解决?
目前使用stm32f103vet6调试TFT触摸屏,用到了ucosII和ucGUI,ucosII只用了两个任务,问题是:通过调用ucGUI的创建对话框函数,使两个对话框交替重复进行创建、关闭,很有规律的重复7次左右就进入了HardFault,进入仿真调试,根据SP的内容得到LR的地址,再跳到该地址,黄色标识的那一行,这一行代表的是什么意思,怎么能看出错误是什么,为什么地址为0xc618c618,超出了RAM范围?程序没有进行优化,图片如下:
下面的图片是上面图片的部分截图,方便看清楚:







------解决方案--------------------
我所见到的HardFault错误几乎全都是因为朝不该写入的地址写了东西。指针未初始化或者指针赋值错误最容易造成这个现象。这个是直接原因。

但你上了OS,分析起来比较困难,需要对OS有足够的了解,知道这些内存操作的用意,以及可能出现的风险,这个我帮不了你。
------解决方案--------------------
我还在,焊接有问题、错误的接口配置过程、误写了FLASH,芯片杯具了

这些个情况,会进入这个中断
------解决方案--------------------
焊接有问题、错误的接口配置过程、误写了FLASH,芯片杯具了

这些个情况,会进入这个中断 
------解决方案--------------------
访问越界的可能性大,检查下数组指针
------解决方案--------------------
贴的图没有用 已经进入到中断了 

使两个对话框交替重复进行创建、关闭
-------
贴一下你的代码

 stm32 hard fault及堆栈探究
------解决方案--------------------
兄弟  我刚刚前面几天解决了这个问题   我的原因是在用消息队列的时候  定义的数组没有初始化   我猜你也是这个原因  还有就是看看你的堆栈的大小,堆栈太小也会出现这样的问题
最好把所有定义的变量指针数组都初始化,这样就不会出现问题了
------解决方案--------------------
我脚着如果没有太硬的OS底子,这么漫无目的猜下去会很花时间。我有个辙你兴许可以试试。

找两个空闲IO口,写两端小语句用来分别翻转。比如这种:
if(GPIO_ReadInputDataBit(GPIOx, GPIO_Pin))
  GPIO_ResetBits(GPIOx, GPIO_Pin);
else
  GPIO_SetBits(GPIOx, GPIO_Pin);

做成一个函数也行,做成一个宏也可。

把第一个IO口的翻转语句放到HardFault代码里面,可以放在while(1)之前,也可以放在循环体中。用示波器监视这个脚,一旦进入HardFault,会观察到电平翻转。

把第二个IO口的翻转语句插入到你程序执行的必经之路上。用示波器的另一个通道监视它。

用第一个IO口的双沿做trigger,示波器的时间跨度稍微设置大一点。一旦进入HardFault,你应该观察到两个通道上都有脉冲翻转。

第二个IO口的翻转只要观察到一次,你就知道那个时刻程序走到那里了。你要做的事情是手动分析程序的流程,沿着程序接下来执行的顺序把那个翻转语句尽量向后移动,反复尝试。应该观察到示波器上两个通道的脉冲越来越近了。这个过程做好笔记。

直到两个脉冲几乎重合的时候,你就找到崩溃前的现场了。下次断点执行到这个位置,看看相关变量有没有可疑的情况。

文章评论

软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有