1. 程式人生 > 實用技巧 >玩轉STM32(12)程式碼儲存空間的選擇

玩轉STM32(12)程式碼儲存空間的選擇

前面瞭解了CPU怎麼樣擁有跳動的心臟,那麼它擁有了開啟自動化執行的生命之路。如果學習過CPU原理之類的硬體,就知道CPU在每一個脈衝訊號之下,就向前執行一步,像168MHz頻率的CPU,執行一步是很短的時間。不過CPU執行的原理是很簡單的,可以設想紙帶上有一些圖案,比如圓、三角形、四邊形,當這張紙帶經過一個機器時,碰到圓就加一,碰到三角形就減一,碰到四邊形就輸出當前計數,這樣簡單的機器就是一個計算機所做的事情了。同理,前面CPU執行頻率,就是讓紙帶經過機器的速度,如果頻率越高,紙帶的速度就快,CPU處理的事情就越多。從這裡可以看到,CPU要工作起來,剛剛有執行部件還不行,還得有紙帶,紙帶上面還得有符號。那麼在STM32裡,什麼是紙帶,什麼是符號呢?可以看到紙帶作用就是記錄符號,在電子計算機發展史,也確實有採用打孔紙帶來記錄的,後來慢慢發展,發現紙帶記錄太麻煩了。後來研究發展,採用半導體組成儲存器,就是目前採用的主流方案。既然明白了儲存器,就知道儲存器就是用來記錄程式和資料的,那麼程式和資料就相當紙帶上面的符號了。

有了儲存器,那麼CPU怎麼樣知道從哪個儲存器裡讀取資料呢?STM32擁有兩種儲存器,一種是內建的,一種是外接的。預設的情況下是從內建的儲存器讀取資料,並開始執行的。不過STM32也提供兩個配置管腳來選擇使用內建的,還是外接的,還是採用特殊的方式。可以從下面的原理圖看到兩個管腳的連線情況:

可以看到BOOT1引腳固定地接地線,就是相當於低電平,也是這一位置的值為0;而BOOT0引腳是接到外面一個跳線上,可以讓使用者來選擇不同儲存器使用的。這兩個引腳的置位情況就說明CPU要從那裡讀取程式運行了。具體詳細說明如下:

STM32三種啟動模式對應的儲存介質均是晶片內建的,它們是:

1)使用者快閃記憶體 = 晶片內建的Flash。

2)SRAM = 晶片內建的RAM區,就是記憶體啦。

3)系統儲存器 = 晶片內部一塊特定的區域,晶片出廠時在這個區域預置了一段Bootloader,就是通常說的ISP程式。這個區

域的內容在晶片出廠後沒有人能夠修改或擦除,即它是一個ROM區。

在每個STM32的晶片上都有兩個管腳BOOT0和BOOT1,這兩個管腳在晶片復位時的電平狀態決定了晶片復位後從哪個區域開始執

行程式,見下表:

BOOT1=x BOOT0=0 從使用者快閃記憶體啟動,這是正常的工作模式。

BOOT1=0 BOOT0=1 從系統儲存器啟動,這種模式啟動的程式功能由廠家設定。

BOOT1=1 BOOT0=1 從內建SRAM啟動,這種模式可以用於除錯。

Main Flash memory

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

System memory

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

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

Step2:最後在BootLoader的幫助下,通過串列埠下載程式到Flash中

Step3:程式下載完成後,又有需要將BOOT0設定為GND,手動復位,這樣,STM32才可以從Flash中啟動

Embedded Memory

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

要注意的是,一般不使用內建SRAM啟動(BOOT1=1 BOOT0=1),因為SRAM掉電後資料就丟失。多數情況下SRAM只是在除錯時使用,也可以做其他一些用途。如做故障的區域性診斷,寫一段小程式載入到SRAM中診斷板上的其他電路,或用此方法讀寫板上的Flash或EEPROM等。還可以通過這種方法解除內部Flash的讀防寫,當然解除讀防寫的同時Flash的內容也被自動清除,以防止惡意的軟體拷貝。

一般BOOT0和BOOT1跳線都跳到0(地)。

通過上面的學習,就理解了STM32是怎麼樣決定從那個儲存空間進行讀取程式碼,並執行的。

https://blog.csdn.net/caimouse/article/details/51749579