介紹兩部分內容:
-
什么是存儲器映射
-
什么是寄存器及寄存器映射
為了讓大家對存儲器與寄存器有一個更清楚的認識,並且為之后使用 C 語言來訪問 STM32 寄存器內容打下基礎。等明白了如何使用 C 語言封裝底層寄存器,也就為后面學習庫函數的開發做好了鋪墊。
什么是存儲器映射
程序存儲器、數據存儲器、寄存器和I/O端口排列在同一順序的4GB地址空間內。這就是我們曾提到過的被控總線的連接部分,而編程時就是操作這一塊地方。存儲器本身不具有地址信息,它的地址是由芯片廠商或用戶分配,給存儲器分配地址的過程稱為存儲器映射,如果再分配一個地址就叫重映射。STM32F103ZET6 數據手冊中存儲器映射圖如下所示。
從上圖中可以看到 ARM 把這 4GB 的存儲器空間平均分成了 8 塊區域,每塊區域的大小是 512MB,這個容量是非常大的,因此芯片廠商就在每塊容量范圍內設計各自特色的外設。但是每塊區域容量占用越大,芯片成本就越高,所以說我們使用的 STM32 芯片都是只用了其中一部分。ARM 在對這 4GB 容
量分塊的時候是按照其功能划分,每塊都有它特殊的用途。
在這 8 個 Block 里面,要特別注意Block0、Block1 和 Block2 這 3 個塊。因為其中包含了 STM32 芯片的內部 Flash、RAM 和片上外設。下面還是根據存儲器映射圖內信息來簡單的介紹下這3個 Block 里面的具體區域功能划分。
-
Block0 內部區域功能划分
Block0 主要用於設計片內的 FLASH, STM32F103 系列芯片內部 FLASH 最大是 512KB,我們使用的 STM32F103ZET6 的 FLASH 是 512KB。要在芯片內部集成更大的 FLASH 或者 SRAM 都意味着芯片成本的增加,所以往往片內集成的FLASH 都不會太大。512KB 的 FLASH 已經足夠我們一般的應用開發。從圖中可以看到 Block0 內部又划分了好多個功能塊,我們按地址從低到高順序依次介紹。
0x0000 0000-0x0007 FFFF:取決於 BOOT 引腳,為 FLASH、系統存儲器、SRAM 的別名。
0x0008 0000-0x07FF FFFF:預留。
0x0800 0000-0x0807 FFFF:片內 FLASH,我們編寫的程序就放在這一區域
。
0x0808 0000-0x1FFF EFFF:預留。
0x1FFF F000-0x1FFF F7FF:系統存儲器,里面存放的是 ST 出廠時燒寫好的isp 自舉程序,用戶無法改動。使用串口下載的時候需要用到這部分程序。
0x1FFF F800-0x1FFF F80F:選 項 字 節 ,用 於 配 置 讀 寫 保 護 、BOR 級別、軟件/硬件看門狗以及器件處於待機或停止模式下的復位。當芯片不小心被鎖住之后,我們可以從 RAM 里面啟動來修改這部分相應的寄存器位。
0x1FFF F810-0x1FFF FFFF:預留。
-
Block1 內部區域功能划分
Block1用於設計片內的SRAM, 例如STM32F103ZET6 的 SRAM是64KB。從存儲器映射圖中可以看到 Block1 內部又划分了幾個功能塊,我們按地址從低到高順序依次介紹。
0x2000 0000-0x2000 FFFF:SRAM,容量為 64KB。
0x2001 0000-0x3FFF FFFF:預留。
-
Block2 內部區域功能划分
Block2 用於設計片內外設, 根據外設總線速度的不同, Block2 被划分為 AHB和 APB 兩部分, APB 又被分成 APB1 和 APB2 總線。 這些都可以在上面存儲器映射圖中可看到。下面我們按地址從低到高順序依次介紹。
0x4000 0000-0x4000 77FF:APB1 總線外設。
0x4000 7800-0x4000 FFFF:預留。
0x4001 0000-0x4001 3FFF:APB2 總線外設。
0x4001 4000-0x4001 7FFF:預留。
0x4001 8000-0x4002 33FF:AHB 總線外設。
0x4002 4400-0x5FFF FFFF:預留。
在Block3、Block4、Block5中包含了FSMC擴展區域,可用於擴展如 SRAM,NORFLASH 和 NANDFLASH 等的外部存儲器。
什么是寄存器及寄存器映射
簡單來說,通過給特定功能的內存單元起一個別名,此別名即所謂的寄存器。寄存器映射就是給(已分配好地址且有特定功能的)內存單元起別名的過程。