官术网_书友最值得收藏!

1.6 設(shè)備驅(qū)動(dòng)Hello World:LED驅(qū)動(dòng)

1.6.1 無(wú)操作系統(tǒng)時(shí)的LED驅(qū)動(dòng)

在嵌入式系統(tǒng)的設(shè)計(jì)中,LED一般直接由CPU的GPIO(通用可編程I/O)口控制。GPIO一般由兩組寄存器控制,即一組控制寄存器和一組數(shù)據(jù)寄存器。控制寄存器可設(shè)置GPIO口的工作方式為輸入或者輸出。當(dāng)引腳被設(shè)置為輸出時(shí),向數(shù)據(jù)寄存器的對(duì)應(yīng)位寫入1和0會(huì)分別在引腳上產(chǎn)生高電平和低電平;當(dāng)引腳設(shè)置為輸入時(shí),讀取數(shù)據(jù)寄存器的對(duì)應(yīng)位可獲得引腳上的電平為高或低。

在本例子中,我們屏蔽具體CPU的差異,假設(shè)在GPIO_REG_CTRL物理地址中控制寄存器處的第n位寫入1可設(shè)置GPIO口為輸出,在地址GPIO_REG_DATA物理地址中數(shù)據(jù)寄存器的第n位寫入1或0可在引腳上產(chǎn)生高或低電平,則在無(wú)操作系統(tǒng)的情況下,設(shè)備驅(qū)動(dòng)見代碼清單1.3。

代碼清單1.3 無(wú)操作系統(tǒng)時(shí)的LED驅(qū)動(dòng)

 1 #define reg_gpio_ctrl *(volatile int *)(ToVirtual(GPIO_REG_CTRL))
 2 #define reg_gpio_data *(volatile int *)(ToVirtual(GPIO_REG_DATA))
 3 /* 初始化LED */
 4 void LightInit(void)
 5 {
 6   reg_gpio_ctrl |= (1 << n); /* 設(shè)置GPIO為輸出 */
 7 }
 8
 9 /* 點(diǎn)亮LED */
10 void LightOn(void)
11 {
12   reg_gpio_data |= (1 << n); /* 在GPIO上輸出高電平 */
13 }
14
15 /* 熄滅LED */
16 void LightOff(void)
17 {
18   reg_gpio_data &= ~(1 << n); /* 在GPIO上輸出低電平 */
19 }

上述程序中的LightInit()、LightOn()、LightOff()都直接作為驅(qū)動(dòng)提供給應(yīng)用程序的外部接口函數(shù)。程序中ToVirtual()的作用是當(dāng)系統(tǒng)啟動(dòng)了硬件MMU之后,根據(jù)物理地址和虛擬地址的映射關(guān)系,將寄存器的物理地址轉(zhuǎn)化為虛擬地址。

主站蜘蛛池模板: 和平县| 苏尼特左旗| 六安市| 吉林省| 和田市| 台前县| 达日县| 阜新| 大化| 合作市| 平塘县| 颍上县| 荆门市| 淳安县| 凌海市| 南木林县| 渭源县| 淮阳县| 子洲县| 浪卡子县| 东乡族自治县| 安吉县| 佛山市| 洪雅县| 武功县| 永修县| 综艺| 盐山县| 瑞安市| 眉山市| 南岸区| 九龙城区| 许昌市| 富平县| 巴马| 石河子市| 萍乡市| 游戏| 佛山市| 安图县| 南和县|