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口的翻转只要观察到一次,你就知道那个时刻程序走到那里了。你要做的事情是手动分析程序的流程,沿着程序接下来执行的顺序把那个翻转语句尽量向后移动,反复尝试。应该观察到示波器上两个通道的脉冲越来越近了。这个过程做好笔记。
直到两个脉冲几乎重合的时候,你就找到崩溃前的现场了。下次断点执行到这个位置,看看相关变量有没有可疑的情况。