久久婷婷香蕉热狠狠综合,精品无码国产自产拍在线观看蜜,寡妇房东在做爰3,中文字幕日本人妻久久久免费,国产成人精品三上悠亚久久

 

Exynos4412特殊功能寄存器的封裝

作者:秦老師,華清遠見教育科技集團講師。

特殊功能寄(ji)存器(qi)(qi)英文縮寫(xie)為SFR,是(shi)Special Function Register的(de)縮寫(xie)。特殊功能寄(ji)存器(qi)(qi)是(shi)芯(xin)片(pian)功能實現(xian)的(de)載體,可(ke)以理解為芯(xin)片(pian)廠商(shang)留給(gei)嵌入式開發(fa)人(ren)員的(de)控(kong)(kong)制(zhi)接口,用(yong)于控(kong)(kong)制(zhi)片(pian)內外設(she),比如GPIO、UART、ADC等(deng)等(deng)。每(mei)個片(pian)內外設(she)都有對應的(de)特殊寄(ji)存器(qi)(qi),用(yong)于存放相應功能部件的(de)控(kong)(kong)制(zhi)命(ming)令,數據(ju)或者狀態。

對于(yu)特殊功能寄存(cun)器的封裝是每個嵌入式(shi)工程師都(dou)應(ying)該掌握的。那如何(he)封裝芯片(pian)的特殊控制(zhi)寄存(cun)器呢,我們以Exynos4412的GPIO片(pian)內外(wai)設為例說明。

(1)查看Exynos4412芯片的地址映射表

查看Exynos4412芯(xin)片手冊的第二章2 Memory Map(30頁)地(di)址映(ying)射表,我們可以看到Exynos4412的特殊功能寄存器絕(jue)大部分都放到了0x1000_0000到0x1400_0000的地(di)址空(kong)間。

(2)查看GPIO模塊的寄存器描述表

查(cha)看芯(xin)片手冊,第四章4 General Purpose Input/Output (GPIO) Control,4.3節(jie)(41頁)寄(ji)(ji)存器描述,有(you)完整的(de)GPIO模塊的(de)寄(ji)(ji)存器描述表。我們可以(yi)得到GPIO模塊的(de)基地址和每個(ge)寄(ji)(ji)存器相對(dui)基地址的(de)偏移量。

GPIO模塊的基地址是:0x1140_0000
        GPA0組的配置寄存器GPA0CON的地址是: 基地址 + 偏移量
        0x11400000 + 0x0000 = 0x11400000

(3)封裝寄存器的第一種方式是直接一對一封裝

例如:

#define GPA0CON (*(volatile unsigned int *)0x11400000)

分析:

這(zhe)是一個宏定義,宏定義在預處理(li)(li)階段進行直接替換,為(wei)了方便理(li)(li)解(jie)(jie),我們可以(yi)先把volatile去掉,關鍵是理(li)(li)解(jie)(jie)(*(unsigned int *)0x11400000)。

0x11400000 是(shi)一個(ge)16進制(zhi)的(de)數據,前面用(unsigned int *)修飾(shi),表示把(ba)0x11400000強制(zhi)轉換(huan)成了一個(ge)指向unsigned int型變量(liang)的(de)指針。簡單的(de)說,(unsigned int *)0x11400000指向了內存中從0x11400000開始(shi)的(de)連續的(de)4個(ge)字節空間。(0x11400000—0x11400003)。

(*(unsigned int *)0x11400000)是在(unsigned int *)0x11400000又加(jia)了(le)一個指(zhi)針(zhen)運算符*,表示取內存單元里(li)的數(shu)據。

volatile是(shi)(shi)(shi)C語言的(de)(de)(de)32個關(guan)鍵(jian)字之一,是(shi)(shi)(shi)一種類型修飾符,用它聲明(ming)的(de)(de)(de)類型變(bian)量表(biao)示可以被某些編譯器(qi)未知的(de)(de)(de)因素更改,比如(ru):操作系(xi)統、硬(ying)件中斷或者線程等。遇到這個關(guan)鍵(jian)字聲明(ming)的(de)(de)(de)變(bian)量,編譯器(qi)對(dui)訪問該變(bian)量的(de)(de)(de)代碼就不(bu)再進行優化,每次讀(du)取這個變(bian)量的(de)(de)(de)值都是(shi)(shi)(shi)要從內存單元(yuan)里讀(du)取,而不(bu)是(shi)(shi)(shi)直接使用放在高速緩存或寄存器(qi)里的(de)(de)(de)備份。從而可以提供對(dui)特殊地址的(de)(de)(de)穩定訪問。

