<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 寄存器物理地址映射到結構體封裝的寄存器的過(guò)程

寄存器物理地址映射到結構體封裝的寄存器的過(guò)程

作者: 時(shí)間:2016-11-26 來(lái)源:網(wǎng)絡(luò ) 收藏
一、 STM32頭文件中 結構體封裝寄存器的方式

typedef struct
{
vu32 CR;
vu32 CFGR;
vu32 CIR;
vu32 APB2RSTR;
vu32 APB1RSTR;
vu32 AHBENR;
vu32 APB2ENR;
vu32 APB1ENR;
vu32 BDCR;
vu32 CSR;
} RCC_TypeDef;

本文引用地址:http://dyxdggzs.com/article/201611/321901.htm

#define PERIPH_BASE((u32)0x40000000)

#define AHBPERIPH_BASE(PERIPH_BASE + 0x20000)

#define RCC_BASE(AHBPERIPH_BASE + 0x1000)

#define RCC((RCC_TypeDef *) RCC_BASE)

在頭文件中這樣定義后,就可以在程序中以

RCC->CR|=0x00010000;來(lái)直接操作某一寄存器了。

二、對這一方式的分析與總結也就是關(guān)于單片機寄存器封裝問(wèn)題:

最近在學(xué)習嵌入式linux過(guò)程中,看到 DM368寄存器地址映射到結構體封裝的寄存器的系統文件。因為嵌入式linux開(kāi)發(fā)沒(méi)有像單片機一樣的編譯軟件,系統文件不是編譯軟件本身自帶的。嵌入式編程需要自己找到需要用的模塊的頭文件,來(lái)操作相應的寄存器,編寫(xiě)相應的驅動(dòng)。于是乎,在看別人的程序時(shí),迷迷糊糊的就從主程序看到了驅動(dòng)程序,又看到了底層操作寄存器的程。為了徹底搞懂嵌入式程序,終于注意到了以前單片機編程時(shí)沒(méi)怎么注意過(guò)的結構體封裝寄存器,映射物理地址。看了好半天也沒(méi)有看明白 宏定義是如何映射地址的,關(guān)鍵是這樣語(yǔ)法的一句話(huà):

#define RCC((RCC_TypeDef *) RCC_BASE)

RCC_BASE的定義是 #define RCC_BASE(AHBPERIPH_BASE + 0x1000)  是物理地址經(jīng)過(guò)代換(AHBPERIPH_BASE + 0x1000)=0x40021000

經(jīng)過(guò)思索和討教,對這種封裝寄存器的來(lái)龍去脈終于恍然大悟。

首先,碰到#define一定要牢記C語(yǔ)言老師的教誨--‘僅僅是替換’。因此在使用結構體封裝的寄存器來(lái)操作寄存器時(shí),如RCC->CR =0x00實(shí)際上等價(jià)于 ((RCC_TypeDef *) RCC_BASE)->CR=0x00。 進(jìn)一步,將RCC_BASE替換為 (AHBPERIPH_BASE + 0x1000) ,這里AHBPERIPH_BASE是地址,也是常量。于是整句話(huà)就被還原為 ((RCC_TypeDef *)0x40021000)->CR=0x00 。

也就是 先對地址常量 (AHBPERIPH_BASE + 0x1000) 進(jìn)行強制類(lèi)型轉換為 (RCC_TypeDef )類(lèi)型的結構體指針。由結構體指針的相關(guān)知識可知,將一個(gè)地址指向結構體,那么該地址后面的地址會(huì )自動(dòng)按結構體中定義的結構體成員來(lái)劃分。所以 ,作為該結構體的第一個(gè)成員CR,((RCC_TypeDef *)0x40021000)->CR也就是代表 (AHBPERIPH_BASE + 0x1000) 。 以此類(lèi)推 ,,((RCC_TypeDef *)0x40021000)->CFGR 則代表

RCC_BASE(0x40021000)的下一段地址 即0x40021004 (手冊中 RCC_CFGR寄存器的地址)。

可以看到這種結構體封裝寄存器方式訪(fǎng)問(wèn)寄存器的實(shí)質(zhì)仍然是直接對寄存器所在的物理地址操作??!

至于為什么用這種方式來(lái)封裝結構體??梢詤⒖?strong>51單片機寄存器的定義方式。keil中51單片機每一個(gè)寄存器是直接給出對應的存儲器地址,而沒(méi)有用這種結構體方式封裝。因為操作寄存器的實(shí)質(zhì)永遠都是對寄存器所在的地址操作。 STM32 中寄存器很多,如果像51一樣 對每一個(gè)寄存器地址給定一個(gè)寄存器名稱(chēng),太繁雜而且沒(méi)有直觀(guān)性。結構體封裝,可以直觀(guān)的看出每個(gè)模塊中有哪些寄存器,方便編程。

圖:keil中51寄存器的定義方式



評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>