欢迎来到天天文库
浏览记录
ID:46609026
大小:395.55 KB
页数:4页
时间:2019-11-26
《STM32出现HardFault故障的解决方法》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、根据网络资料及自己调试经验总结如下:STM32出现HardFault_Handler故障的原因主要有两个方面:1、内存溢出或者访问越界。这个需要自己写程序的时候规范代码,遇到了需要慢慢排查。2、堆栈溢出。增加堆栈的大小。排查方法:发生异常之后可首先查看LR寄存器中的值,确定进入异常前一刻使用的堆栈为MSP或PSP,然后找到相应堆栈的指针?注:在HardFault_Handler(void)中断里第一条语句打断点,进入中断后,查看LR寄存器的值,如果是0XFFFFFFF9,那么中断前使用的是MSP
2、,如果是0XFFFFFFFD,那么中断前使用的是PSP;根据找到的堆栈指针,在内存中查看相应堆栈里的内容。由于异常发生时,内核将R0~R3、R12、LR、PC、XPRS寄存器依次入栈,其中LR即为发生异常前PC将要执行的下一条指令地址。中断/异常的响应序列当CM3开始响应一个中断时,会在它看不见的体内奔涌起三股暗流:1)入栈:把8个寄存器的值压入栈。2)取向量:从向量表中找出对应的服务程序入口地址。3)选择堆栈指针MSP/PSP,更新堆栈指针SP,更新连接寄存器LR,更新程序计数器PC。入栈响应
3、异常的第一个行动,就是自动保存现场的必要部分:依次把xPSR,PC,LR,R12以及R3‐R0由硬件自动压入适当的堆栈中:如果当响应异常时,当前的代码正在使用PSP,则压入PSP,即使用线程堆栈;否则压入MSP,使用主堆栈。一旦进入了服务例程,就将一直使用主堆栈。假设入栈开始时,SP的值为N,则在入栈后,堆栈内部的变化如表9.1表示。又因为AHB接口上的流水线操作本质,地址和数据都在经过一个流水线周期之后才进入。另外,这种入栈在机器的内部,并不是严格按堆栈操作的顺序的——但是机器会保证:正确的寄
4、存器将被保存到正确的位置,如表9.1所示。测试:在程序中调用如下函数,会进入异常故障中断。voidStackFlow(void){inta[3],i;for(i=0;i<10000;i++){a[i]=1;}}DEBUG如下图SP值为0x20008d88,查看堆栈里面的值依次为R0~R3、R12、LR、PC、XPRS,例如R0(00001C97),根据表9.1里LR的位置,得到地址0x0800087D即为异常前PC将要执行的下一条指令地址(即StackFlow()后面的语句处RTC_Init()
5、.另一种方法:默认的HardFault_Handler处理方法不是死循环么?将它改成BXLR直接返回的形式。然后在这条语句打个断点,一旦在断点中停下来,说明出错了,然后再返回,就可以返回到出错的位置的下一条语句那儿。__asmvoidwait(){BXlr//BX无条件转移指令}voidHardFault_Handler(void){/*GotoinfiniteloopwhenHardFaultexceptionoccurs*/wait();}
此文档下载收益归作者所有