使用:

我們(men)像unsigned int變(bian)量一(yi)樣訪問特(te)殊(shu)功能寄存器。

GPA0CON = (GPA0CON & ~(0xf<<4))| 1<<4; //將GPA0_1引腳設置為輸出功能

(4)封裝寄存器的第二種方式是結構體封裝

例如:

/* GPA0 */
        typedef struct {
                unsigned int CON;
                unsigned int DAT;
                unsigned int PUD;
                unsigned int DRV;
                unsigned int CONPDN;
                unsigned int PUDPDN;
        }gpa0;
       &nbsp;#define GPA0 (* (volatile gpa0 *)0x11400000)

分析:

typedef 關鍵字聲明(ming)了(le)名為(wei)gpa0的(de)(de)結(jie)構體(ti)類型(xing),結(jie)構體(ti)內(nei)又定義(yi)了(le) 6個(ge)unsigned int類型(xing)的(de)(de)變(bian)量。unsigned int 類型(xing)變(bian)量為(wei) 32 位,在內(nei)存內(nei)存空間 中占4 個(ge)字節。

#define GPA0 (* (volatile gpa0 *)0x11400000)聲(sheng)明了一個(ge)(ge)gpa0類型結(jie)(jie)構體(ti)的(de)(de)宏,結(jie)(jie)構體(ti)名是(shi)結(jie)(jie)構體(ti)首(shou)成(cheng)(cheng)員(yuan)的(de)(de)地(di)(di)址(zhi)(zhi),GPA0這(zhe)個(ge)(ge)結(jie)(jie)構體(ti)的(de)(de)首(shou)成(cheng)(cheng)員(yuan)CON地(di)(di)址(zhi)(zhi)為0x11400000,占4個(ge)(ge)字(zi)節,在c語言中(zhong)結(jie)(jie)構體(ti)內的(de)(de)成(cheng)(cheng)員(yuan)變量是(shi)連(lian)續的(de)(de),那么GPA0結(jie)(jie)構體(ti)的(de)(de)第二(er)個(ge)(ge)成(cheng)(cheng)員(yuan)DAT得地(di)(di)址(zhi)(zhi)為:0x11400000+0x04 = 0x11400004。這(zhe)個(ge)(ge) 0x04 偏移(yi)量,正是(shi)GPA0DAT寄存器(qi)相對(dui)于GPIO基地(di)(di)址(zhi)(zhi)的(de)(de)偏移(yi)地(di)(di)址(zhi)(zhi)。

結構體內其它成員的偏移量,也(ye)和相(xiang)應的寄存器偏移地址(zhi)相(xiang)符。因此,我(wo)們(men)匹配了結構體的首(shou)地址(zhi),就可以確定各寄存器的具體地址(zhi)了。

使用:

我們用訪問結構體變(bian)量成員的方(fang)式,訪問寄存器。

GPA0.CON = (GPA0.CON & ~(0xf<<4))| 1<<4; //將GPA0_1引腳設置為輸出功(gong)能

(5)使用集成(cheng)開發環境的芯(xin)片寄(ji)存(cun)器封裝

嵌(qian)入(ru)式開(kai)發中我們把常用的寄(ji)存(cun)器(qi)寫到一個頭文(wen)件(jian)中,每次使用的時候直接包(bao)含就可以。也有(you)很(hen)多集(ji)成開(kai)發環境會提供這樣的芯(xin)片特殊寄(ji)存(cun)器(qi)頭文(wen)件(jian),比如在(zai)keil中創建arm7三星s3c2410芯(xin)片相(xiang)關的工程,點(dian)擊鼠(shu)標右鍵可以添#include <S3C2410A.H>頭文(wen)件(jian)。但不是所有(you)芯(xin)片都支持。