你是否有過燒錯固件的經歷?
STM32F1xx程序意外燒錄到 STM32F4xx單片機中,或者外部晶振 25M,程序設定為 8 M後再燒錄到單片機中?
這樣就造成了一個後果,那就是再也沒法使用調試器連接你的單片機了。
此時,是否有方法攻克這個問題,或者說拯救你的單片機呢?
魚鷹在此介紹兩種方法:
00001.進入固件升級 BOOTLOAD狀態。
此時單片機將使用內部高速晶振 HSI運行 BOOTLOAD代碼(即參照手冊寫的所謂自舉程序),此時的單片機肯定能夠正常運行,當然也就能夠通過調試器連接單片機了。關於這個能夠看魚鷹寫的兩篇筆記《如何拯救燒錯固件的單片機?(一)》《Boot引腳引發的血案》
00001.使用復位引腳。
我們知道,STM32單片機的第一條指令執行位置就在復位中斷,並且單片機沒法屏蔽該中斷,也就是說,沒論單片機處於何種狀態,它都會在復位信號到來時復位到最初始的狀態,並重新初始執行代碼。
所以假如我們能在它執行錯誤時鐘配置代碼前,利用調試器把沒問題的代碼下載進去,那麼程序就能夠正確配置時鐘了,從而正常運行代碼了。
我們能夠看看這個執行流程:
上電或復位 ->進入復位中斷執行 ->配置時鐘信息(SystemInit)->運行 __main。
在配置時鐘前,調試器是能夠連接單片機的,所以,假如我們能搶在它之前,先用 KEIL將正確的程序下載進去(必需是正確的代碼,否則又會連接不上,陷入死循環),那就能讓單片機恢復到正常狀態了。
另一種方法是,使用 KEIL軟體的擦除功能,先將單片機的程序擦除,這樣單片機就沒有錯誤的代碼能夠執行了,當然前提還是使用復位信號。
但這種擦除方法,魚鷹發現成功率比較低,畢竟從復位到執行時鐘配置代碼這段時間實在是太短了,要剛好湊在這個時間點擊Erase按鈕還是需要一定運氣的。
所以魚鷹最近發現,一種更高效的方式是:直接使用下載按鈕,即復位後,馬上點擊下載正確的代碼。
為什麼這個比較高效呢,根據魚鷹的猜測,應該是這個命令會嘗試多次下載,這樣成功率就會高很多,畢竟是軟體的重複嘗試,比手動掐時間快得多。
還有一個問題是,為什麼晶振配置錯誤會導致單片機無法連接呢?
根據上面的錯誤配置,很大可能是使單片機處於超頻運行,導致單片機掛掉了。
魚鷹試圖解釋時鐘配置錯誤和調試模塊的關係,但通過參考手冊,並沒有找到 CoreSight的時鐘來源,只能以後看看能不能有機會解惑了。
而關於單片機和調試模塊的關係,可以看看魚鷹這篇筆記《為什麼說你一定要掌握 KEIL調試方法?》
我自己在今年年初錄製了一套還比較系統的入門單片機教程,想要的同學找我拿就行了免費的,私信我就可以哦~簡介里也有。