問題引入:
用一句話回答以下問題:
- 什么是寄存器?
- 什么是寄存器映射?
- 什么是存儲器映射?
(本章重點在 1.1.3 和 1.1.4)
1.1 STM32芯片實物圖
(圖)
- 學會看絲印圖
- 芯片型號、內核提供商等其他信息
- 學會辨別正方向(芯片上的小圓點與PCB上的小圓點對應)
- 以小圓點為基礎,逆時針旋轉,從1號引腳開始遞增(圖)
- 如果芯片上沒有小圓點,那么就把絲印圖正對着自己,左上角的引腳為1號引腳,同樣逆時針旋轉遞增。
- 所有芯片的引腳排列都是逆時針的,無論是LQFP還是DIP封裝的。
1.2 STM32芯片架構簡圖
(圖)
芯片主要是由內核和外設組成。
內核(主控制器):
- Cortex - M4內核(由Arm公司設計)用於控制外設。
外設(從控制器):
- Flash、Sram、USART、GPIO、IIC、SPI等(由Soc公司設計)
總線:
-
內核與外設通過總線連接,其分為:I(指令)、S(系統)、D(數據)總線。
-
幾個總線同時訪問某個外設或者內核,產生競爭的時候,總線矩陣會使用調度算法進行仲裁。
-
STM32F42xx的總線接口
(圖)
- 黃色為主控制器,紅色為從控制器。
- 指令總線主要訪問Flash,程序可以從內置Flash、外置Flash和Sram中啟動。
- 總線交叉處有圓點,說明可以連接,例如:程序只能存儲在Sram1中,不能存儲在Sram2中。
- 數據總線主要用於取常量。常量的存儲區域和程序的存儲區域是一樣的。
- 系統總線主要訪問Sram和寄存器。
1.3 存儲器映射
-
存儲器本身是不具有地址信息的,地址信息是由用戶或者廠商分配的,為存儲器重新分配地址的過程即為存儲器映射。
-
Cortex - M4內核是32位的,可以尋址2的32次方,也就是4GB(0x0000 0000 - 0xFFFF FFFF)的內存空間,
-
這4GB的內存空間被分成了8個Block,每個Block都有特定的功能,每個Block大小為512MB。(教程里有每個Block的功能划分)
-
Block0用於設計Flash,429IGT6只用了1MB。
-
Block1用於設計Sram,用於存儲變量,429IGT6用了256KB,被分成了三個部分:Sram1為112KB,Sram2為16KB,Sram3為64KB。
-
Block2用於設計片上外設。外設根據速度不同被分成四條總線進行控制:AHB1、AHB2、APB2、APB1。
(圖)
-
Block3是FMC的bank1 - bank2,用於擴展外部存儲,一個bank為256MB,板上拓展了一個大小為8MB的Sram。
-
Block4是FMC的bank3 - bank4
- 四個bank通過一個片選信號控制四片拓展芯片 。
-
Block5用於FMC
-
Block6用於FMC
-
Block7為Cortex - M4的內部外設,是由Arm公司設計的,如:NVIC等。
-
-
通過地址和偏移量間接訪寄存器。
1.4 寄存器映射
問題引入:
- 如何通過控制寄存器的方法,讓GPIOH的16個引腳均輸出高電平?
通過絕對地址訪問內存單元:
//GPIO端口全部輸出高電平
*(unsigned int *)(0x40021C14) = 0xFFFF;
-
0x40021C14是輸出數據寄存器OCR的地址,如何找到?
- 在《STM32中文參考手冊》2.3.1 嵌入式SRAM這節中,可以查到GPIOH外設的起始地址為0x4002 1c00。
- 在 7.4.6 GPIO端口輸出數據寄存器這節中,可以查到偏移地址為0x14。
-
(unsigned int *)的作用是什么?
- 0x4002 1c14是我們人為理解的地址,但是直接寫在程序中,只是一串十六進制常量,需要將其強制類型轉換為指針類型,才能使用間接訪問運算符訪問該地址內存的數據。
通過寄存器別名方式訪問內存單元:
#define GPIOH_ODR *(unsigned int *)(0x40021C13)
GPIOH_ODR = 0XFF;
什么是寄存器?
- 給具有特定功能的內存單元取一個別名,這個別名就是寄存器,給已經分配好地址的特定內存單元取別名的過程叫做寄存器映射。
什么是存儲器映射?
- 給存儲器分配地址的過程叫做存儲器映射,再分配一個地址的過程叫做重映射。