在用 Keil 對STM32的程序進行仿真時程序有時會跑飛,停止仿真程序會停在HardFault_Handler 函數(shù)里的死循環(huán)while(1)中。
這說明 STM32 出現(xiàn)了硬件錯誤。
硬件錯誤中斷
STM32出現(xiàn)硬件錯誤可能有以下原因:
數(shù)組越界操作;
內(nèi)存溢出,訪問越界;
堆棧溢出,程序跑飛;
中斷處理錯誤;
遇到這種情況,可以通過以下2種方式來定位到出錯代碼段。
方法1:
在硬件中斷函數(shù)HardFault_Handler里的while(1)處打調試斷點,程序執(zhí)行到斷點處時點擊STOP停止仿真。
示例
在Keil菜單欄點擊View——Registers Window,在寄存器查看窗口查找R14(LR)的值。
如果R14(LR) = 0xFFFFFFE9,繼續(xù)查看MSP(主堆棧指針)的值;如果R14(LR) = 0xFFFFFFFD,繼續(xù)查看PSP(進程棧指針)的值;
我的程序R14(LR) = 0xFFFFFFF9,接下來以此為例。
寄存器信息
在Keil菜單欄點擊“View”——“Memory Windows”——“Memory1”;
在“Address”地址欄中輸入MSP的值:0x20001288,然后在對應的行里找到地址。
地址一般以 0x08 開頭的32位數(shù)。本例中,地址為0x08003CB9。
內(nèi)存信息
在Keil菜單欄點擊View——Disassembly Window,在Disassembly窗口中右擊,在下拉菜單中選擇Show Disassemblyat Address...。
在彈出框Show Code atAdress的地址框中輸入地址0x08003CB9進行搜索,然后就會找到相對應的代碼。這里的代碼就是進入循環(huán)中斷之前的情況。
仔細查看附近區(qū)域的相關代碼來排查錯誤具體原因。

