1. 程式人生 > >STM32啟動模式詳解

STM32啟動模式詳解

一、三種boot啟動模式:

       一般來說就是指我們下好程式後,重啟晶片時,SYSCLK的第4個上升沿,BOOT引腳的值將被鎖存。使用者可以通過設定BOOT1和BOOT0引腳的狀態,來選擇在復位後的啟動模式。


1、第一種方式(boot0 = 0):Flash memory啟動方式。啟動地址:0x08000000 (stm32F207系列)

    是STM32內建的Flash,一般我們使用JTAG或者SWD模式下載程式時,就是下載到這個裡面,重啟後也直接從這啟動程式。

    基本上都是採用這種模式。

2、第二種方式(boot0 = 1;boot1 = 0:System memory啟動方式。啟動地址:0x1FFF0000 (stm32F207系列

)

    從系統儲存器啟動,這種模式啟動的程式功能是由廠家設定的。一般來說,這種啟動方式用的比較少。系統儲存器是晶片內部一塊特定的區域,STM32在出廠時,由ST在這個區域內部預置了一段BootLoader, 也就是我們常說的ISP程式, 這是一塊ROM,出廠後無法修改。一般來說,我們選用這種啟動模式時,是為了從串列埠下載程式,因為在廠家提供的BootLoader 中,提供了串列埠下載程式的韌體,可以通過這個BootLoader將程式下載到系統的Flash中。但是這個下載方式需要以下步驟:

Step1:將BOOT0設定為1,BOOT1設定為0,然後按下復位鍵,這樣才能從系統儲存器啟動BootLoader

Step2:最後在BootLoader的幫助下,通過串列埠下載程式到Flash中
Step3:程式下載完成後,又有需要將BOOT0設定為GND,手動復位,這樣,STM32才可以從Flash中啟動可以看到, 利用串 口下載程式還是比較的麻煩,需要跳帽跳來跳去的,非常的不注重使用者體驗。

3、第三種方式(boot0 = 1;boot1 = 1):SRAM啟動方式。啟動地址:0x20000000(stm32F207系列)

    內建SRAM,既然是SRAM,自然也就沒有程式儲存的能力了,這個模式一般用於程式除錯。假如我只修改了程式碼中一個小小的      地方,然後就需要重新擦除整個Flash,比較的費時,可以考慮從這個模式啟動程式碼(也就是STM32的記憶體中),用於快速的程式除錯,等程式除錯完成後,在將程式下載到SRAM中。

二、關於啟動地址:

理論上,CM3中規定上電後CPU是從0地址開始執行,但是這裡中斷向量表卻被燒寫在0x0800 0000地址裡(Flash memory啟動方式),那啟動時不就找不到中斷向量表了?既然CM3定下的規矩是從0地址啟動,SMT32當然不能破壞ARM定下的“規矩”,所以它做了一個啟動對映的過程,就是和晶片上總能見到的BOOT0和BOOT1有關了,當選擇從主Flash啟動模式後,晶片一上電,Flash的0x0800 0000地址被對映到0地址處,不影響CM3核心的讀取,所以這時的CM3既可以在0地址處訪問中斷向量表,也可以在0x0800 0000地址處訪問中斷向量表,而程式碼還是在0x0800 0000地址處儲存的。

三、關於flash死鎖的解決辦法(Flash memory啟動方式):

     開發除錯過程中,由於某種原因導致內部Flash鎖死,無法連線SWD以及Jtag除錯,無法讀到裝置,可以通過修改BOOT模式重新刷寫程式碼。

     修改為BOOT0=1,BOOT1=0即可從系統儲存器啟動,ST出廠時自帶Bootloader程式,SWD以及JTAG除錯介面都是專用的。重 新燒寫程式後,可將BOOT模式重新更換到BOOT0=0,BOOT1=X即可正常使用。