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

1.6 設備驅動Hello World:LED驅動

1.6.1 無操作系統時的LED驅動

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

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

代碼清單1.3 無操作系統時的LED驅動

 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); /* 設置GPIO為輸出 */
 7 }
 8
 9 /* 點亮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()都直接作為驅動提供給應用程序的外部接口函數。程序中ToVirtual()的作用是當系統啟動了硬件MMU之后,根據物理地址和虛擬地址的映射關系,將寄存器的物理地址轉化為虛擬地址。

主站蜘蛛池模板: 东至县| 邢台市| 芜湖县| 潞城市| 长顺县| 英超| 望都县| 东阳市| 炎陵县| 贡觉县| 白朗县| 梓潼县| 合阳县| 精河县| 萨嘎县| 封开县| 老河口市| 沙河市| 炉霍县| 龙岩市| 塘沽区| 阳新县| 卢氏县| 津南区| 揭东县| 仙游县| 乌拉特中旗| 上饶市| 肃北| 怀远县| 庆城县| 鄂尔多斯市| 邹平县| 汽车| 合江县| 甘泉县| 乌兰浩特市| 汨罗市| 锦屏县| 怀来县| 沈阳市|