STM32出現(xiàn)HardFault_Handler故障的原因主要有兩個方面:
1、內(nèi)存溢出或者訪問越界。這個需要自己寫程序的時候規(guī)范代碼,遇到了需要慢慢排查。
2、堆棧溢出。增加堆棧的大小。
出現(xiàn)問題時排查的方法:
發(fā)生異常之后可首先查看LR寄存器中的值,確定當(dāng)前使用堆棧為MSP或PSP,然后找到相應(yīng)堆棧的指針,并在內(nèi)存中查看相應(yīng)堆棧里的內(nèi)容。由于異常發(fā)生時,內(nèi)核將R0~R3、R12、LR、PC、XPRS 寄存器依次入棧,其中LR即為發(fā)生異常前PC將要執(zhí)行的下一條指令地址。
注意:寄存器均是32位,且STM32是小端模式。(參考Cortex-M3權(quán)威)
編寫問題代碼如下:
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個字節(jié)到24字節(jié)即為LR,該地址0x08001FFD即為異常前PC將要執(zhí)行的下一條指令地址(即StackFlow()后面的語句處 RCC->CR &= (uint32_t)0xFFFBFFFF)
另一種方法:
默認(rèn)的HardFault_Handler處理方法不是B .這樣的死循環(huán)么?樓主將它改成BX LR直接返回的形式。然后在這條語句打個斷點,一旦在斷點中停下來,說明出錯了,然后再返回,就可以返回到出錯的位置的下一條語句那兒
__asm void wait()
{
BX lr
}
void HardFault_Handler(void)
{
/* Go to infinite loop when Hard Fault exception occurs */
wait();
}
上一篇:初學(xué)STM32遇到的一些問題
下一篇:ARM處理器啟動流程———S3C2440、S3C6410、S5PV210
推薦閱讀
史海拾趣
設(shè)計資源 培訓(xùn) 開發(fā)板 精華推薦
- 上海同馭汽車:線控電子液壓制動系統(tǒng)(EHB) | 2021金輯獎
- AEye激光雷達(dá)實現(xiàn)新突破 可在雨中/擋風(fēng)玻璃后探測1000米外物體
- 日本開發(fā)新型無負(fù)極鋰金屬電池 能量密度高/壽命長
- 富士通推出汽車級4Mbit FRAM 工作溫度為125°C
- 緯湃科技推出新一代電動軸驅(qū)系統(tǒng)EMR4
- 8英寸晶圓產(chǎn)能奇缺問題難解,VCM馬達(dá)行業(yè)現(xiàn)資本熱浪
- 至晟微電子:致力在提供最先進(jìn)射頻子系統(tǒng)芯片產(chǎn)品
- 精測電子:已進(jìn)入寧德時代等電池廠商的供應(yīng)鏈
- 華工科技:推全系列100G、400G產(chǎn)品,布局硅光技術(shù)
- 云鯨拖地機(jī)器人指示燈閃爍無法正常工作,官方給出解決方案