蜂鸣器驱动文档模板_第1页
蜂鸣器驱动文档模板_第2页
蜂鸣器驱动文档模板_第3页
蜂鸣器驱动文档模板_第4页
蜂鸣器驱动文档模板_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 易嵌教育南京分中心 安徽理工大学嵌入式系统开发课程设计 专 业: 电子信息技术及仪器 班 级: 电子仪器10-1班 学 号: 2010302936 姓 名: 訾振恒 设计题目: 蜂鸣器字符设备驱动设计 开发日期: 2013/3/27-2013/4/19 目录目录1一.任务21.目标22.环境23.需求:2二总体设计21.处理流程22.模块介绍33.模块接口设计34.各个模块设计3三.PWM蜂鸣器字符设备驱动31.模块设计31. 模块介绍32. 模块结构图42.接口设计41. 数据结构设计42. 驱动程序接口43.函数设计41.初始化函数5 2. 字符设备打开函数6 3. 字符设备关闭函数7

2、4. 模块卸载函数.85. 文件操作接口函数8四. PWM蜂鸣器字符设备驱动测试81. 调用系统函数ioctl实现对蜂鸣器的控制85 MINI2440开发板调试.96 综合设计总结与思考.10一.任务1.目标:编写按键蜂鸣器驱动程序函数与测试文件,实现上位机与mini2440-ARM9开发板的连接,利用函数实现对蜂鸣器通过按键来启动与关闭。2.环境:软件环境:windows 7 系统和VMware Workstation 软件硬件环境:mini2440 开发板 , 内核部分 Linux-2.6.29 , 交叉编译版本 arm-linux-gcc-4.3.2Linux系统介绍: Linux是一种

3、自由开发源码的类Unix操作系统,存在这许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。 Linux是一个领先的操作系统,世界上运算最快的10台超级计算机运行的都是Linux操作系统。严格来说,Linux这个词本身只表示Linux内核,但实际上人们已经习惯了用Linux来形容整个基于Linux内核,并且使用GNU工程各种工具和数据库的操作系统。Linux得名于天才程序员林纳斯·托瓦兹。 Mini2440开发板中模块介绍:PWM蜂鸣器模块PWM(脉冲宽度调制)简单

4、的讲是一种变频技术之一,是靠改变脉冲宽度来控制输出电压,通过改变周期来控制其输出频率。如果还不是很清楚,好吧,来看看我们实际生活中的例子,我们的电风扇为什么扭一下按扭,风扇的转速就会发生变化;调一下收音机的声音按钮,声音的大小就会发生变化;还有待会儿我们要讲的蜂鸣器也会根据不同的输入值而发出不同频率的叫声等等!这些都是PWM的应用,都是通过PWM输出的频率信号进行控制的。ARM Linux中的PWM根据S3C2440的手册介绍,S3C2440A内部有5个16位的定时器,定时器0、1、2、3都带有脉冲宽度调制功能(PWM),定时器4是一个没有输出引脚的内部定时器,定时器0有一个用于大电流设备的死

5、区生成器。看下图解释吧!由S3C2440的技术手册和上面这幅结构图,我们来总结一下2440内部定时器模块的特性吧:1)共5个16位的定时器,定时器0、1、2、3都带有脉冲宽度调制功能(PWM);2)每个定时器都有一个比较缓存寄存器(TCMPB)和一个计数缓存寄存器(TCNTB);3)定时器0、1共享一个8位的预分频器(预定标器),定时器2、3、4共享另一个8位的预分频器(预定标器),其值范围是0255;4)定时器0、1共享一个时钟分频器,定时器2、3、4共享另一个时钟分频器,这两个时钟分频器都能产生5种不同的分频信号值(即:1/2、1/4、1/8、1/16和TCLK);5)两个8位的预分频器是

