版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第9章
設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā)實(shí)例本章要點(diǎn)1、GPIO設(shè)備驅(qū)動(dòng)程序設(shè)計(jì)2、鍵盤(pán)驅(qū)動(dòng)程序的設(shè)計(jì)3、直流電機(jī)驅(qū)動(dòng)程序的設(shè)計(jì)4、步進(jìn)電機(jī)驅(qū)動(dòng)程序的設(shè)計(jì)5、數(shù)碼管驅(qū)動(dòng)程序的設(shè)計(jì)9.1通用I/O接口驅(qū)動(dòng)程序設(shè)計(jì)通用I/O接口(GeneralPurposeIO,GPIO)是嵌入式系統(tǒng)中一種非常重要的I/O接口。它具有使用靈活、可配置性好、硬件代價(jià)小等優(yōu)點(diǎn),在嵌入式系統(tǒng)中廣泛應(yīng)用。9.1.1
GPIO設(shè)備驅(qū)動(dòng)
GPIO屬于字符設(shè)備,其驅(qū)動(dòng)可以歸類(lèi)為L(zhǎng)inux設(shè)備驅(qū)動(dòng)的字符設(shè)備驅(qū)動(dòng)。開(kāi)發(fā)這類(lèi)設(shè)備驅(qū)動(dòng),要為設(shè)備分別設(shè)計(jì)設(shè)備驅(qū)動(dòng)程序和用戶(hù)應(yīng)用程序,其設(shè)備驅(qū)動(dòng)程序的一般方法與步驟與上節(jié)內(nèi)容是相同的。9.1.2
PXA270的GPIO端口簡(jiǎn)介PXA270處理器在設(shè)計(jì)上有121個(gè)復(fù)用功能輸入輸出GPIO端口的引腳,但其中的GPIO119與GPIO120兩端口沒(méi)被引出,因此,實(shí)際可用的只有119個(gè)引腳,它們是GPIO0~GPIO118,其端口名為GPIO<120:0>。PXA270處理器的每一個(gè)GPIO端口都可以由軟件設(shè)置來(lái)滿(mǎn)足各種系統(tǒng)配置和設(shè)計(jì)需求。9.1.3編寫(xiě)LED設(shè)備驅(qū)動(dòng)程序【例9-1】編寫(xiě)一個(gè)PXA270開(kāi)發(fā)板上連接在GPIO端口的LED驅(qū)動(dòng)程序,使開(kāi)發(fā)板上的發(fā)光二極管每隔1秒鐘閃爍一次。1、LED電路分析我們要編寫(xiě)一個(gè)驅(qū)動(dòng)程序及應(yīng)用程序來(lái)控制GPIO96的電平。通過(guò)接在GPIO端口的LED按照一定的時(shí)間間隔亮滅閃爍來(lái)判斷,是否CPU做出了正確的響應(yīng)。其電路原理圖如圖9.1所示:2、編寫(xiě)LED驅(qū)動(dòng)程序LED驅(qū)動(dòng)程序見(jiàn)教材,將其保存為:led_drv.c文件。9.1.4編寫(xiě)LED用戶(hù)應(yīng)用程序在編寫(xiě)用戶(hù)應(yīng)用程序過(guò)程中,考慮通過(guò)接口open()函數(shù)打開(kāi)設(shè)備,再通過(guò)接口ioctl()函數(shù)來(lái)實(shí)現(xiàn)對(duì)LED的控制功能。其調(diào)用關(guān)系如圖9.2所示:在用戶(hù)應(yīng)用程序中,其核心語(yǔ)句為:接口ioctl()的參數(shù)在0、1之間交替取值,使得驅(qū)動(dòng)程序中第31、32行的狀態(tài)交替出現(xiàn),控制GPIO的輸出電平高低變化,從而使發(fā)光二極管LED按照一定的時(shí)間間隔亮滅,實(shí)現(xiàn)閃爍的效果。即:當(dāng)LED_OFF代表數(shù)值0,LED_ON代表數(shù)值1時(shí)
ioctl(fd,LED_OFF);
sleep(1);
//休眠1秒鐘
ioctl(fd,LED_ON);
sleep(1);
//休眠1秒鐘9.2鍵盤(pán)驅(qū)動(dòng)程序的設(shè)計(jì)9.1.1鍵盤(pán)原理介紹1、按鍵原理鍵盤(pán)電路點(diǎn)觸按鍵產(chǎn)生抖動(dòng)2.矩陣鍵盤(pán)原理9.2.2鍵盤(pán)驅(qū)動(dòng)程序設(shè)計(jì)思路分析下面以一個(gè)6×4按鍵的鍵盤(pán)為例來(lái)講述鍵盤(pán)驅(qū)動(dòng)程序的設(shè)計(jì)方法。該鍵盤(pán)有四列,其地址分別為:0xfe、0xfd、0xfb、Oxf7。該鍵盤(pán)的六行地址分別為:0xfe、0xfd、0xfb、Oxf7、0xef、0xdf。各行按鍵的地址分布排列如表9.1所示:表9.2各按鍵的地址分布排列1、頭文件#include<linux/config.h>#include<linux/kernel.h>#include<linux/sched.h>#include<linux/timer.h>#include<linux/init.h>#include<linux/module.h>#include<asm/hardware.h>#include<asm/io.h>#include<linux/delay.h>#include<linux/fs.h>2、處理設(shè)備I/O端口的數(shù)據(jù)的幾個(gè)重要函數(shù)(1)ioremap()函數(shù)函數(shù)ioremap()的作用是把一個(gè)物理內(nèi)存地址點(diǎn)映射為一個(gè)內(nèi)核指針,實(shí)現(xiàn)從物理地址到內(nèi)核空間虛擬地址的映射。(2)inb()函數(shù)函數(shù)inb(<端口地址>)作用是從端口讀取一個(gè)字節(jié),這個(gè)函數(shù)的返回值就是從這個(gè)端口讀取到的數(shù)據(jù)。(3)outb()函數(shù)函數(shù)outb(<數(shù)值>,<端口地址>)的作用是向端口發(fā)送數(shù)值。3、設(shè)備初始化定義設(shè)備驅(qū)動(dòng)程序的初始化函數(shù)KEYBOARD_CTL_init(),在該函數(shù)中實(shí)現(xiàn)向系統(tǒng)注冊(cè)設(shè)備號(hào)、設(shè)備名稱(chēng)和初始化寄存器。(1)向系統(tǒng)注冊(cè)設(shè)備(2)初始化寄存器(3)初始化函數(shù)KEYBOARD_init()4、驅(qū)動(dòng)程序的file-operation數(shù)據(jù)結(jié)構(gòu)5、鍵盤(pán)掃描的接口函數(shù)【例9-2】編寫(xiě)一個(gè)6×4按鍵的鍵盤(pán)驅(qū)動(dòng)程序。源程序見(jiàn)教材9.2.4鍵盤(pán)用戶(hù)應(yīng)用程序設(shè)計(jì)1、鍵盤(pán)用戶(hù)應(yīng)用程序設(shè)計(jì)分析(1)獲取設(shè)備驅(qū)動(dòng)程序的文件描述符(2)調(diào)用設(shè)備驅(qū)動(dòng)程序中的read()方法,讀取檢測(cè)到的按鍵數(shù)據(jù)值(3)在用戶(hù)應(yīng)用程序中還用到一個(gè)函數(shù)usleep(),usleep()函數(shù)的作用是:休眠若干微秒,延遲執(zhí)行的時(shí)間,起到去除抖動(dòng)的作用。9.3直流電機(jī)驅(qū)動(dòng)程序設(shè)計(jì)9.3.1直流電機(jī)控制電路設(shè)計(jì)1、GPIO端口控制直流電機(jī)原理圖利用嵌入式開(kāi)發(fā)板的GPIO端口控制直流電機(jī)是嵌入式系統(tǒng)的一個(gè)應(yīng)用。GPIO端口與電機(jī)驅(qū)動(dòng)模塊相連,其電路原理圖如圖9.7所示。2、電機(jī)驅(qū)動(dòng)芯片L298特性簡(jiǎn)介
L298N是一種高電壓、大電流電機(jī)驅(qū)動(dòng)芯片。表9.3控制電機(jī)旋轉(zhuǎn)方式電機(jī)旋轉(zhuǎn)方式控制端IN1控制端IN2控制端IN3控制端IN4輸入PWM信號(hào)改變脈寬可調(diào)速調(diào)速端A調(diào)速端BM1正轉(zhuǎn)高低//高/反轉(zhuǎn)低高//高/停止低低//高/M2正轉(zhuǎn)//高低/高反轉(zhuǎn)//低高/高停止低低///高9.3.2直流電機(jī)驅(qū)動(dòng)程序1、設(shè)備初始化(1)向系統(tǒng)注冊(cè)設(shè)備我們定義電機(jī)的主設(shè)備號(hào)宏符號(hào)名為ZLDJ_MAJOR,設(shè)備名稱(chēng)為zldj_drv,設(shè)備的結(jié)構(gòu)體為&ZLDJ_ops,則:
devfs_register_chrdev(ZLDJ_MAJOR,"zldj_drv",ZLDJ_ops);(2)設(shè)備初始化函數(shù)(3)驅(qū)動(dòng)程序的file-operation數(shù)據(jù)結(jié)構(gòu)staticstruct
file_operations
ZLDJ_ops={
ioctl:ZLDJ_ioctl,};2、控制直流電機(jī)轉(zhuǎn)動(dòng)和停止的接口函數(shù)定義控制直流電機(jī)轉(zhuǎn)動(dòng)和停止的接口函數(shù)ioctl()。主要是設(shè)置寄存器GPSR與寄存器GPCR的值。GPSR為置位寄存器,當(dāng)取值1時(shí),電機(jī)開(kāi)始旋轉(zhuǎn)。
GPSR2|=(0x1<<20);//電機(jī)正轉(zhuǎn)
GPSR2|=(0x1<<18);//電機(jī)反轉(zhuǎn)GPCR為復(fù)位寄存器,當(dāng)取值1時(shí),電機(jī)停止轉(zhuǎn)動(dòng)。
GPCR2|=(0x1<<20);//電機(jī)正轉(zhuǎn)停止
GPCR2|=(0x1<<18);//電機(jī)反轉(zhuǎn)停止9.3.3直流電機(jī)用戶(hù)應(yīng)用程序(1)獲取直流電機(jī)驅(qū)動(dòng)程序的文件描述符fd=open("/dev/zldj_drv",O_RDWR);(2)調(diào)用設(shè)備驅(qū)動(dòng)程序中的ioctl()方法,向電機(jī)發(fā)出控制指令:
ioctl(fd,0x1,1000);9.4步進(jìn)電機(jī)驅(qū)動(dòng)器設(shè)計(jì)9.4.2嵌入式系統(tǒng)控制步進(jìn)電機(jī)
9.4.3步進(jìn)電機(jī)驅(qū)動(dòng)程序設(shè)計(jì)1、頭文件設(shè)計(jì)鍵盤(pán)驅(qū)動(dòng)程序,要使用Linux系統(tǒng)頭文件,其頂部位于/*ARM_Linux。2、設(shè)備初始化定義初始化函數(shù)BJDJ_init(),在該函數(shù)中實(shí)現(xiàn)向系統(tǒng)注冊(cè)設(shè)備號(hào)、設(shè)備名稱(chēng)和初始化寄存器。(1)向系統(tǒng)注冊(cè)設(shè)備ret=devfs_register_chrdev(BJDJ_MAJOR,"BJDJ",&bjdj_ops);(2)初始化通用I/O端口GPIO對(duì)通用I/O端口GPIO的GPDR和GAFR寄存器設(shè)置初值:GPSR為置位寄存器,當(dāng)1時(shí),電機(jī)開(kāi)始旋轉(zhuǎn)。GPCR為復(fù)位寄存器,當(dāng)1時(shí),電機(jī)停止轉(zhuǎn)動(dòng)。GPDR為方向寄存器,1為輸出,0為輸入。GAFR為第二功能寄存器,3、定義設(shè)備數(shù)據(jù)結(jié)構(gòu)由于本驅(qū)動(dòng)程序只需對(duì)設(shè)備I/O端口進(jìn)行控制處理,故在設(shè)備驅(qū)動(dòng)的數(shù)據(jù)結(jié)構(gòu)中僅定義了一個(gè)ioctl()接口函數(shù):staticstruct
file_operations
bjdj_ops={
ioctl: bjdj_ioctl,
};
4、對(duì)電機(jī)設(shè)備控制的ioctl()函數(shù)(1)定義數(shù)組bit[],接收來(lái)自用戶(hù)應(yīng)用程序的指令。
bit[0]=(cmd&0x01)>>0;bit[1]=(cmd&0x02)>>1;bit[2]=(cmd&0x04)>>2;bit[3]=(cmd&0x08)>>3;bit[4]=(cmd&0x10)>>4;bit[5]=(cmd&0x20)>>5;bit[6]=(cmd&0x40)>>6;bit[7]=(cmd&0x80)>>7;(2)控制轉(zhuǎn)動(dòng)角度和方向由用戶(hù)應(yīng)用程序發(fā)送1組cmd指令:0x07、0x0b、0x0d、0x0e,數(shù)組bit[]得到4組不同的數(shù)值,從而控制步進(jìn)電機(jī)轉(zhuǎn)動(dòng)角度和方向。若要正轉(zhuǎn):GPSR為置位寄存器,當(dāng)1時(shí),步進(jìn)電機(jī)開(kāi)始旋轉(zhuǎn)。若要停止:GPCR為復(fù)位寄存器,當(dāng)1時(shí),步進(jìn)電機(jī)停止轉(zhuǎn)動(dòng)。(3)為控制電機(jī)旋轉(zhuǎn),對(duì)數(shù)組賦值
switch(bit[0]){ case1:
/*將GPSR1的第20位設(shè)置為1*/ GPSR1|=(0x1<<20);
break; case0:
/*將GPCR1的第20位設(shè)置為1*/ GPCR1|=(0x1<<20);
break; default: return0; }9.4.4步進(jìn)電機(jī)用戶(hù)應(yīng)用程序設(shè)計(jì)打開(kāi)設(shè)備文件獲取文件描述符
fd=open("/dev/BJDJ",O_RDWR);
然后,通過(guò)選擇“1”、“2”及其他數(shù)值來(lái)控制電機(jī)旋轉(zhuǎn)狀況。9.5
數(shù)碼管驅(qū)動(dòng)程序設(shè)計(jì)9.5.1數(shù)碼管工作原理 數(shù)碼管所組成的數(shù)字由7段LED組成,另外還有一個(gè)發(fā)光的小數(shù)點(diǎn)。這8個(gè)發(fā)光二極管分別為a、b、c、d、e、f、g段和DP點(diǎn)。其實(shí)物、分段編號(hào)及連線示意圖如圖9.14所示。
9.5.2譯碼器74LS48簡(jiǎn)介通常在嵌入式系統(tǒng)處理器與數(shù)碼管之間有一個(gè)譯碼器,由譯碼器完成譯碼工作。由于中央處理器的輸出信號(hào)是4位的8421BCD碼,需要用譯碼器將其轉(zhuǎn)換成7位二進(jìn)制信號(hào)。74LS48芯片是一種常用的七段數(shù)碼管譯碼器驅(qū)動(dòng)器,常用在各種數(shù)字電路和嵌入式系統(tǒng)的顯示系統(tǒng)中。9.5.3數(shù)碼管驅(qū)動(dòng)程序設(shè)計(jì)實(shí)例1、驅(qū)動(dòng)程序的主要功能模塊(1)GPIO端口的初始化設(shè)置設(shè)置GPDR2為I/O輸出端口(GPDR2端口詳見(jiàn)本章表9.1),該模塊由初始化函數(shù)HW_SERIAL_LED_init()調(diào)用,其代碼如下:voidgpio_init(void){GPDR2位于[95:64],0x3左移26位,則GPIO90和GPIO91為1,即將其設(shè)為輸出。
printk("GPDR2=%x\n",GPDR2);GPDR2=GPDR2|(0x3<<26); printk("GPDR2=%x\n",GPDR2);}(2)用戶(hù)空間與內(nèi)核空間操作接口用戶(hù)空間與內(nèi)核空間操作接口由file_operations結(jié)構(gòu)體定義,這個(gè)結(jié)構(gòu)體在驅(qū)動(dòng)程序中完成了用戶(hù)空間應(yīng)用程序操作函數(shù)與內(nèi)核空間操作函數(shù)的一一對(duì)應(yīng),代碼如下:struct
file_operations
LED_ops={open:LED_open,read:LED_read,write:LED_write,ioctl:LED_ioctl,release:LED_release,};(3)數(shù)碼管顯示數(shù)字的SERIAL_LED_write()函數(shù)模塊
數(shù)碼管的功能是將數(shù)字信號(hào)正確顯示出來(lái),該功能由SERIAL_LED_write()函數(shù)實(shí)現(xiàn),其代碼如下:ssize_t
SERIAL_LED_write(structfile*file,constchar*buf,size_tcount,loff_t*f_ops){
inti;
printk("data=%x\n",*buf);調(diào)用函數(shù)顯示數(shù)字函數(shù)
write_byte(*buf); returncount;} 2、數(shù)字顯示函數(shù)(1)控制LED管的亮滅由置位寄存器和復(fù)位寄存器輸出高電平或低電平來(lái)控制LED管的亮滅。其代碼如下:voidwrite_bit(intdata){ GPCR2|=(0x1<<27);
if((data&0x80)==0x80)
GPSR2|=(0x1<<26); else
GPCR2|=(0x1<<26);
GPSR2|=(0x1<<27);}(2)由七段LED管組成數(shù)字
voidwrite_byte(intdata){
inti;
for(i=0;i<8;i++)
write_bit(data<<i);}3、函數(shù)write_byte(intdata)顯示數(shù)字情況分析(1)data=0x3f當(dāng)data<<(左移)i位,i=0,1,2,…,7時(shí),data與0x80=10000000按位與運(yùn)算(2)data=0x0
寄存器取值與七段LED亮滅所組成數(shù)字的關(guān)系
data顯示DP(點(diǎn))(g)(f)(e)(d)(c)(b)(a)data=0x3f0GPCR2GPCR2GPSR2GPSR2GPSR2GPSR2GPSR2GPSR2
data=0x061GPCR2GPCR2GPCR2GPCR2GPCR2GPSR2GPSR2
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年寶雞三和職業(yè)學(xué)院招聘(3人)考試參考試題及答案解析
- 涼山州公安局2026年公開(kāi)考試招聘警務(wù)輔助人員(30人)考試備考試題及答案解析
- 2026年陜西博遠(yuǎn)貿(mào)易服務(wù)有限公司招聘筆試參考題庫(kù)及答案解析
- 2026年天津市北辰區(qū)中醫(yī)醫(yī)院公開(kāi)招聘事業(yè)單位6人考試參考題庫(kù)及答案解析
- 2025江西南昌市建設(shè)投資集團(tuán)有限公司招聘20人考試備考試題及答案解析
- 2026國(guó)新新格局(北京)私募證券基金管理有限公司相關(guān)崗位招聘1人考試參考題庫(kù)及答案解析
- 2026江西南昌陸軍步兵學(xué)院幼兒園社會(huì)招聘1人筆試參考題庫(kù)及答案解析
- 2026云南昭通永善縣統(tǒng)計(jì)局招聘公益性崗位2名考試備考題庫(kù)及答案解析
- 上海光通信有限公司2026屆校園招聘考試備考試題及答案解析
- 2026年涿州中醫(yī)醫(yī)院招聘?jìng)淇碱}庫(kù)含答案詳解
- 2025春季學(xué)期國(guó)家開(kāi)放大學(xué)本科《工程數(shù)學(xué)》一平臺(tái)在線形考(形成性考核作業(yè)1至5)試題及答案
- 幼兒教師AI賦能教學(xué)能力提升培訓(xùn)
- 2024年內(nèi)蒙古氣象部門(mén)招聘呼和浩特包頭鄂爾多斯等考試真題
- 機(jī)械制圖8套試題及答案
- 工程聯(lián)營(yíng)協(xié)議書(shū)范本
- 《先兆流產(chǎn)中西醫(yī)結(jié)合診療指南》
- 醫(yī)保藥械管理制度內(nèi)容
- 商業(yè)地產(chǎn)投資講座
- 江西省贛州市2023-2024學(xué)年高三上學(xué)期期末考試化學(xué)試卷 附答案
- 機(jī)房動(dòng)力環(huán)境監(jiān)控系統(tǒng)調(diào)試自檢報(bào)告
- 國(guó)家職業(yè)技術(shù)技能標(biāo)準(zhǔn) 4-04-05-05 人工智能訓(xùn)練師 人社廳發(fā)202181號(hào)
評(píng)論
0/150
提交評(píng)論