STM32存儲器結構

Notes Introduction

本連載筆記,記錄了在STM32學習中對存儲器的理解;描述了STM32存儲器的結構劃分,以及STM32存儲器相關知識,能夠獲得對存儲器的整體性認識;並能夠順利的付諸實踐,達到真正的對存儲器的認識+應用。

 

本連載共有三篇筆記,分別是:

《關於STM32的存儲器》

能夠了解STM32的存儲器結構,及其結構設計由來;

能夠明確自己所寫的程序是放在什麼地方,並且可以合法的隨意放置;

能夠知道STM32系統的啓動相關;

STM32存儲器知識的相關應用(IAPBit Banding)》

能夠理解Bit-banding

一個簡單IAP功能的整體設計;

能夠IAPIn Application Programmable);

STM32實現IAP(上位機和IAP程序設計)》

上位機和IAP程序的通訊協議;

能夠通過自制上位機(C#)進行IAP

 

 

<關於STM32的存儲器>

If an error, please contact author, to be corrected.

For other uses, indicate the source, to express my recognition of the results.

Thank you.

 

 

當我們在完成某一個實驗,當我們正慶幸的時候,我們不由得產生一種不安的想法——我們是否已經少許明白其中的種種細節?

尤其,當我們所有的事情都依賴於編譯環境或Firmware,抑或他人的程序,而自己僅僅是CopyModify,以致Using。當你還是一個初學者的時候,或許不會太過於關注於此,但是要想提高自己對單片機、處理器原理的理解,並且希望走得更遠的時候,您就需要關注更爲詳細的內部知識,您需要明白編譯環境、Firmware爲你的默默貢獻。

 

 

1 STM32系統結構

    要想深刻理解STM32的存儲器,需要首先知道STM32的系統結構。

Figure 1,是STM32系統結構框圖。

STM32存儲器 <wbr>— <wbr><1> <wbr>關於STM32的存儲器

根據STM32 Reference manual (RM0008)中的描述,如圖:

STM32存儲器 <wbr>— <wbr><1> <wbr>關於STM32的存儲器

 

可以得知STM32系統結構的組成,每一個模塊更爲詳細的內容,請參考相關文檔。

RM0008文檔中可以看出,STM32採用的是Cortex-M3內核,因此,有必要了解Cortex-M3的存儲器結構。

圖中還可以看出,Cortex-M3是通過各個總線和FlashSROM相連接的。

2 STM32內核(Cortex-M3)的結構

以下是Cortex-M3模塊框圖:

STM32存儲器 <wbr>— <wbr><1> <wbr>關於STM32的存儲器

 

Cortex-M3內核通過I-CodeD-CodeSystem總線與STM32內部的FlashSROM相連接的,該種連接情況直接關係到STM32存儲器的結構組織;也就是說,Cortex-M3的存儲器結構決定了STM32的存儲器結構。

這裏可能說的比較籠統,可以這樣理解:Cortex-M3是一個內核,自身定義了一個存儲器結構,ST公司按照Cortex-M3的這個存儲器定義,設計出了自己的存儲器結構;但是ST公司的STM32的存儲器結構必須按照Cortex-M3這個定義的存儲器結構來進行設計。

舉個例子:

我買了一個做飯的調料盒子,有三塊區域(假設存儲器分爲3塊),上面分別標有鹽(Flash)、糖(SROM)、味精(Peripheral);此時,該調料盒子並沒有任何意義(對應Cortex-M3內核);我按照標籤放入特定品牌、特定分量的鹽(Flash)、糖(SROM)、味精(Peripheral),產生一個有實際意義的調料盒(各類Cortex-M3內核的芯片,如STM32)。

期間,調料位置不能放錯,但可以不放。由上面的例子可以看出,空的調料盒子決定了有意義的調料盒子存放調料的結構。因此,只要瞭解空盒子的存儲結構,就可以很清楚的明白當有調料時的用法了。

3 STM32內核(Cortex-M3)的存儲器映射

存儲器映射是指把芯片中或芯片外的FLASHRAM,外設,BOOTBLOCK等進行統一編址。即用地址來表示對象。這個地址絕大多數是由廠家規定好的,用戶只能用而不能改。用戶只能在掛外部RAMFLASH的情況下可進行自定義。

如圖,是Cortex-M3存儲器映射結構圖。

STM32存儲器 <wbr>— <wbr><1> <wbr>關於STM32的存儲器

 

Cortex-M332位的內核,因此其PC指針可以指向2^32=4G的地址空間,也就是0x0000_0000——0xFFFF_FFFF這一大塊空間。

好,根據圖中描述,Cortex-M3內核將0x0000_0000——0xFFFF_FFFF這塊4G大小的空間分成8大塊:代碼、SRAM、外設、外部RAM、外部設備、專用外設總線-內部、專用外設總線-外部、特定廠商等。導致了,使用該內核的芯片廠家必須按照這個進行各自芯片的存儲器結構設計。

這就可以去了解STM32的存儲器結構,以及爲什麼這樣設計STM32存儲器的結構了。

4 STM32存儲器結構

首先,我們對比一下Cortex-M3存儲器結構和STM32存儲器結構:

STM32存儲器 <wbr>— <wbr><1> <wbr>關於STM32的存儲器

 

圖中可以很清晰的看到,STM32的存儲器結構和Cortex-M3的很相似,不同的是,STM32加入了很多實際的東西,如:FlashSRAM等。只有加入了這些東西,才能成爲一個擁有實際意義的、可以工作的處理芯片——STM32

STM32的存儲器地址空間被劃分爲大小相等的8塊區域,每塊區域大小爲512MB

STM32存儲器知識的掌握,實際上就是對FlashSRAM這兩個區域知識的掌握。因此,下面將重點描述FlashSRAM的知識。

5 STM32SRAM

以下是STM32參考手冊RM0008中的一段原話:

STM32存儲器 <wbr>— <wbr><1> <wbr>關於STM32的存儲器

 

不同類型的STM32單片機的SRAM大小是不一樣的,但是他們的起始地址都是0x2000 0000,終止地址都是0x2000 0000+其固定的容量大小。

SRAM的理解比較簡單,其作用是用來存取各種動態的輸入輸出數據、中間計算結果以及與外部存儲器交換的數據和暫存數據。設備斷電後,SRAM中存儲的數據就會丟失。

6 STM32Flash

STM32Flash,嚴格說,應該是Flash模塊。

Flash模塊包括:Flash主存儲區(Main memory)、Flash信息區(Information block),以及Flash存儲接口寄存器區(Flash memory interface)。

三個組成部分分別在0x0000 0000——0xFFFF FFFF不同的區域,如圖(小密度的STM32)所示:

STM32存儲器 <wbr>— <wbr><1> <wbr>關於STM32的存儲器

 

圖中完全可以看出Flash模塊中的三個組成部分在整個存儲器中的位置。

具體的內部區域的意義及功能請參見編程手冊PM0042,裏面很詳細。

7 STM32存儲器結構總結

STM32存儲器 <wbr>— <wbr><1> <wbr>關於STM32的存儲器

 

圖中淡藍色就是你需要知道的。

Peripherals:外設的存儲器映射,對該區域操作,就是對相應的外設進行操作;

SRAM:運行時臨時存放代碼的地方;

Flash:存放代碼的地方;

System MemorySTM32出廠時自帶的你只能使用,不能寫或擦除;

Option Bytes:可以按照用戶的需要進行配置(如配置看門狗爲硬件實現還是軟件實現);

今後,你的編寫代碼、程序運行、寄存器設置、ICPIAP都依靠這些東西。

 

以上描述的是STM32存儲器的結構相關,其具體存儲器的應用在我的下一篇筆記《STM32存儲器知識的相關應用(IAPBit Banding》中詳細描述。

 

 

至此,關於《STM32存儲器》知識已經結束.

完成STM32存儲器知識過程中,一共參考了以下官方文檔:

RM0008 Reference manual

Cortex-M3技術參考手冊》

PM0042 Programming manualSTM32F10xxx Flash programming

AN2557 Application noteSTM32F10x in-application programming using the USART

等等;

另外也參考了很多無私網友的奉獻,在此感謝。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章