STM32如何查找hardfault原因
来源:互联网 发布:基础英语词汇知乎 编辑:程序博客网 时间:2024/05/18 02:00
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)
{
/* Reset the RCC clock configuration to the default reset state ------------*/
/* Set HSION bit */
RCC->CR |= (uint32_t)0x00000001;
/* Reset CFGR register */
RCC->CFGR = 0x00000000;
/* Reset HSEON, CSSON and PLLON bits */
RCC->CR &= (uint32_t)0xFEF6FFFF;
/* Reset PLLCFGR register */
RCC->PLLCFGR = 0x24003010;
StackFlow();
/* Reset HSEBYP bit */
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直接返回的形式。然后在这条语句打个断点,一旦在断点中停下来,说明出错了,然后再返回,就可以返回到出错的位置的下一条语句那儿
__asm void wait()
{
BX lr
}
void HardFault_Handler(void)
{
/* Go to infinite loop when Hard Fault exception occurs */
wait();
}
- STM32如何查找hardfault原因
- STM32如何查找hardfault原因
- STM32 malloc HardFault
- 调试STM32遇到Hardfault知识总结
- STM32 uart4初始化进hardfault问题
- 如何查找STM32开发资料
- 结合固件库探讨STM32读写FLASH步骤、HardFault问题
- 调试STM32时遇到hardfault 的一些感悟
- 如何查找生成的dll出错原因
- 如何查找java.lang.NullPointerException的原因
- 分析如何查找Linux死机的原因
- Erlang如何查找内存消耗过高原因
- 记一次STM32中HardFault问题的调试解决(INVPC, LR 0xFFFFFFF5)
- 【译】RL-RTX(CM3)的任务中不能配置NVIC,否则进入HardFault的原因
- RL-RTX(CM3)的任务中不能配置NVIC,否则进入HardFault的原因
- ARM Cortex-M 错误追踪库,专治各种 HardFault,查找问题原因更便利
- UCosIII在Cortex-M3核单片机上IAP跳转APP时引起HardFault错误原因分析
- [MySQL优化] -- 如何查找SQL效率地下的原因
- 字符编码笔记:ASCII,Unicode 和 UTF-8 的区别
- jsp的变量和对象
- poj 3182 The Grove 【BFS+判断点在多边形内 射线法】
- 直接插入排序
- Necklace HDU
- STM32如何查找hardfault原因
- 面向对象思想
- IE盒模型和w3c盒模型的区别
- c#学习第一天的内容
- java Build模式 建造者模式 简明版
- excel将一行或一列转换为10个的方阵
- Grandpa's Walk UVALive
- 从B树、B+树、B*树谈到R 树
- 新手上路 jquery 选择器篇(一) 代码笔记