HardFault_Handler问题查找方法(2)
- UID
- 1029342
- 性别
- 男
|
HardFault_Handler问题查找方法(2)
编写问题代码如下:
void StackFlow(void)
{
int a[3],i;
for(i=0; i<10000; i++)
{
a=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();
} |
|
|
|
|
|