当前位置:文档之家› 蜂鸣器驱动程序的设计说明

蜂鸣器驱动程序的设计说明

蜂鸣器驱动课程设计专业: xxxxxxxxxxxxxx 班级: xxxxxxxxx 学号: xxxxxxxxx 姓名: xxxx 设计题目:蜂鸣器驱动程序设计2016年12月目录一.任务 (2)1.目标 (2)2.环境 (2)3.需求: (2)二.总体设计 (2)1.处理流程 (2)2.模块介绍 (3)3.模块接口设计 (3)4.各个模块设计 (3)三.PWM蜂鸣器字符设备驱动 (3)1.模块设计 (3)1. 模块介绍 (3)2. 模块结构图 (4)2.接口设计 (4)1. 数据结构设计 (4)2. 驱动程序接口 (4)3.函数设计 (4)1.初始化函数 (5)2. 字符设备打开函数 (6)3. 字符设备关闭函数 (7)4. 模块卸载函数................................................................... ...................... (8)5. 文件操作接口函数 (8)四. PWM蜂鸣器字符设备驱动测试 (8)1.调用系统函数ioctl实现对蜂鸣器的控制 (8)五.tiny210开发板调试............................................................................. (9)六.综合设计总结与思考................................................................... .. (10)一.任务1.目标:编写按键蜂鸣器驱动程序函数与测试文件,实现上位机与tiny210-SDK开发板的连接,利用函数实现对蜂鸣器通过按键来启动与关闭。

2.环境:①软件环境:windows 7 系统和VMware Workstation 软件②硬件环境:tiny210 开发板,核部分 Linux-3.0.8 ,交叉编译版本arm-linux-gcc-4.5.1-v6-vfp1Linux系统介绍:Linux是一种自由开发源码的类Unix操作系统,存在这许多不同的Linux 版本,但它们都使用了Linux核。

Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。

Linux是一个领先的操作系统,世界上运算最快的10台超级计算机运行的都是Linux操作系统。

严格来说,Linux这个词本身只表示Linux核,但实际上人们已经习惯了用Linux来形容整个基于Linux核,并且使用GNU工程各种工具和数据库的操作系统。

Linux得名于天才程序员林纳斯·托瓦兹。

tiny210开发板中模块介绍:①PWM蜂鸣器模块PWM(脉冲宽度调制)简单的讲是一种变频技术之一,是靠改变脉冲宽度来控制输出电压,通过改变周期来控制其输出频率。

来看看我们实际生活中的例子,我们的电风扇为什么扭一下按扭,风扇的转速就会发生变化;调一下收音机的声音按钮,声音的大小就会发生变化。

这些都是PWM的应用,都是通过PWM输出的频率信号进行控制的。

②蜂鸣器的种类和工作原理蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。

压电式蜂鸣器主要由多谐振荡器、压电蜂鸣片、阻抗匹配器及共鸣箱、外壳等组成。

有的压电式蜂鸣器外壳上还装有发光二极管。

多谐振荡器由晶体管或集成电路构成。

当接通电源后(1.5~15V直流工作电压),多谐振荡器起振,输出1.5~2.5kHZ的音频信号,阻抗匹配器推动压电蜂鸣片发声。

电磁式蜂鸣器由振荡器、电磁线圈、磁铁、振动膜片及外壳等组成。

接通电源后,振荡器产生的音频信号电流通过电磁线圈,使电磁线圈产生磁场。

振动膜片在电磁线圈和磁铁的相互作用下,周期性地振动发声。

有源蜂鸣器和无源蜂鸣器的区别:这个“源”字是不是指电源,而是指震荡源,即有源蜂鸣器有振荡源而无源蜂鸣器部没有振荡源。

有振荡源的通电就可以发声,没有振荡源的需要脉冲信号驱动才能发声。

3.需求:要实现PC与tiny210开发板的通信,要求在PC机上的VMware Workstation 软件的Red Hat Enterprise Linux环境下编写程序,包含蜂鸣器驱动程序和测试文件。

利用交叉编译器arm-linux-gcc-4.5.1-v6-vfp1生成目标文件,最后讲目标文件下载到开发板,并且驱动蜂鸣器根据按键的不同完成启动或者停止的操作。

二.总体设计1.处理流程:2.模块介绍:①按键模块:通过按键来操作蜂鸣器的启动与停止。

②蜂鸣器模块:通过加载蜂鸣器驱动模块到核,驱动蜂鸣器。

①按键模块:A.正确驱动主设备号和次设备号B.实现字符设备驱动程序C.实现file-operation结构D.实现初始化函数,注册字符设备E.实现卸载函数,释放字符设备F.创建文件节点②按键模块:G.正确驱动住设备号和次设备号H.实现字符设备驱动程序I.实现file-operation结构J.实现初始化函数,注册字符设备K.实现卸载函数,释放字符设备L.创建文件节点模块设计:(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_devno;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 string[20]="HELLO,EVERYONE\n";int retur=0;printk("%s\n",__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 string[100];int retur=0;printk("%s",__FUNCTION__);retur=copy_from_user(string,buff,count);printk("kernal----> %s\n",string);return retur;}int beep_open(struct inode *nodep,struct file *fp){unsigned int value=0;printk("%s\n",__FUNCTION__);pload=ioremap(0XE02000A0,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;}int beep_release(struct inode *nodep,struct file *fp){printk("%s\n",__FUNCTION__);return 0;}void beep_start(void){unsigned int value=0;value=ioread32(pload+1);//read data registervalue|=0x1<<0;iowrite32(value,pload+1);}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("%s\n",__FUNCTION__);switch(cmd){case 0://beep stopbeep_stop();break;case 1://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(beep_devno,BEEPNUM,"beep");}else{alloc_chrdev_region(&beep_devno,0,BEEPNUM,"beep");beep_major=MAJOR(beep_devno);}printk("beep_major = %d\n",beep_major);}static void initial_cdev(void){cdev_init(&beep_cdev,&beep_ops);beep_cdev.owner=THIS_MODULE;beep_cdev.ops=&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("%s\n",__FUNCTION__);alloc_beep_dev_num();//get device numberinitial_cdev();//initial and register cdev variable return 0;}static void __exit beep_exit(void){printk("%s\n",__FUNCTION__);unregister_chrdev_region(beep_devno,BEEPNUM);cdev_del(&beep_cdev);return ;}module_init(beep_init);module_exit(beep_exit);三.PWM蜂鸣器字符设备驱动1.蜂鸣器模块介绍及结构图开发板上蜂鸣器原理图分析由原理图可以得知,蜂鸣器是通过GPD0 IO口使用PWM信号驱动工作的,而GPD0口是一个复用的IO口,要使用它得先把他设置成TOUT0 PWM输出模式。

相关主题