STM32硬件错误HardFault_Handler的处理方法
在用Keil對(duì)STM32的程序進(jìn)行仿真時(shí)程序有時(shí)會(huì)跑飛,停止仿真程序會(huì)停在HardFault_Handler函數(shù)里的死循環(huán)while(1)中。這說明STM32出現(xiàn)了硬件錯(cuò)誤。
???? ???STM32出現(xiàn)硬件錯(cuò)誤可能有以下原因:
???? ???(1)數(shù)組越界操作;
????????(2)內(nèi)存溢出,訪問越界;
???? ???(3)堆棧溢出,程序跑飛;
???? ???(4)中斷處理錯(cuò)誤;
???? ???遇到這種情況,可以通過以下2種方式來定位到出錯(cuò)代碼段。
方法1:
??????1.1在硬件中斷函數(shù)HardFault_Handler里的while(1)處打調(diào)試斷點(diǎn),程序執(zhí)行到斷點(diǎn)處時(shí)點(diǎn)擊“STOP”停止仿真。
??????1.2?在Keil菜單欄點(diǎn)擊“View”——“Registers Window”,在寄存器查看窗口查找R14(LR)的值。如果R14(LR) = 0xFFFFFFE9,繼續(xù)查看MSP(主堆棧指針)的值,如果R14(LR) = 0xFFFFFFFD,繼續(xù)查看PSP(進(jìn)程棧指針)的值。我的程序R14(LR) = 0xFFFFFFF9,接下來以此為例。
??????1.3?在Keil菜單欄點(diǎn)擊“View”——“Memory Windows”——“Memory1”,在“Address”地址欄中輸入MSP的值:0x20001288,然后在對(duì)應(yīng)的行里找到地址。地址一般以0x08開頭的32位數(shù)。本例中,地址為0x08003CB9。
??????1.4?在Keil菜單欄點(diǎn)擊“View”——“Disassembly Window”,在“Disassembly”窗口中右擊,在下拉菜單中選擇“Show Disassemblyat Address...”。在彈出框“Show Code atAdress”的地址框中輸入地址0x08003CB9進(jìn)行搜索,然后就會(huì)找到相對(duì)應(yīng)的代碼。這里的代碼就是進(jìn)入循環(huán)中斷之前的情況。仔細(xì)查看附近區(qū)域的相關(guān)代碼來排查錯(cuò)誤具體原因。
?
方法2:
??????2.1在硬件中斷函數(shù)HardFault_Handler里的while(1)處打調(diào)試斷點(diǎn),程序執(zhí)行到斷點(diǎn)處時(shí)點(diǎn)擊“STOP”停止仿真。
?
??????2.2?在Keil菜單欄點(diǎn)擊“View”——“Call Stack Window”彈出“Call Stack + Locals”對(duì)話框。然后在對(duì)話框中右鍵選擇“Show Caller Code”,就會(huì)跳轉(zhuǎn)到出錯(cuò)之前的函數(shù)處,仔細(xì)查看這部分函數(shù)被調(diào)用或者數(shù)組內(nèi)存使用情況。
總結(jié)
以上是生活随笔為你收集整理的STM32硬件错误HardFault_Handler的处理方法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 已知两个时间戳判断这两个时间是否在同一天
- 下一篇: IAR 中打多个断点出现 one or