6、可编程的且根据装载的值来对PCLK进行分频,预分频器和钟分频器的值分别存储在定时器配置寄存器TCFG0和TCFG1中;6)有一个TCON控制寄存器控制着所有定时器的属性和状态,TCON的第07位控制着定时器0、第811位控制着定时器1、第1215位控制着定时器2、第1619位控制着定时器3、第2022位控制着定时器4。还是根据S3C2440手册的描述和上图的结构,要开始一个PWM定时器功能的步骤如下(假设使用的是第一个定时器):1)分别设置定时器0的预分频器值和时钟分频值,以供定时器0的比较缓存寄存器和计数缓存寄存器用;2)设置比较缓存寄存器TCMPB0和计数缓存寄存器TCNTB0的初始值(即

7、定时器0的输出时钟频率);3)关闭定时器0的死区生成器(设置TCON的第4位);4)开启定时器0的自动重载(设置TCON的第3位);5)关闭定时器0的反相器(设置TCON的第2位);6)开启定时器0的手动更新TCNTB0&TCMPB0功能(设置TCON的第1位);7)启动定时器0(设置TCON的第0位);8)清除定时器0的手动更新TCNTB0&TCMPB0功能(设置TCON的第1位)。由此可以看到,PWM的输出频率跟比较缓存寄存器和计数缓存寄存器的取值有关,而比较缓存寄存器和计数缓存寄存器的值又跟预分频器和时钟分频器的值有关;要使用PWM功能其实也就是对定时器的相关寄存器进行操

8、作。手册上也有一个公式:定时器输出频率 = PCLK / 预分频器值 + 1 / 时钟分频值。下面我们来通过一个蜂鸣器的实例来说明PWM功能的使用。3.需求:要实现PC与mini2440开发板的通信,要求在PC机上的VMware Workstation 软件的Red Hat Enterprise Linux 5 环境下编写程序,包含蜂鸣器驱动程序和测试文件。利用交叉编译器arm-linux-gcc-4.3.2生成目标文件,最后讲目标文件下载到开发板,并且驱动蜂鸣器根据按键的不同完成启动或者停止的操作。2 总体设计1. 处理流程:2. 模块介绍:按键模块:通过按键来操作蜂鸣器的启动与停止。蜂鸣器

9、模块:通过加载蜂鸣器驱动模块到内核,驱动蜂鸣器。按键模块:A. 正确驱动住设备号和次设备号B. 实现字符设备驱动程序C. 实现file-operation结构D. 实现初始化函数,注册字符设备E. 实现卸载函数,释放字符设备F. 创建文件节点按键模块:G. 正确驱动住设备号和次设备号H. 实现字符设备驱动程序I. 实现file-operation结构J. 实现初始化函数,注册字符设备K. 实现卸载函数,释放字符设备L. 创建文件节点各个模块设计:3. PWM蜂鸣器字符设备驱动3. 模块介绍:蜂鸣器模块介绍及结构图在S3C2440开发板的芯片上有多种端口和引脚,比如说GPIO口,这是一种既可以作

10、为输入,又可以作为输出的端口,即是一种复用端口,在芯片上有多种分类,分别是GPB、GPC、GPD、GPE、GPF、GPG、GPH、GPJ。GPA0至GPA22是仅仅只能作为输出的端口,GPB0至GPB10是既可以作为输出又可以作为输入的端口,GPC0至GPC15也是既可以作为输入,也可以作为输入的端口,GPD(16个引脚),GPE(16个引脚),GPF(8个引脚),GPG(16个引脚),GPH(11个引脚),GPJ(13个引脚)都是复用端口。要让蜂鸣器发声,需要两大要素:将蜂鸣器接到正确的端口并且设置为输出口,将端口设置为高电平(蜂鸣器接入原理如图1)图1有图1可知:蜂鸣器接在S3C2440芯

