色yeye在线视频观看_亚洲人亚洲精品成人网站_一级毛片免费播放_91精品一区二区中文字幕_一区二区三区日本视频_成人性生交大免费看

 

Exynos4412特殊功能寄存器的封裝

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

特殊功能寄存器英文縮寫為SFR,是Special Function Register的縮寫。特殊功能寄存器是芯片功能實現的載體,可以理解為芯片廠商留給嵌入式開發人員的控制接口,用于控制片內外設,比如GPIO、UART、ADC等等。每個片內外設都有對應的特殊寄存器,用于存放相應功能部件的控制命令,數據或者狀態。

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

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

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

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

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

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

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

例如:

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

分析:

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

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

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

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

使用:

我們像unsigned int變量一樣訪問特殊功能寄存器。

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;
        #define GPA0 (* (volatile gpa0 *)0x11400000)

分析:

typedef 關鍵字聲明了名為gpa0的結構體類型,結構體內又定義了 6個unsigned int類型的變量。unsigned int 類型變量為 32 位,在內存內存空間 中占4 個字節。

#define GPA0 (* (volatile gpa0 *)0x11400000)聲明了一個gpa0類型結構體的宏,結構體名是結構體首成員的地址,GPA0這個結構體的首成員CON地址為0x11400000,占4個字節,在c語言中結構體內的成員變量是連續的,那么GPA0結構體的第二個成員DAT得地址為:0x11400000+0x04 = 0x11400004。這個 0x04 偏移量,正是GPA0DAT寄存器相對于GPIO基地址的偏移地址。

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

使用:

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

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

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

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

主站蜘蛛池模板: 波多野结衣一区二区在线 | 日韩欧美毛片免费观看 | JAPANESE少妇高潮喷水 | 嫩草影院国产 | 人人超碰人人超级碰高清 | 18禁成人无遮羞网站免费 | 天天爽亚洲中文字幕 | 日本精品AⅤ一区二区三区 久久久国产精品免费A片 | 老师脱了内裤让我进去 | 美女裸体色黄污视频网站 | 四虎影院永久在线观看 | 99国产精品无码 | 嗯快点别停舒服好爽受不了了 | 92成人午夜福利一区二区 | 久久精品青草社区 | 狼人视频国产在线视频WWW色 | 精品一线二线三线区别在哪欧美 | 国产成人无码一区二区在线播放 | 国产又爽又黄又爽又刺激 | 18成禁人视频免费网站 | 亚洲熟妇自偷自拍另欧美 | 美女露100%奶头无遮挡 | 久久精品中文字幕无码绿巨人 | 亚洲AV噜噜狠狠网址蜜桃 | 出差我被公高潮A片久久 | 国产成人精品久久综合 | 亚洲国产精品久久久久4婷婷 | JVID亚洲精品无圣光图套 | 无码中文精品视视在线观看 | 亚洲av无码成人影院一区 | 亚洲AV成人无码精品综合网站 | 小14萝裸体洗澡视频免费网站 | 色噜噜av亚洲色一区二区 | 狠狠操狠狠搞 | 国产情侣作爱视频免费观看 | 7788成人免费播放网站 | 精品无码国产一区二区三区麻豆 | 太刺激了国语精彩对白 | 女女互揉吃奶揉到高潮视频 | 强壮公弄得我次次高潮HD | 成年女人WWXX免费国产 |