方法2:
在硬件中斷函數(shù)HardFault_Handler里的while(1)處打調試斷點,程序執(zhí)行到斷點處時點擊“STOP”停止仿真。
CallStack
在Keil菜單欄點擊View——Call Stack Window彈出Call Stack + Locals對話框。
然后在對話框中右鍵選擇Show Caller Code,就會跳轉到出錯之前的函數(shù)處,仔細查看這部分函數(shù)被調用或者數(shù)組內(nèi)存使用情況。
關鍵字:調試 STM32 硬件錯誤 HardFault
引用地址:
怎樣調試STM32硬件錯誤HardFault
推薦閱讀最新更新時間:2025-07-15 19:43
Keil仿真調試STM32與LED
今天給大家分享一下STM32 流水燈簡單的仿真吧,我感覺這個提供有用的,但是自己也是第一次使用,主要是感覺曲線很高級。在PWM中查看脈寬很有用。 code: led.c #include led.h #include delay.h /*GPIO的控制寄存器的配置1、配置輸出引腳2、打開對應的輸出的寄存器的時鐘3、配置引腳輸出的模式:強上拉、推完、開漏輸出4、配置輸出的速度。*/void Led_funcing(){GPIO_DeInit(LED_GPIO_PORT);// 注意這里的函數(shù)非常的重要,這里是將對應的GPIO端口初始化成默認的樣子,因為這個端口可能在以前使用過,其他的配置可能發(fā)生了改變GPIO_InitTypeD
[單片機]
STM32調試SP3485技術總結
1、本文使用的STM32芯片是STM32F103RB,使用的資源是片內(nèi)的USART1。 2、下面是我的電路連接圖: 注:電路可以稍做修改更好,在B和A分別接下拉電阻到地和上拉電阻到5v,阻值選擇為10K即可,這是為了在沒有進行數(shù)據(jù)傳輸時保證兩條數(shù)據(jù)線的狀態(tài)為確定值。 做一下簡單的說明: (1)PA8是sp3485的發(fā)送/接收使能端,sp3485只能支持半雙工的通信,所以這個引腳就是來控制這個芯片到底是收數(shù)據(jù)還是發(fā)數(shù)據(jù)的。 (2)在有些電路連接中,sp3485的A和B端會一個被連接一個上拉電阻到3.3V,另一個會連接一個下拉電阻到GND,這樣做的目的是當本sp3485不參與通信時不會影響網(wǎng)絡的穩(wěn)定性。 3、本次調試方式 PC
[單片機]
解決STM32調試,無法進入main函數(shù)的問題
昨天調試STM32程序,以前使用的是MDK3.40的版本,把版本升了下級,升到了MDK4.10,裝好后,一運行,哈哈,新版本給人的感覺就是不一樣啊,很爽,較之前有很多改進,把自己以前的程序打開,編譯運行發(fā)現(xiàn)程序調試時無法進入Main函數(shù),弄了很久,很是郁悶啊,最后還是在ourdev的壇子里,找到了同樣問題的解決方法,多謝ourdev,以下是壇子里面的帖子,我把他貼出來了. sdc666 : 請問高手,我在調試我的STM32F101c8t6時,遇到一個問題,因為我要調試串口,我在main.c中添加了#include ,編譯可以通過,但是當我用jlink硬件調試時,一開始就停在了 0x08001460 BEAB
[單片機]
使用示波器的汽車以太網(wǎng)物理層調試案例
簡介/ 汽車以太網(wǎng)物理層調試 車載電子設備越來越多地使用車載以太網(wǎng)在互連設備和組件之間傳輸高速串行數(shù)據(jù)。由于數(shù)據(jù)傳輸速率相對較快,而且聯(lián)網(wǎng)設備復雜多變,因此經(jīng)常會出現(xiàn)信號完整性問題。本文概述了幾個實際挑戰(zhàn),并深入介紹了如何使用示波器識別和調試汽車以太網(wǎng)物理層信號完整性問題。以下是在Inspectron公司進行的汽車以太網(wǎng)調試研究案例,該公司設計并制造內(nèi)窺鏡、嵌入式 Linux 系統(tǒng)和攝像檢測工具。 1汽車以太網(wǎng)硬件調試配置 汽車以太網(wǎng)信號路徑是雙向的(一根雙絞線上的全雙工),因此硬件收發(fā)器必須能夠通過從復合信號中減去自己的向外數(shù)據(jù)部分來辨別出傳入數(shù)據(jù)。如果直接探測汽車以太網(wǎng)數(shù)據(jù)線就會獲得類似總線碰撞的雜亂疊加。為了理解發(fā)送的各
[嵌入式]
PLCSIM模擬調試S7-1200程序步驟介紹
PLCSIM軟件可以仿真PLC大部分的功能,利用仿真可以在沒有硬件的情況下,快速的熟悉PLC指令和軟件操作。 S7-1200 PLC 使用仿真功能有如下要求: 硬件要求: 1、S7-1200 PLC的固件版本必須4.0 或更高版本。 2、S7-1200F 系列的固件版本必須4.12 或更高版本 軟件要求: S7-PLCSIM V13 SP1 及以上 S7-1200 PLCSIM仿真范圍 S7-PLCSIM 目前不支持以下工藝模塊: 計數(shù) PID 控制 運動控制 如果你在項目中,使用了以上工藝模塊,在仿真時可能要出錯。 仿真軟件S7-PLCSIM 幾乎支持S7-1200的所有指令(系統(tǒng)函數(shù)和系統(tǒng)函數(shù)塊),支持的指令使用方法,
[嵌入式]
keil項目的調試與編譯
編譯: Translate===編譯單個文件 Build====編譯當前項目,如果該項目先前編譯過1次,并且文件沒有編輯改動,則點擊時不會重新編譯 Rebuild===重新編譯,每點擊一次就重新編譯、鏈接1次 Build Output===編譯結果輸出窗口 Start/Stop Debug Session(圖標::一個放大鏡,鏡上寫著d)===調試按鈕 調試 Run===運行,處于停止狀態(tài)才有效 Stop===停止,處于運行狀態(tài)才有效 Reset===復位,程序回到最開頭處執(zhí)行 Serial Windows(圖標::一個窗格上面有個刷子)===串行調試窗口,可以看到從芯片串行
[單片機]
自適應功率優(yōu)化正在徹底改變電芯,助力工程師輕松測試和調試 PMIC
“如果您想要節(jié)約能源和縮減開支,那么最好的方法就是關掉所有的電子設備?!? 盡管這個建議簡單至極,卻是一切能耗優(yōu)化管理行為背后的基本原理和不二法門,所謂的自適應功率優(yōu)化也不例外。對于采用電池供電的電子設備而言,一旦選定了合適的 電池電芯供應 商并將其電芯納入到設計環(huán)節(jié),接下來就需要由 PMIC 將電芯的續(xù)航時間發(fā)揮到極致。 要實現(xiàn)這一目的,最好的方法就是保證所連接的電路系統(tǒng)能夠以最小負載維持運轉。按照這一原則,嵌入式便攜電子設備工程師可通過對電源管理控制系統(tǒng)進行編程,將輸出電壓連接器處的源電壓盡量保持在 3.6V,同時準確估測出(并盡量避免)一切有害條件。在此過程中我們會遇到這樣一種情況:電流吸收會導致電壓水平降至“
[物聯(lián)網(wǎng)]
N76E003使用DATAFLASH調試技巧總結
使用內(nèi)置的FLASH做DATAFLASH是經(jīng)常做的事情。 1.N76E003的page是128字節(jié)。因此每次擦寫都是128字節(jié) 2.寫入前需要先擦除,否則寫入的數(shù)據(jù)會出問題。 3.燒錄程序的時候。需要看是全片擦除還是部分擦除,還是不擦出。全片擦除會把寫進去的數(shù)據(jù)擦除掉。 4.有建議說從末尾倒著寫dataflash。目的是防止覆蓋了代碼??葱枨蟀?。感覺做好空間規(guī)劃就行。倒著寫不太符合思維。 5.可以用debug的memory窗口查看到flash的數(shù)據(jù),如圖
[單片機]