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