STM32出现HardFault故障的解决方法.pdf

STM32出现HardFault故障的解决方法.pdf

ID:57014435

大小:395.06 KB

页数:4页

时间:2020-07-30

STM32出现HardFault故障的解决方法.pdf_第1页
STM32出现HardFault故障的解决方法.pdf_第2页
STM32出现HardFault故障的解决方法.pdf_第3页
STM32出现HardFault故障的解决方法.pdf_第4页
资源描述:

《STM32出现HardFault故障的解决方法.pdf》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、根据网络资料及自己调试经验总结如下:STM32出现HardFault_Handler故障的原因主要有两个方面:1、内存溢出或者访问越界。这个需要自己写程序的时候规范代码,遇到了需要慢慢排查。2、堆栈溢出。增加堆栈的大小。排查方法:发生异常之后可首先查看LR寄存器中的值,确定进入异常前一刻使用的堆栈为MSP或PSP,然后找到相应堆栈的指针?注:在HardFault_Handler(void)中断里第一条语句打断点,进入中断后,查看LR寄存器的值,如果是0XFFFFFFF9,那么中断前使用的是MSP,如果是0XFFFFFFFD,那么中断前使用的是PSP;根据找到

2、的堆栈指针,在内存中查看相应堆栈里的内容。由于异常发生时,内核将R0~R3、R12、LR、PC、XPRS寄存器依次入栈,其中LR即为发生异常前PC将要执行的下一条指令地址。中断/异常的响应序列当CM3开始响应一个中断时,会在它看不见的体内奔涌起三股暗流:1)入栈:把8个寄存器的值压入栈。2)取向量:从向量表中找出对应的服务程序入口地址。3)选择堆栈指针MSP/PSP,更新堆栈指针SP,更新连接寄存器LR,更新程序计数器PC。入栈响应异常的第一个行动,就是自动保存现场的必要部分:依次把xPSR,PC,LR,R12以及R3‐R0由硬件自动压入适当的堆栈中:如果当

3、响应异常时,当前的代码正在使用PSP,则压入PSP,即使用线程堆栈;否则压入MSP,使用主堆栈。一旦进入了服务例程,就将一直使用主堆栈。假设入栈开始时,SP的值为N,则在入栈后,堆栈内部的变化如表9.1表示。又因为AHB接口上的流水线操作本质,地址和数据都在经过一个流水线周期之后才进入。另外,这种入栈在机器的内部,并不是严格按堆栈操作的顺序的——但是机器会保证:正确的寄存器将被保存到正确的位置,如表9.1所示。测试:在程序中调用如下函数,会进入异常故障中断。voidStackFlow(void){inta[3],i;for(i=0;i<10000;i++){

4、a[i]=1;}}DEBUG如下图SP值为0x20008d88,查看堆栈里面的值依次为R0~R3、R12、LR、PC、XPRS,例如R0(00001C97),根据表9.1里LR的位置,得到地址0x0800087D即为异常前PC将要执行的下一条指令地址(即StackFlow()后面的语句处RTC_Init().另一种方法:默认的HardFault_Handler处理方法不是死循环么?将它改成BXLR直接返回的形式。然后在这条语句打个断点,一旦在断点中停下来,说明出错了,然后再返回,就可以返回到出错的位置的下一条语句那儿。__asmvoidwait(){BXlr

5、//BX无条件转移指令}voidHardFault_Handler(void){/*GotoinfiniteloopwhenHardFaultexceptionoccurs*/wait();}

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。