STM32啓動模式說明

     STM32芯片上都有兩個管腳 BOOT0 和 BOOT1,這兩個管腳在芯片復位時的電平狀態決定芯片復位後從哪個區域開始執行程序,對應三種啓動模式
BOOT1=X     BOOT0=0     從用戶閃存啓動,這是正常的工作模式。
BOOT1=0     BOOT0=1     從系統存儲器啓動,這種模式啓動的程序功能由廠家設置。(用於串口ISP)
BOOT1=1     BOOT0=1     從內置SRAM啓動,這種模式可以用於調試。

     三種啓動模式對應的存儲介質均是芯片內置的。
1) 用戶閃存 = 芯片內置的Flash。
2) SRAM = 芯片內置的RAM區,就是內存啦。
3) 系統存儲器 = 芯片內部一塊特定的區域,芯片出廠時在這個區域預置了一段 Bootloader,就是通常說的 ISP 程序。這個區域的內容在芯片出廠後沒有人能夠修改或擦除,即它是一個ROM區。

     對於一般的應用來說,直接把 BOOT0 和 BOOT1 引腳接地即可,不用設置跳線,使用IAR 調試程序時可以選擇RAM 調試還是Flash 調試,與BOOT0 和BOOT1 的配置無關。  

     注意:多數情況下 SRAM 只是在調試時使用,也可以做其他一些用途。如做故障的局部診斷,寫一段小程序加載到SRAM中診斷板上的其他電路,或用此方法讀寫板上的Flash或EEPROM等。還可以通過這種方法解除內部Flash的讀寫保護,當然解除讀寫保護的同時Flash的內容也被自動清除,以防止惡意的軟件拷貝。

在STM32F10XXX手冊裏的解釋如下:
     在系統復位後,SYSCLK的第4個上升沿,BOOT管腳的值將被鎖存。用戶可以通過設置BOOT1和BOOT0引腳的狀態,來選擇在復位後的啓動模式。
在從待機模式退出時,BOOT管腳的值將被被重新鎖存;因此,在待機模式下BOOT管腳應保持爲需要的啓動配置。在啓動延遲之後,CPU從地址0x0000 0000獲取堆棧頂的地址,並從啓動存儲器的0x0000 0004指示的地址開始執行代碼。
因爲固定的存儲器映像,代碼區始終從地址0x0000 0000開始(通過ICode和DCode總線訪問),而數據區(SRAM)始終從地址0x2000 0000開始(通過系統總線訪問)。Cortex-M3的CPU始終從ICode總線獲取復位向量,即啓動僅適合於從代碼區開始(典型地從Flash啓動)。STM32F10xxx微控制器實現了一個特殊的機制,系統可以不僅僅從Flash存儲器或系統存儲器啓動,還可以從內置SRAM啓動。
    根據選定的啓動模式,主閃存存儲器、系統存儲器或SRAM可以按照以下方式訪問:
    ●從主閃存存儲器啓動:主閃存存儲器被映射到啓動空間(0x0000 0000),但仍然能夠在它原有的地址(0x0800 0000)訪問它,即閃存存儲器的內容可以在兩個地址區域訪問,0x0000 0000或0x0800 0000。
    ●從系統存儲器啓動:系統存儲器被映射到啓動空間(0x0000 0000),但仍然能夠在它原有的地址(0x1FFF F000)訪問它。
    ●從內置SRAM啓動:只能在0x2000 0000開始的地址區訪問SRAM。

     如何在內存SRAM中調試程序呢?
1) 當 BOOT0 和 BOOT1 均設置爲邏輯1時,系統將從內置SRAM中啓動。
2) 我們需要在代碼中設置正確的中斷向量表位置。中斷向量表通常被放置在用戶程序的開始,所以 Flash 中運行時,向量表位於0x08000000處,而當代碼被放置在SRAM中運行時,他的位置就成了0x20000000。在初始化NVIC時,我們可以放置如下代碼,定義向量表的位置
NVIC_SetVectorTable(0x20000000 , 0x0); 或 NVIC_SetVectorTable(0x08000000 , 0x0);
發佈了22 篇原創文章 · 獲贊 4 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章