




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、蜂鳴器驅(qū)動(dòng)課程設(shè)計(jì)專(zhuān) 業(yè): xxxxxxxxxxxxxx 班 級(jí): xxxxxxxxx 學(xué) 號(hào): xxxxxxxxx 姓 名: xxxx 設(shè)計(jì)題目: 蜂鳴器驅(qū)動(dòng)程序設(shè)計(jì) 2016年12月 目錄一.任務(wù)21.目標(biāo)22.環(huán)境23.需求:2二總體設(shè)計(jì)21.處理流程22.模塊介紹33.模塊接口設(shè)計(jì)34.各個(gè)模塊設(shè)計(jì)3三.PWM蜂鳴器字符設(shè)備驅(qū)動(dòng)31.模塊設(shè)計(jì)31. 模塊介紹32. 模塊結(jié)構(gòu)圖42.接口設(shè)計(jì)41. 數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)42. 驅(qū)動(dòng)程序接口43.函數(shù)設(shè)計(jì)41.初始化函數(shù)5 2. 字符設(shè)備打開(kāi)函數(shù)6 3. 字符設(shè)備關(guān)閉函數(shù)7 4. 模塊卸載函數(shù).85. 文件操作接口函數(shù)8四. PWM蜂鳴器字符設(shè)備驅(qū)
2、動(dòng)測(cè)試81. 調(diào)用系統(tǒng)函數(shù)ioctl實(shí)現(xiàn)對(duì)蜂鳴器的控制85 tiny210開(kāi)發(fā)板調(diào)試.96 綜合設(shè)計(jì)總結(jié)與思考.101. 任務(wù)1.目標(biāo):編寫(xiě)按鍵蜂鳴器驅(qū)動(dòng)程序函數(shù)與測(cè)試文件,實(shí)現(xiàn)上位機(jī)與tiny210-SDK開(kāi)發(fā)板的連接,利用函數(shù)實(shí)現(xiàn)對(duì)蜂鳴器通過(guò)按鍵來(lái)啟動(dòng)與關(guān)閉。2.環(huán)境:軟件環(huán)境:windows 7 系統(tǒng)和VMware Workstation 軟件硬件環(huán)境:tiny210 開(kāi)發(fā)板 , 內(nèi)核部分 Linux-3.0.8 , 交叉編譯版本 arm-linux-gcc-4.5.1-v6-vfp1Linux系統(tǒng)介紹: Linux是一種自由開(kāi)發(fā)源碼的類(lèi)Unix操作系統(tǒng),存在這許多不同的Linux版本,
3、但它們都使用了Linux內(nèi)核。Linux可安裝在各種計(jì)算機(jī)硬件設(shè)備中,比如手機(jī)、平板電腦、路由器、視頻游戲控制臺(tái)、臺(tái)式計(jì)算機(jī)、大型機(jī)和超級(jí)計(jì)算機(jī)。 Linux是一個(gè)領(lǐng)先的操作系統(tǒng),世界上運(yùn)算最快的10臺(tái)超級(jí)計(jì)算機(jī)運(yùn)行的都是Linux操作系統(tǒng)。嚴(yán)格來(lái)說(shuō),Linux這個(gè)詞本身只表示Linux內(nèi)核,但實(shí)際上人們已經(jīng)習(xí)慣了用Linux來(lái)形容整個(gè)基于Linux內(nèi)核,并且使用GNU工程各種工具和數(shù)據(jù)庫(kù)的操作系統(tǒng)。Linux得名于天才程序員林納斯·托瓦茲。 tiny210開(kāi)發(fā)板中模塊介紹:PWM蜂鳴器模塊PWM(脈沖寬度調(diào)制)簡(jiǎn)單的講是一種變頻技術(shù)之一,是靠改變脈沖寬度來(lái)控制輸出電壓,通過(guò)改變周期
4、來(lái)控制其輸出頻率。來(lái)看看我們實(shí)際生活中的例子,我們的電風(fēng)扇為什么扭一下按扭,風(fēng)扇的轉(zhuǎn)速就會(huì)發(fā)生變化;調(diào)一下收音機(jī)的聲音按鈕,聲音的大小就會(huì)發(fā)生變化。這些都是PWM的應(yīng)用,都是通過(guò)PWM輸出的頻率信號(hào)進(jìn)行控制的。蜂鳴器的種類(lèi)和工作原理蜂鳴器主要分為壓電式蜂鳴器和電磁式蜂鳴器兩種類(lèi)型。 壓電式蜂鳴器主要由多諧振蕩器、壓電蜂鳴片、阻抗匹配器及共鳴箱、外殼等組成。有的壓電式蜂鳴器外殼上還裝有發(fā)光二極管。多諧振蕩器由晶體管或集成電路構(gòu)成。當(dāng)接通電源后(1.515V直流工作電壓),多諧振蕩器起振,輸出1.52.5kHZ的音頻信號(hào),阻抗匹配器推動(dòng)壓電蜂鳴片發(fā)聲。
5、; 電磁式蜂鳴器由振蕩器、電磁線(xiàn)圈、磁鐵、振動(dòng)膜片及外殼等組成。接通電源后,振蕩器產(chǎn)生的音頻信號(hào)電流通過(guò)電磁線(xiàn)圈,使電磁線(xiàn)圈產(chǎn)生磁場(chǎng)。振動(dòng)膜片在電磁線(xiàn)圈和磁鐵的相互作用下,周期性地振動(dòng)發(fā)聲。 有源蜂鳴器和無(wú)源蜂鳴器的區(qū)別:這個(gè)“源”字是不是指電源,而是指震蕩源,即有源蜂鳴器內(nèi)有振蕩源而無(wú)源蜂鳴器內(nèi)部沒(méi)有振蕩源。有振蕩源的通電就可以發(fā)聲,沒(méi)有振蕩源的需要脈沖信號(hào)驅(qū)動(dòng)才能發(fā)聲。3. 需求:要實(shí)現(xiàn)PC與tiny210開(kāi)發(fā)板的通信,要求在PC機(jī)上的VMware Workstation 軟件的Red Hat Enterprise Linux環(huán)境下編寫(xiě)程序,包含蜂鳴器驅(qū)動(dòng)程序和測(cè)試
6、文件。利用交叉編譯器arm-linux-gcc-4.5.1-v6-vfp1生成目標(biāo)文件,最后講目標(biāo)文件下載到開(kāi)發(fā)板,并且驅(qū)動(dòng)蜂鳴器根據(jù)按鍵的不同完成啟動(dòng)或者停止的操作。2 總體設(shè)計(jì)1. 處理流程:2. 模塊介紹:按鍵模塊:通過(guò)按鍵來(lái)操作蜂鳴器的啟動(dòng)與停止。蜂鳴器模塊:通過(guò)加載蜂鳴器驅(qū)動(dòng)模塊到內(nèi)核,驅(qū)動(dòng)蜂鳴器。按鍵模塊:A. 正確驅(qū)動(dòng)主設(shè)備號(hào)和次設(shè)備號(hào)B. 實(shí)現(xiàn)字符設(shè)備驅(qū)動(dòng)程序C. 實(shí)現(xiàn)file-operation結(jié)構(gòu)D. 實(shí)現(xiàn)初始化函數(shù),注冊(cè)字符設(shè)備E. 實(shí)現(xiàn)卸載函數(shù),釋放字符設(shè)備F. 創(chuàng)建文件節(jié)點(diǎn)按鍵模塊:G. 正確驅(qū)動(dòng)住設(shè)備號(hào)和次設(shè)備號(hào)H. 實(shí)現(xiàn)字符設(shè)備驅(qū)動(dòng)程序I. 實(shí)現(xiàn)file-oper
7、ation結(jié)構(gòu)J. 實(shí)現(xiàn)初始化函數(shù),注冊(cè)字符設(shè)備K. 實(shí)現(xiàn)卸載函數(shù),釋放字符設(shè)備L. 創(chuàng)建文件節(jié)點(diǎn)模塊設(shè)計(jì):(1)beep.c#include<linux/init.h>#include<linux/module.h>#include<linux/fs.h>#include<linux/cdev.h>#include<linux/types.h>#include<asm/io.h>#include<asm/uaccess.h>static int beep_major=0;static dev_t beep_d
8、evno;static struct cdev beep_cdev;static int *pload=NULL;#define BEEPNUM 3static int str_len(char *str)int count=0;while(*str!='0')count+;str+;return count;ssize_t beep_read (struct file *fp, char _user *buff, size_t count, loff_t *fps)char string20="HELLO,EVERYONEn"int retur=0;pri
9、ntk("%sn",_FUNCTION_);retur=copy_to_user(buff,string,str_len(string)+1);return retur;ssize_t beep_write (struct file *fp, const char _user *buff, size_t count, loff_t *fps)char string100;int retur=0;printk("%s",_FUNCTION_);retur=copy_from_user(string,buff,count);printk("kern
10、al-> %sn",string);return retur;int beep_open(struct inode *nodep,struct file *fp)unsigned int value=0;printk("%sn",_FUNCTION_);pload=ioremap(0XE02000A0,16);/convert register physical address to virtual addressvalue=ioread32(pload);value&=0x1<<3;value&=0x1<<2;val
11、ue&=0x1<<1;value|=0x1<<0;iowrite32(value,pload);return 0;int beep_release(struct inode *nodep,struct file *fp)printk("%sn",_FUNCTION_);return 0;void beep_start(void)unsigned int value=0;value=ioread32(pload+1);/read data registervalue|=0x1<<0;iowrite32(value,pload+1);
12、void beep_stop(void)unsigned int value=0;value=ioread32(pload+1);/read data registervalue&=0x1<<0;iowrite32(value,pload+1);long beep_unlocked_ioctl(struct file *fp,unsigned int cmd,unsigned long param)printk("%sn",_FUNCTION_);switch(cmd)case 0:/beep stopbeep_stop();break;case 1:/
13、beep startbeep_start();break;return 0;static struct file_operations beep_ops=.open=beep_open,.release=beep_release,.read=beep_read,.write=beep_write,.unlocked_ioctl=beep_unlocked_ioctl;static void alloc_beep_dev_num(void) if(beep_major>0) beep_devno=MKDEV(beep_major,0); register_chrdev_region(bee
14、p_devno,BEEPNUM,"beep"); else alloc_chrdev_region(&beep_devno,0,BEEPNUM,"beep"); beep_major=MAJOR(beep_devno); printk("beep_major = %dn",beep_major);static void initial_cdev(void) cdev_init(&beep_cdev,&beep_ops); beep_cdev.owner=THIS_MODULE; beep_cdev.ops=&a
15、mp;beep_ops; beep_cdev.dev=beep_devno; beep_cdev.count=BEEPNUM; cdev_add(&beep_cdev,beep_devno,BEEPNUM);/register a cdev variable to linux kernelstatic int _init beep_init(void) printk("%sn",_FUNCTION_); alloc_beep_dev_num();/get device number initial_cdev();/initial and register cdev
16、variable return 0;static void _exit beep_exit(void) printk("%sn",_FUNCTION_);unregister_chrdev_region(beep_devno,BEEPNUM);cdev_del(&beep_cdev); return ;module_init(beep_init);module_exit(beep_exit);3. PWM蜂鳴器字符設(shè)備驅(qū)動(dòng)1.蜂鳴器模塊介紹及結(jié)構(gòu)圖開(kāi)發(fā)板上蜂鳴器原理圖分析由原理圖可以得知,蜂鳴器是通過(guò)GPD0 IO口使用PWM信號(hào)驅(qū)動(dòng)工作的,而GPD0口是一個(gè)復(fù)用的
17、IO口,要使用它得先把他設(shè)置成TOUT0 PWM輸出模式。GPD0參數(shù)要讓蜂鳴器發(fā)聲,需要兩大要素:將蜂鳴器接到正確的端口并且設(shè)置為輸出口,將端口設(shè)置為高電平要使蜂鳴器發(fā)聲,就是要讓GPD0作為輸出端,同時(shí)該端口要設(shè)為高電平。也就是說(shuō)GPD0設(shè)置為01為輸出,讓GPDDAT的最后一位設(shè)置為1則該端口就置成了高電平。2模塊代碼分析:2.1打開(kāi)設(shè)備模塊 int beep_open(struct inode *nodep,struct file *fp)unsigned int value=0;printk("%sn",_FUNCTION_);pload=ioremap(0XE0
18、2000A0,16);/convert register physical address to virtual addressvalue=ioread32(pload);value&=0x1<<3;value&=0x1<<2;value&=0x1<<1;value|=0x1<<0;iowrite32(value,pload);return 0;此函數(shù)實(shí)現(xiàn)了怎么去打開(kāi)設(shè)備,在設(shè)備文件上的第一個(gè)操作,并不要求驅(qū)動(dòng)程序一定要實(shí)現(xiàn)這個(gè)方法。如果該項(xiàng)為NULL,設(shè)備的打開(kāi)操作永遠(yuǎn)成功。Open方法是驅(qū)動(dòng)程序用來(lái)為以后的操作完成初始
19、化準(zhǔn)備工作的。在大部分驅(qū)動(dòng)程序中,open完成如下工作:初始化設(shè)備,標(biāo)明次設(shè)備號(hào)。2.2關(guān)閉設(shè)備模塊int beep_release(struct inode * fnode,struct file *fs) printk("%sn",_FUNCTION_); return 0;當(dāng)設(shè)備文件被關(guān)閉時(shí)調(diào)用這個(gè)操作。與open相仿,release也可以沒(méi)有,此處關(guān)閉函數(shù)為beep_release。Release方法的作用正好與open相反,它應(yīng)該:關(guān)閉設(shè)備。本驅(qū)動(dòng)程序要進(jìn)行讀和寫(xiě)。ssize_t beep_read (struct file *fp, char _user *bu
20、ff, size_t count, loff_t *fps)char string20="HELLO,EVERYONEn"int retur=0;printk("%sn",_FUNCTION_);retur=copy_to_user(buff,string,str_len(string)+1);return retur;ssize_t beep_write (struct file *fp, const char _user *buff, size_t count, loff_t *fps)char string100;int retur=0;print
21、k("%s",_FUNCTION_);retur=copy_from_user(string,buff,count);printk("kernal-> %sn",string);return retur;2.3 開(kāi)啟蜂鳴器void beep_start(void)unsigned int value=0;value=ioread32(pload+1);/read data registervalue|=0x1<<0;iowrite32(value,pload+1);2.4 關(guān)閉蜂鳴器void beep_stop(void)unsigne
22、d int value=0;value=ioread32(pload+1);/read data registervalue&=0x1<<0;iowrite32(value,pload+1);恢復(fù)GPD0口為IO口輸出功能,由原理圖可知直接給低電平可讓蜂鳴器停止工作。2.5 ioctl控制模塊long beep_unlocked_ioctl(struct file *fp,unsigned int cmd,unsigned long param)printk("%sn",_FUNCTION_);switch(cmd)case 0:/beep stopbe
23、ep_stop();break;case 1:/beep startbeep_start();break;return 0;應(yīng)用程序向設(shè)備發(fā)送命令,設(shè)備接受到命令并進(jìn)行解析,并做相應(yīng)的設(shè)置并啟動(dòng)設(shè)備工作或停止工作。如果輸入的參數(shù)大于0,就讓蜂鳴器開(kāi)始工作,不同的參數(shù),蜂鳴器的頻率也不一樣。2.6 重要數(shù)據(jù)結(jié)構(gòu)模塊在Linux字符設(shè)備驅(qū)動(dòng)程序設(shè)計(jì)中,有3種非常重要的數(shù)據(jù)結(jié)構(gòu):Struct fileStruct inodeStruct file_operations Struct File代表一個(gè)打開(kāi)的文件。系統(tǒng)中每個(gè)打開(kāi)的文件在內(nèi)核空間都有一個(gè)關(guān)聯(lián)的 struct file。它由內(nèi)核在打開(kāi)文件時(shí)
24、創(chuàng)建, 在文件關(guān)閉后釋放。重要成員:loff_t * fp/*文件讀寫(xiě)位置*/struct file_operations *fp Struct Inode用來(lái)記錄文件的物理上的信息。因此, 它和代表打開(kāi)文件的file結(jié)構(gòu)是不同的。一個(gè)文件可以對(duì)應(yīng)多個(gè)file結(jié)構(gòu), 但只有一個(gè)inode 結(jié)構(gòu)。 重要成員:dev_t:設(shè)備號(hào) struct file_operations一個(gè)函數(shù)指針的集合,定義能在設(shè)備上進(jìn)行的操作。結(jié)構(gòu)中的成員指向驅(qū)動(dòng)中的函數(shù), 這些函數(shù)實(shí)現(xiàn)一個(gè)特別的操作, 對(duì)于不支持的操作保留為NULL。static struct file_operations beep_ops= .ope
25、n = beep_open, .release =beep_release, .read = beep_read, .write = beep_write, .unlocked_ioctl =beep_unlocked_ioctl,2.7 在linux 內(nèi)核中,字符設(shè)備使用 struct cdev 來(lái)描述。字符設(shè)備的注冊(cè)可分為如下3個(gè)步驟:分配cdev初始化cdev添加cdevStruct cdev的分配可使用cdev_alloc函數(shù)來(lái)完成。Struct cdev的初始化使用cdev_init函數(shù)來(lái)完成。struct cdev的注冊(cè)使用cdev_add函數(shù)來(lái)完成。2.8 設(shè)備注銷(xiāo)模塊stati
26、c void _exit beep_exit(void) printk("%sn",_FUNCTION_);unregister_chrdev_region(beep_devno,BEEPNUM);cdev_del(&beep_cdev); return ;此函數(shù)實(shí)現(xiàn)該混雜設(shè)備的注銷(xiāo)。4. 蜂鳴器驅(qū)動(dòng)測(cè)試模塊和截圖1、模塊代碼:#include<stdio.h>#include<fcntl.h>#include<stdlib.h>#include<string.h>int main(void) int fp=0;int
27、 i=0;fp=open("/dev/beep",O_RDWR,0x777);if(fp<=0)printf("fail in opening beep device filen");return 0;while(i<5)ioctl(fp,1,0);sleep(1);ioctl(fp,0,0);sleep(1);i+; close(fp); return 0; 測(cè)試程序解析:該測(cè)試程序先執(zhí)行打開(kāi)設(shè)備文件,往設(shè)備中寫(xiě)入命令和參數(shù)來(lái)實(shí)現(xiàn)對(duì)蜂鳴器的控制。蜂鳴器的開(kāi)啟與關(guān)閉間隔及蜂鳴器的頻率取決于往設(shè)備里寫(xiě)的命令與參數(shù)。運(yùn)行結(jié)果及截圖beep_open蜂鳴器開(kāi)始工作,beep_release蜂鳴器停止工作五
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 教育科技的力量?jī)?yōu)化教學(xué)流程
- 挖掘教育大數(shù)據(jù)潛力無(wú)限的決策支持系統(tǒng)
- 超市收銀員培訓(xùn)手冊(cè)
- 全球創(chuàng)新藥研發(fā)成本控制與效益分析2025年研究報(bào)告
- Cationomycin-生命科學(xué)試劑-MCE
- 新疆維吾爾自治區(qū)七校聯(lián)考2024-2025學(xué)年九年級(jí)化學(xué)第一學(xué)期期末學(xué)業(yè)質(zhì)量監(jiān)測(cè)模擬試題含解析
- 唐山師范學(xué)院《農(nóng)產(chǎn)品市場(chǎng)營(yíng)銷(xiāo)》2023-2024學(xué)年第一學(xué)期期末試卷
- 2025屆江蘇省邗江區(qū)化學(xué)九上期末綜合測(cè)試試題含解析
- 寧夏師范學(xué)院《數(shù)理統(tǒng)計(jì)與隨機(jī)過(guò)程》2023-2024學(xué)年第一學(xué)期期末試卷
- 公路貨運(yùn)行業(yè)數(shù)字化轉(zhuǎn)型與綠色運(yùn)輸模式創(chuàng)新報(bào)告
- 公司安全隱患排查記錄表
- 糧食的形態(tài)與化學(xué)組成第二節(jié)糧食的主要化學(xué)成分下64課件
- 中國(guó)農(nóng)田水利行業(yè)發(fā)展前景及發(fā)展策略與投資風(fēng)險(xiǎn)研究報(bào)告2025-2028版
- 余料使用管理制度
- 農(nóng)業(yè)面源防治課件
- 2025至2030中國(guó)氨基吡啶行業(yè)項(xiàng)目調(diào)研及市場(chǎng)前景預(yù)測(cè)評(píng)估報(bào)告
- 2025-2030中國(guó)商業(yè)展示道具市場(chǎng)應(yīng)用前景及投資價(jià)值評(píng)估報(bào)告
- 2025年甘肅省武威市民勤縣西渠鎮(zhèn)人民政府選聘專(zhuān)業(yè)化管理村文書(shū)筆試參考題庫(kù)及1套完整答案詳解
- 防洪防汛安全知識(shí)試題及答案
- T/CCMA 0137-2022防撞緩沖車(chē)
- 江蘇省2025年中職職教高考文化統(tǒng)考數(shù)學(xué)試題答案
評(píng)論
0/150
提交評(píng)論