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