引言
有客戶反映,STM32G071RBT6 在使用 STM32CubeProgrammer 燒錄完程序后只能運行一次,復位后,程序無法運行,如果掉電后重新上電,程序恢復正常。
問題描述
根據客戶描述,該問題可通過以下步驟復現:
2.1. 測試代碼的功能流程圖
準備測試代碼 App1 和 App2:
2.2. 問題復現步驟
操作步驟
(1) 在 STM32CubeProgrammer 中下載
應用程序 App1(如圖 3),并設置 RDP=1(如圖 4);然后斷開 STM32CubeProgrammer 的連接,板子斷電后重新上電;
(2) 根據 log 提示(如圖 5),按下用戶按鍵,板子會在 RDP 降級的過程中,產生全片擦除的動作,等待 10s,確保芯片擦除完成后從板子再斷電并重新上電;
(3) 使用 STM32CubeProgrammer 重新連接板子,在下載界面選中“Run afterprogramming”后,下載應用程序 App2(如圖 6),下載完成后,可以看到板子執行閃燈的效果,并從 App2 的 log 信息可知,此時的 empty check 位被置起(如圖 7)。
(4) 在不斷電的情況下,如果直接按下外部復位按鈕,程序將出現無法執行的現象。
問題解決
通過問題的復現,我們注意到,程序無法正常運行時,實際進入了內置的 ISP 程序,即內置的 bootloader 程序。為什么會進入 bootloader 呢?在 G0 的參考手冊中,我們注意到 empty check 的描述如下:
這里的描述有兩點是很重要的。
A :出廠的芯片,因為是沒有程序的空片,empty check 位是被置位的,但實際電路中因 boot 管腳定義的程序從 Main Flash 啟動的場景時,程序會由于 empty check 位而強制從內置的 bootloader 啟動。
B :empty check 只會在加載 OptionByte 時更新,所以在空片上下載完程序后,應當通過 power on reset 或者手動清除該位,程序才可以正常運行。
我們來驗證一下,在復現問題的第(4)步中,如果先按下用戶按鈕,應用程序 App2會通過軟件清除 empty check 位,再通過外部復位按鈕,則程序正常運行, 根據 log 信息可以看到 empty check 位被清除(如圖 9),且程序運行恢復正常。
小結
本文描述的問題雖然隱藏的比較深,但規律還是很明顯的,只要重新上電即可恢復,說明很可能和 power on reset 有關。在參考手冊中搜索 power on reset 關鍵字,可以很快的找到一些線索。所以分析問題時,要多關注這樣的有規律的問題信息。
來源:STM32單片機
免責聲明:本文為轉載文章,轉載此文目的在于傳遞更多信息,版權歸原作者所有。本文所用視頻、圖片、文字如涉及作品版權問題,請聯系小編進行處理
審核編輯 黃宇
-
STM32
+關注
關注
2270文章
10895瀏覽量
355743 -
死機
+關注
關注
0文章
17瀏覽量
8597 -
復位
+關注
關注
0文章
171瀏覽量
24211
發布評論請先 登錄
相關推薦
評論