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

評(píng)論