前言
前幾天做項目時在CSDN下了個F103的程序,燒到我的F103里面測試,又作死往我的另一塊F411里面燒其它程序的時候,沒有把
J-LINK從F103上拔下來。。。然后就沒有然后了。。。
總之是一大堆報錯。點完后程序當然燒不到F103里面的。因為F411內核是Cortex-M4,F103內核是Cortex-M3。
然后我又用這塊F103燒程序的時候,出現:
然后在Debug里的Settings里看到神奇的一幕:
芯片無法識別了。網上給出的解釋也是五花八門,最終認定這塊F103是自鎖了。
啥叫自鎖?
STM32單片機一般的連接方式是主閃存存儲器(flash)啟動模式,即BOOT0為0,這樣在用JTAG或SWD寫進程序的時候,如果該程序工程中芯片選型不正確或着程序中復用了JTAG或SW復用引腳導致程序執行后出現啟動配置錯誤或者調試引腳被占用而引起的芯片鎖死或Jlnk連接不上的問題。
時鍾問題:時鍾頻率設置太高,配置超出芯片主頻工作范圍,導致單片機自鎖。
電源問題:供電電壓不穩,STM32內部存在保護檢測,同樣會進行芯片的自鎖。
用人話解釋:
單片機正常情況,程序是從Flash區開始跑的,但是因為你寫的軟件代碼有問題,下進去后,程序跑飛了,單片機卡死。按下復位(因為復位后程序也是從Flash區開始跑)也會卡死。所以芯片就禁掉SWD接口,自鎖。
這里顯然是芯片選型不正確導致的自鎖。
解決
我嘗試了一些方案,找到了一個最有效也是最快的辦法。我們要先准備一個F103程序(隨便什么程序,空程序也可)。
用人話解釋:
正常的芯片自鎖,就是將Flash存儲進行讀寫保護,使得不能運行程序,而我們的做法就是將BOOT0置高,使程序從系統存儲器(ROM區)啟動,找到芯片之后,重新往Flash中下載一個正常的代碼,之后再換回Flash啟動,芯片即可完成解鎖。
因為ROM區是存儲存儲固化程序的(存放指令代碼和一些固定數值,程序運行后不可改動。例如c文件及h文件中所有代碼、全局變量、局部變量、’const’限定符定義的常量數據、startup.asm文件中的代碼),不會卡死,也就不影響單片機SWD口的下載。
先掉電,將BOOT0=1后,將代碼下進去,然后再掉電,再把BOOT0=0,再上電,即可正常運行了。
如何改變BOOT0和BOOT1腳的電平?
如圖紅框處為STM32F103C8T6核心板的BOOT引腳:
圖中黃色的是跳線帽,作用是將插入的兩腳短接,從而實現BOOT引腳電平的選擇
如圖BOOT0=1,BOOT1=0