stm32 boot啟動經(jīng)驗
STM32三種啟動模式對應(yīng)的存儲介質(zhì)均是芯片內(nèi)置的,它們是:
1)用戶閃存 = 芯片內(nèi)置的Flash。
2)SRAM = 芯片內(nèi)置的RAM區(qū),就是內(nèi)存啦。
3)系統(tǒng)存儲器 = 芯片內(nèi)部一塊特定的區(qū)域,芯片出廠時在這個區(qū)域預(yù)置了一段Bootloader,就是通常說的ISP程序。這個區(qū)域的內(nèi)容在芯片出廠后沒有人能夠修改或擦除,即它是一個ROM區(qū)。
在每個STM32的芯片上都有兩個管腳BOOT0和BOOT1,這兩個管腳在芯片復(fù)位時的電平狀態(tài)決定了芯片復(fù)位后從哪個區(qū)域開始執(zhí) 行程序
不同的下載方式對應(yīng)STM32啟動方式也不同,如下圖是STM32三種啟動方式:
●第一種啟動方式是最常用的用戶FLASH啟動,正常工作就在這種模式下,STM32的FLASH可以擦出10萬次,所以不用擔(dān)心芯片哪天會被擦爆!
●第二種啟動方式是系統(tǒng)存儲器啟動方式,即我們常說的串口下載方式(ISP),不建議使用這種,速度比較慢。STM32中自帶的BootLoader就是在這種啟動方式中,如果出現(xiàn)程序硬件錯誤的話可以切換BOOT0/1到該模式下重新燒寫Flash即可恢復(fù)正常。
●第三種啟動方式是STM32內(nèi)嵌的SRAM啟動。該模式用于調(diào)試。
在系統(tǒng)上電的時候,cpu首先根據(jù)這兩個腳來確定是哪種模式的啟動,然后就是把相應(yīng)模式的起始地址映射到0地址處,并從0地址處開始執(zhí)行。在芯片出廠時,ST燒寫了一個bootloader到rom中,也就是system memory。這個bootloader的主要任務(wù)就是通過uart1下載程序到內(nèi)置flash中去。工作流程如下:
system memory boot模式,在執(zhí)行完成它的任務(wù)之后是必須要退出的。這個退出方式是通過一次硬件reset來實現(xiàn)的。在reset的時候,必須要配置BOOT[1:0]這兩個腳以使cpu在重啟之后進(jìn)入適當(dāng)?shù)哪J?。要注意的是,一般不使用?nèi)置SRAM啟動(BOOT1=1 BOOT0=1),因為SRAM掉電后數(shù)據(jù)就丟失。多數(shù)情況下SRAM只是在調(diào)試時使用,也可以做其他一些用途。如做故障的局部診斷,寫一段小程序加載到SRAM中診斷板上的其他電路,或用此方法讀寫板上的Flash或EEPROM等。還可以通過這種方法解除內(nèi)部Flash的讀寫保護(hù),當(dāng)然解除讀寫保護(hù)的同時Flash的內(nèi)容也被自動清除,以防止惡意的軟件拷貝。一般BOOT0和BOOT1跳線都跳到0( 地)1) Bootloader是在System Memory,這個區(qū)域必須通過設(shè)置Boot1和Boot0引腳才能啟動,正常工作狀態(tài)下,這部分區(qū)域是被隔離開的,自動被繞開,Bootloader絕對不占用任何用戶程序的資源。簡單地說:當(dāng)你要使用ISP燒寫數(shù)據(jù)到Flash時,需要設(shè)置Boot1和Boot0啟動System Memory中的Bootloader;燒寫完成后,再重新設(shè)置Boot1和Boot0啟動Flash中你自己的程序,進(jìn)入正常操作。2)STM32中的Bootloader使用USART1做為通信端口,它使用8個數(shù)據(jù)位、1個停止位和偶校驗,具有自動波特率檢測功能。
在使用開發(fā)板時不小心下載了個有問題的程序,然后就悲劇了。無法往芯片中燒寫程序了。每次想下載程序都會彈出如下的兩個錯誤對話框:
J-Link和STM32 芯片都不大可能就這么壞掉了。多半是燒寫進(jìn)去的軟件有些問題,占用了相應(yīng)的IO 管腿,導(dǎo)致無法利用J-Link與之通訊。那就想辦法不讓這個錯誤的程序運行了。例如下述代碼如果燒寫進(jìn)去的話就會造成J-Link下次不能正常連接:
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);
上述代碼表示取消JTAG引腳功能,開始SWD引腳功能。
STM32 中是自帶了BootLoader的,切換進(jìn)BootLoader 中就可以了。具體的方法就是通過BOOT1、BOOT0兩個跳線來選擇啟動模式。修改跳線將啟動模式切換為上述的第二種方式:BOOT0=1,BOOT1=0。
斷電,改跳線,重新上電,進(jìn)入第二種方式:BOOT0=1,BOOT1=0,即STM32的BootLoader 模式。此時J-Link可以正常工作了,用J-Link 下載新的程序,下載成功。再斷電,把跳線改回來第一種啟動方式(BOOT0=0,BOOT1=0),重新上電,一切正常,問題解決。