STM32開發(fā)時HardFault錯誤的排查
本篇是 嵌入式開發(fā)-STM32硬件I2C驅(qū)動OLED屏 一文的擴展。
把相關的問題記錄一下,給遇到HardFault_Handler問題的朋友做個參考。
故障現(xiàn)象
做STM32開發(fā),經(jīng)常遇到HardFault錯誤,也就是程序不會正常運行,此時若停止程序運行,會發(fā)現(xiàn)跳轉(zhuǎn)到下面的程序段,并死循環(huán)運行,也就是著名的HardFault錯誤
void HardFault_Handler(void)
{
/* USER CODE BEGIN HardFault_IRQn 0 */
/* USER CODE END HardFault_IRQn 0 */
while (1)
{
/* USER CODE BEGIN W1_HardFault_IRQn 0 */
/* USER CODE END W1_HardFault_IRQn 0 */
}
}
故障原因
常見故障有
1 數(shù)組越界
2 內(nèi)存溢出
3 堆棧溢出
4 數(shù)據(jù)類型出錯
等等
問題分析
在下圖處打斷點,等到運行到這個位置時會暫停,如下圖:
在Call Stack Window頁面,可以看到如下信息:
箭頭所指,就是進入HardFault_Handler之前的函數(shù)。
這個調(diào)試窗口展示的是從main開始運行時,逐次調(diào)用函數(shù)的一個過程,
下圖就是兩個函數(shù)循環(huán)調(diào)用,但還沒有堆棧溢出的情況,發(fā)展下去,肯定是堆棧溢出。
檢查相關代碼,可以發(fā)現(xiàn)問題。
void oled_write_onebyte(u8 data, u8 cmd)
{
u32 ret;
ret = HAL_I2C_Mem_Write(&hi2c2, OLED_ADDR, 0, I2C_MEMADD_SIZE_8BIT, &data, 1, 1000);
if(ret!=0)
{
oled_init();
OLED_DisPlay_Off();
HAL_Delay(10);
OLED_DisPlay_On();
}
}
在oled_init()這個函數(shù)中,調(diào)用了oled_write_onebyte()這個函數(shù),但是當oled_write_onebyte函數(shù)出錯時,又會調(diào)用oled_init這個函數(shù),于是形成嵌套,最終是堆棧資源耗完,溢出,然后進HardFault_Handler。
可以改為文章來源:http://www.zghlxwxcb.cn/news/detail-723810.html
If(ret!=0)
i2c_err_flag = 1;
然后在主循環(huán)中,操作i2c相關函數(shù)時,檢查i2c_err_flag的值,再進行相關處理即可。文章來源地址http://www.zghlxwxcb.cn/news/detail-723810.html
到了這里,關于STM32開發(fā)時HardFault錯誤的排查的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!