映射的概念
存儲器本身不具有地址信息,它的地址是由芯片廠商或用戶分配,給存儲器分配地址的過程就稱為存儲器映射,如下圖所示的4GB空間(從block0-block7每個block512M)。在梳理STM32芯片的內(nèi)部架構(gòu)中提到的被控單元FLASH、RAM、FSMC和APB等功能部件共同排列在這4GB的地址空間內(nèi)。在編程的時候,可以通過他們的地址找到他們,然后通過C語言對它們進(jìn)行數(shù)據(jù)的讀和寫操作。
存儲器映射
在這 4GB 的地址空間中,ARM 已經(jīng)粗線條的平均分成了 8 個塊,每塊 512MB,每個塊也都規(guī)定了用途,具體分類見如下表格。在這 8 個 Block 里面,有 3 個塊非常重要,也是我們最關(guān)心的三個塊。Block0 用來設(shè)計成內(nèi)部FLASH,Block1 用來設(shè)計成內(nèi)部 RAM,Block2 用來設(shè)計成片上的外設(shè)。其中,Block2 用于設(shè)計片內(nèi)的外設(shè),根據(jù)外設(shè)的總線速度不同,Block 被分成了AHB、APB1、APB2。
存儲器本身沒有地址,給存儲器分配地址的過程叫存儲器映射,那什么叫寄存器映射?寄存器到底是什么?在存儲器 Block2 這塊區(qū)域,設(shè)計的是片上外設(shè),它們以四個字節(jié)為一個單元,共 32bit,每一個單元對應(yīng)不同的功能,當(dāng)我們控制這些單元時就可以驅(qū)動外設(shè)工作。我們可以找到每個單元的起始地址,然后通過 C 語言指針的操作方式來訪問這些單元,如果每次都是通過這種地址的方式來訪問,不僅不好記憶還容易出錯,這時我們可以根據(jù)每個單元功能的不同,以功能為名給這個內(nèi)存單元取一個別名,這個別名就是我們經(jīng)常說的寄存器,這個給已經(jīng)分配好地址的有特定功能的內(nèi)存單元取別名的過程就叫寄存器映射。
通過C語言操作寄存器的例子
GPIOB端口的輸出數(shù)據(jù)寄存器ODR的地址是0x40010C0C,ODR寄存器是32bit,低16bit有效,對應(yīng)著16個外部IO,寫0、1對應(yīng)的IO則輸出低、高電平?,F(xiàn)在我們通過C語言指針的操作方式,讓GPIOB的16個IO都輸出高電平,見如下代碼。
// GPIOB 端口全部輸出 高電平 *(unsigned int*)(0x4001 0C0C) = 0xFFFF;
0x40010C0C在我們看來是GPIOB端口ODR的地址,但是在編譯器看來,這只是一個普通的變量,是一個立即數(shù),要想讓編譯器也認(rèn)為是指針,我們得進(jìn)行強制類型轉(zhuǎn)換,把它轉(zhuǎn)換成指針,即(unsigned int *)0x4001 0C0C,然后再對這個指針進(jìn)行*操作。
通過絕對地址訪問內(nèi)存單元不好記憶且容易出錯,可以通過寄存器的方式來操作,具體見如下代碼。
//GPIOB端口全部輸出高電平 #defineGPIOB_ODR(unsignedint*)(GPIOB_BASE+0x0C) *GPIOB_ODR=0xFF;
審核編輯:湯梓紅
-
單片機
+關(guān)注
關(guān)注
6030文章
44489瀏覽量
631989 -
寄存器
+關(guān)注
關(guān)注
31文章
5294瀏覽量
119816 -
存儲器
+關(guān)注
關(guān)注
38文章
7430瀏覽量
163517 -
STM32
+關(guān)注
關(guān)注
2264文章
10854瀏覽量
354298 -
C語言
+關(guān)注
關(guān)注
180文章
7594瀏覽量
135861
原文標(biāo)題:STM32單片機中C語言操作寄存器的原理
文章出處:【微信號:單片機與嵌入式,微信公眾號:單片機與嵌入式】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論