STM32 有三種啟動方式,從 FLASH 啟動(包含系統(tǒng)存儲器),從內(nèi)部 SRAM 啟動,從外部 RAM 啟動。
二、存儲器映射
存儲器本身不具有地址信息,它的地址是由芯片廠商或用戶分配,給存儲器分配地址的過程就稱為存儲器映射,具體見下圖。 如果給存儲器再分配一個地址就叫存儲器重映射。
在這 4GB 的地址空間中, ARM 已經(jīng)粗線條的平均分成了 8 個塊,每塊 512MB,每個塊也都規(guī)定了用途,具體分類見下表。每個塊的大小都有 512MB,顯然這是非常大的,芯片廠商在每個塊的范圍內(nèi)設(shè)計各具特色的外設(shè)時并不一定都用得完,都是只用了其中的一部分而已。
在這 8 個 Block 里面,有 3 個塊非常重要,也是我們最關(guān)心的三個塊。 Boock0 用來設(shè)計成內(nèi)部 FLASH, Block1 用來設(shè)計成內(nèi)部 RAM, Block2 用來設(shè)計成片上的外設(shè),下面我們簡單的介紹下這三個 Block 里面的具體區(qū)域的功能劃分。
1、存儲器 Block0 內(nèi)部區(qū)域功能劃分
Block0 主要用于設(shè)計片內(nèi)的 FLASH, F429 系列片內(nèi)部 FLASH 最大是 2MB,STM32F429IGT6 的 FLASH 是 1MB。
2、儲存器 Block1 內(nèi)部區(qū)域功能劃分
Block1 用于設(shè)計片內(nèi)的 SRAM。 F429 內(nèi)部 SRAM 的大小為 256KB,其中 64KB 的CCM RAM 位于 Block0,剩下的 192KB 位于 Block1,分 SRAM1 112KB, SRAM2 16KB,SRAM3 64KB, Block 內(nèi)部區(qū)域的功能劃分具體見下表。
3、儲存器 Block2 內(nèi)部區(qū)域功能劃分
Block2 用于設(shè)計片內(nèi)的外設(shè),根據(jù)外設(shè)的總線速度不同, Block 被分成了 APB 和 AHB兩部分,其中 APB 又被分為 APB1 和 APB2, AHB 分為 AHB1 和 AHB2,具體見下表。還有一個 AHB3 包含了 Block3/4/5/6,這四個 Block 用于擴展外部存儲器,如 SDRAM,NORFLASH 和 NANDFLASH 等。
三、寄存器映射
根據(jù)每個單元功能的不同,以功能為名給這個內(nèi)存單元取一個別名,這個別名就是我們經(jīng)常說的寄存器,這個給已經(jīng)分配好地址的有特定功能的內(nèi)存單元取別名的過程就叫寄存器映射。
1、STM32 的外設(shè)地址映射
片上外設(shè)區(qū)分為四條總線,根據(jù)外設(shè)速度的不同,不同總線掛載著不同的外設(shè), APB掛載低速外設(shè), AHB 掛載高速外設(shè)。相應(yīng)總線的最低地址我們稱為該總線的基地址,總線基地址也是掛載在該總線上的首個外設(shè)的地址。其中 APB1 總線的地址最低,片上外設(shè)從這里開始,也叫外設(shè)基地址。
(1)總線基地址
(2)外設(shè)基地址
總線上掛載著各種外設(shè),這些外設(shè)也有自己的地址范圍,特定外設(shè)的首個地址稱為“ XX 外設(shè)基地址”,也叫 XX 外設(shè)的邊界地址。
(3)外設(shè)寄存器
GPIO 有很多個寄存器,每一個都有特定的功能。每個寄存器為 32bit,占四個字節(jié),在該外設(shè)的基地址上按照順序排列,寄存器的位置都以相對該外設(shè)基地址的偏移地址來描述。
2、C 語言對寄存器的封裝
(1)封裝總線和外設(shè)基地址
為了方便理解和記憶,我們把總線基地址和外設(shè)基地址都以相應(yīng)的宏定義起來,總線或者外設(shè)都以他們的名字作為宏名。
(2)封裝寄存器列表
GPIOA-GPIOH 都各有一組功能相同的寄存器,如 GPIOA_MODER/GPIOB_MODER/GPIOC_MODER 等等,它們只是地址不一樣,但卻要為每個寄存器都定義它的地址。為了更方便地訪問寄存器,我們引入 C 語言中的結(jié)構(gòu)體語法對寄存器進行封裝。
這樣的地址偏移與 STM32 GPIO 外設(shè)定義的寄存器地址偏移一一對應(yīng),只要給結(jié)構(gòu)體設(shè)置好首地址,就能把結(jié)構(gòu)體內(nèi)成員的地址確定下來,然后就能以結(jié)構(gòu)體的形式訪問寄存器了。
3、修改寄存器的位操作方法
用 C 語言對寄存器賦值時,我們常常要求只修改該寄存器的某幾位的值,且其它的寄存器位不變,這個時候我們就需要用到 C 語言的位操作方法了。
(1)把變量的某位清零
此處我們以變量 a 代表寄存器,并假設(shè)寄存器中本來已有數(shù)值,此時我們需要把變量a 的某一位清零,且其它位不變。
(2)把變量的某幾個連續(xù)位清零
由于寄存器中有時會有連續(xù)幾個寄存器位用于控制某個功能,現(xiàn)假設(shè)我們需要把寄存器的某幾個連續(xù)位清零,且其它位不變。
(3)對變量的某幾位進行賦值
寄存器位經(jīng)過上面的清零操作后,接下來就可以方便地對某幾位寫入所需要的數(shù)值了,且其它位不變,這時候?qū)懭氲臄?shù)值一般就是需要設(shè)置寄存器的位參數(shù)。
(4)對變量的某位取反
某些情況下,我們需要對寄存器的某個位進行取反操作,即 1 變 0 , 0 變 1,這可以直接用如下操作,其它位不變。
編輯:hfy
-
存儲器
+關(guān)注
關(guān)注
38文章
7523瀏覽量
164130 -
STM32
+關(guān)注
關(guān)注
2270文章
10920瀏覽量
356912
發(fā)布評論請先 登錄
相關(guān)推薦
評論