11、片的GPB0口,且根据电路基本原理是当GPB0口为高电平时,蜂鸣器开始工作。GPB0端口的高电平的控制在之后作详细的介绍。图2 GPB系列管脚由查表可知,在GPB0口是一个复用的既可以输入又可以输出的端口如图2,并且通过查找S3C2440芯片的原理图可以找到GPB0所在的位置如图3和图4所示图3 S3C2440芯片引脚端口总图图4 GPB0引脚图当蜂鸣器正确接入芯片的时候就要开始对GPB0进行设置了,通过查询S3C2440的数据手册可以发现当GPB0为01时,这个端口即作为输出端口,具体介绍如图5所示:图5 GPB0引脚状态介绍综上所述,要使蜂鸣器发声,就是要让GPB0作为输出端,同时该端口要

12、设为高电平。也就是说GPB0设置为01为输出,让GPBDAT的最后一位设置为1则该端口就置成了高电平。1.2模块代码分析:2.1打开设备模块 static int BUZZER_open(struct inode *inode, struct file *file)if (!down_trylock(&lock)return 0;elsereturn -EBUSY;此函数实现了怎么去打开设备,在设备文件上的第一个操作,并不要求驱动程序一定要实现这个方法。如果该项为NULL,设备的打开操作永远成功。Open方法是驱动程序用来为以后的操作完成初始化准备工作的。在大部分驱动程序中,open完

13、成如下工作:初始化设备,标明次设备号。2.2关闭设备模块static int BUZZER_close(struct inode *inode, struct file *file)BUZZER_Stop();up(&lock); return 0;当设备文件被关闭时调用这个操作。与open相仿,release也可以没有,此处关闭函数为BUZZER_close。Release方法的作用正好与open相反。这个设备方法有时也称为close,它应该:关闭设备。注意:本驱动程序要进行读和写。2.3 开启蜂鸣器并设置蜂鸣器频率/* freq: pclk/50/16/65536 pclk/50/

14、16 * if pclk = 50MHz, freq is 1Hz to 62500Hz * human ear : 20Hz 20000Hz */static void BUZZER_Start( unsigned long freq )unsigned long tcon;unsigned long tcnt;unsigned long tcfg1;unsigned long tcfg0;struct clk *clk_p;unsigned long pclk;/set GPB0 as tout0, pwm outputs3c2410_gpio_cfgpin(S3C2410_GPB(0),

15、 S3C2410_GPB0_TOUT0);/设置gpio的工作模式,是输入,输出还是其他的, 就是设置GPB0为输出模式tcon = _raw_readl(S3C2410_TCON);tcfg1 = _raw_readl(S3C2410_TCFG1); /读取定时器配置寄存器1的值tcfg0 = _raw_readl(S3C2410_TCFG0); /读取定时器配置寄存器0值/prescaler = 50tcfg0 &= S3C2410_TCFG_PRESCALER0_MASK;tcfg0 |= (50 - 1); /fg0的值为49/mux = 1/16tcfg1 &= S3

16、C2410_TCFG1_MUX0_MASK;tcfg1 |= S3C2410_TCFG1_MUX0_DIV16; /设置tcfg1的值为0x0011即:1/16_raw_writel(tcfg1, S3C2410_TCFG1); /将值tcfg1写入定时器配置寄存器1中_raw_writel(tcfg0, S3C2410_TCFG0); /将值tcfg0写入定时器配置寄存器0中clk_p = clk_get(NULL, "pclk");pclk = clk_get_rate(clk_p); /从系统平台时钟队列中获取pclk的时钟频率,在include/linux/clk.

17、h中定义tcnt = (pclk/50/16)/freq; /计算定时器0的输出时钟频率(pclk/prescaler0 + 1/divider value)_raw_writel(tcnt, S3C2410_TCNTB(0); /设置定时器0计数缓存寄存器的值_raw_writel(tcnt/2, S3C2410_TCMPB(0); /设置定时器0比较缓存寄存器的值tcon &= 0x1f;tcon |= 0xb;/disable deadzone, auto-reload, inv-off, update TCNTB0&TCMPB0, start timer 0_raw_w

18、ritel(tcon, S3C2410_TCON); /设置定时器控制寄存器的0-4位,即对定时器0进行控制tcon &= 2;/clear manual update bit_raw_writel(tcon, S3C2410_TCON); /清除定时器0的手动更新位对GPB0复用口进行复用功能设置,设置为TOUT0 PWM输出,置GPIO口为输出功能,往相应的控制寄存器写值,并向相应的数据寄存器写值实现输出低电平还是高电平,控制蜂鸣器的开启与关闭。2.4 关闭蜂鸣器static void BUZZER_Stop(void)s3c2410_gpio_cfgpin(S3C2410_GPB

19、(0), S3C2410_GPIO_OUTPUT);s3c2410_gpio_setpin(S3C2410_GPB(0), 0);恢复GPB0口为IO口输出功能,由原理图可知直接给低电平可让蜂鸣器停止工作。2.5 ioctl控制模块static int BUZZER_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)/printk("ioctl buzzer: %x %lxn", cmd, arg);switch (cmd) case BUZZER_IOCTL_

20、START:if (arg = 0)return -EINVAL;BUZZER_Set_Freq(arg);break;case BUZZER_IOCTL_STOP:BUZZER_Stop();break;return 0;应用程序向设备发送命令,设备接受到命令并进行解析,并做相应的设置并启动设备工作或停止工作。如果输入的参数大于0,就让蜂鸣器开始工作,不同的参数,蜂鸣器的频率也不一样。2.6 重要数据结构模块在Linux字符设备驱动程序设计中,有3种非常重要的数据结构:Struct fileStruct inodeStruct file_operations Struct File代表一个打

21、开的文件。系统中每个打开的文件在内核空间都有一个关联的 struct file。它由内核在打开文件时创建, 在文件关闭后释放。重要成员:loff_t f_pos /*文件读写位置*/struct file_operations *f_op Struct Inode用来记录文件的物理上的信息。因此, 它和代表打开文件的file结构是不同的。一个文件可以对应多个file结构, 但只有一个inode 结构。 重要成员:dev_t i_rdev:设备号 Struct file_operations一个函数指针的集合,定义能在设备上进行的操作。结构中的成员指向驱动中的函数, 这些函数实现一个特别的操作,

22、 对于不支持的操作保留为NULL。static struct file_operations dev_fops = .owner = THIS_MODULE, .open = BUZZER_open, .release = BUZZER_close, .ioctl = BUZZER_ioctl,;2.7 设备注册模块static struct miscdevice misc = .minor = MISC_DYNAMIC_MINOR,.name = DEVICE_NAME,.fops = &dev_fops,;此结构体定义一个混杂设备。static int _init dev_init

23、(void)int ret; init_MUTEX(&lock);ret = misc_register(&misc);printk (DEVICE_NAME"tinitializedn"); return ret;在linux 2.6内核中,字符设备使用 struct cdev 来描述。字符设备的注册可分为如下3个步骤:分配cdev初始化cdev添加cdevStruct cdev的分配可使用cdev_alloc函数来完成。Struct cdev的初始化使用cdev_init函数来完成。struct cdev的注册使用cdev_add函数来完成。2.8 设备

24、注销模块static void _exit dev_exit(void)misc_deregister(&misc);此函数实现该混杂设备的注销。4. 蜂鸣器驱动测试模块和截图1、 模块介绍:,2、模块代码:#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <fcntl.h>#include <linux/ioctl.h>#define beep_majic 'w'#define mybeep_start   _

25、IO(beep_majic,0)#define mybeep_stop   _IO(beep_majic,1)#define mybeep_settime _IO(beep_majic,2)#define mybeep_gettime    _IO(beep_majic,3)int main() int i = 0; int dev_fd; dev_fd = open("/dev/my_beep",O_RDWR | O_NONBLOCK); if ( dev_fd = -1

26、)   printf("Cann't open file /dev/beepn");  exit(1); /启动蜂鸣器 printf("Start beepn"); ioctl (dev_fd, mybeep_settime,20);getchar();/等待键盘输入任何键,然后继续;关闭蜂鸣器 ioctl (dev_fd, mybeep_start,0);/ printf("Stop beep and Close devicen");/ close(dev_fd); wh

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论