您的位置 首页 元件

STM32呈现HardFault_Handler毛病

STM32出现HardFault_Handler故障的原因主要有两个方面:1、内存溢出或者访问越界。这个需要自己写程序的时候规范代码,遇到了需要慢慢排查

STM32呈现HardFault_Handler毛病的原因主要有两个方面:

1、内存溢出或许拜访越界。这个需求自己写程序的时分标准代码,遇到了需求渐渐排查。

2、仓库溢出。添加仓库的巨细。

呈现问题时排查的办法:

产生反常之后可首要检查LR寄存器中的值,确认当时运用仓库为MSP或PSP,然后找到相应仓库的指针,并在内存中检查相应仓库里的内容。因为反常产生时,内核将R0~R3、R12、LR、PC、XPRS 寄存器顺次入栈,其间LR即为产生反常前PC即将履行的下一条指令地址。

留意:寄存器均是32位,且STM32是小端方式。(参阅Cortex-M3威望)

编写问题代码如下:

void StackFlow(void)
{
int a[3],i;

for(i=0; i<10000; i++)
{
a[i]=1;
}
}

void SystemInit(void)
{


RCC->CR |= (uint32_t)0x00000001;


RCC->CFGR = 0x00000000;


RCC->CR &= (uint32_t)0xFEF6FFFF;


RCC->PLLCFGR = 0x24003010;

StackFlow();


RCC->CR &= (uint32_t)0xFFFBFFFF;

。。。。。。。。。。。。。。

}

DEBUG如下图

SP值为0x20008560,检查仓库里边的值顺次为R0~R3、R12、LR、PC、XPRS, 例如R0(10 27 00 00), 明显仓库后第21个字节到24字节即为LR,该地址0x08001FFD即为反常前PC即将履行的下一条指令地址(即StackFlow()后边的句子处 RCC->CR &= (uint32_t)0xFFFBFFFF)

另一种办法:

默许的HardFault_Handler处理办法不是B .这样的死循环么?楼主将它改成BX LR直接回来的方式。然后在这条句子打个断点,一旦在断点中停下来,阐明犯错了,然后再回来,就可以回来到犯错的方位的下一条句子那儿

__asmvoidwait()
{
BXlr
}

void HardFault_Handler(void)
{

wait();
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/xinpin/yuanjian/259787.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部