蜂鸣器驱动程序设计 - 范文中心

蜂鸣器驱动程序设计

05/17

专 业:

班 级:

学 号:

姓 名:

设计题目:

蜂鸣器驱动 课程设计 xxxxxxxxxxxxxx xxxxxxxxx 蜂鸣器驱动程序设计 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-vfp1

Linux系统介绍:

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

#include

#include

#include

#include

#include

#include

static int beep_major=0;

static dev_t beep_devno;

static struct cdev beep_cdev;

static int *pload=NULL;

#define BEEPNUM 3

static 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 address value=ioread32(pload);

value&=~0x1

value&=~0x1

value&=~0x1

value|=0x1

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 register

value|=0x1

iowrite32(value,pload+1);

}

void beep_stop(void)

{

unsigned int value=0;

value=ioread32(pload+1);//read data register

value&=~0x1

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 stop

beep_stop();

break;

case 1://beep start

beep_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 kernel

}

static int __init beep_init(void)

{

printk("%s\n",__FUNCTION__);

alloc_beep_dev_num();//get device number

initial_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输出模式。

GPD0参数

要让蜂鸣器发声,需要两大要素:①将蜂鸣器接到正确的端口并且设置为输出口,②将端口设置为高电平

要使蜂鸣器发声,就是要让GPD0作为输出端,同时该端口要设为高电平。也就是说GPD0设置为01为输出,让GPDDAT的最后一位设置为1则该端口就置成了高电平。

2模块代码分析:

2.1打开设备模块

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 address value=ioread32(pload); value&=~0x1

此函数实现了怎么去打开设备,在设备文件上的第一个操作,并不要求驱动程序一定要实现这个方法。如果该项为NULL,设备的打开操作永远成功。

Open方法是驱动程序用来为以后的操作完成初始化准备工作的。在大部分驱动程序中,open完成如下工作:初始化设备,标明次设备号。

2.2关闭设备模块

int beep_release(struct inode * fnode,struct file *fs) {

printk("%s\n",__FUNCTION__); return 0; }

当设备文件被关闭时调用这个操作。与open相仿,release也可以没有,此处关闭函数为beep_release。

Release方法的作用正好与open相反,它应该:关闭设备。

本驱动程序要进行读和写。

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; }

2.3 开启蜂鸣器

void beep_start(void)

{ }

unsigned int value=0;

value=ioread32(pload+1);//read data register value|=0x1

iowrite32(value,pload+1);

2.4 关闭蜂鸣器

void beep_stop(void) { unsigned int value=0; value=ioread32(pload+1);//read data register value&=~0x1

恢复GPD0口为IO口输出功能,由原理图可知直接给低电平可让蜂鸣器停止工作。

2.5 ioctl控制模块

long beep_unlocked_ioctl(struct file *fp,unsigned int cmd,unsigned long param) { printk("%s\n",__FUNCTION__); switch(cmd) { case 0://beep stop beep_stop(); break; case 1://beep start beep_start(); break; } return 0; }

应用程序向设备发送命令,设备接受到命令并进行解析,并做相应的设置并

启动设备工作或停止工作。如果输入的参数大于0,就让蜂鸣器开始工作,不同的参数,蜂鸣器的频率也不一样。

2.6 重要数据结构模块

在Linux字符设备驱动程序设计中,有3种非常重要的数据结构: Struct file Struct inode Struct file_operations

Struct File代表一个打开的文件。系统中每个打开的文件在内核空间都有一个关联的 struct file。它由内核在打开文件时创建, 在文件关闭后释放。 重要成员:

loff_t * fp/*文件读写位置*/

struct file_operations *fp

Struct Inode用来记录文件的物理上的信息。因此, 它和代表打开文件的file结构是不同的。一个文件可以对应多个file结构, 但只有一个inode 结构。 重要成员: dev_t:设备号

struct file_operations一个函数指针的集合,定义能在设备上进行的操作。结构中的成员指向驱动中的函数, 这些函数实现一个特别的操作, 对于不支持的操作保留为NULL。

static struct file_operations beep_ops= {

.open = beep_open, .release =beep_release, .read = beep_read, .write = beep_write,

.unlocked_ioctl =beep_unlocked_ioctl, }

2.7

在linux 内核中,字符设备使用 struct cdev 来描述。

字符设备的注册可分为如下3个步骤:

分配cdev 初始化cdev 添加cdev

Struct cdev的分配可使用cdev_alloc函数来完成。 Struct cdev的初始化使用cdev_init函数来完成。 struct cdev的注册使用cdev_add函数来完成。

2.8 设备注销模块

static void __exit beep_exit(void) {

printk("%s\n",__FUNCTION__); unregister_chrdev_region(beep_devno,BEEPNUM); cdev_del(&beep_cdev); return ; }

此函数实现该混杂设备的注销。

四.蜂鸣器驱动测试模块和截图

1、模块代码:

#include #include #include #include int main(void) {

int fp=0; int i=0; fp=open("/dev/beep",O_RDWR,0x777); if(fp

i++; }

close(fp); return 0; }

测试程序解析:

该测试程序先执行打开设备文件,往设备中写入命令和参数来实现对蜂鸣器的控制。蜂鸣器的开启与关闭间隔及蜂鸣器的频率取决于往设备里写的命令与参数。

运行结果及截图

beep_open蜂鸣器开始工作,beep_release蜂鸣器停止工作

五.tiny210开发板调试

1.tiny210开发板测试步骤:

(1)连接开发板电源。

(2)用串口将PC和tiny210开发板相连。

(3)打开SecureCRT软件,点击快速连接,配置端口

协议:Serial

端口:com n(看自己的端口号) 波特率:115200 数据位:8

奇偶校验:none 停止位:1

勾掉RTS/CTS选项 (4)点击连接

(5)打开开发板电源

(6)SecureCRT软件会出现一些选项,选择b,root system

(7)输入指令rz,将beep.ko和pp加载到根文件系统里,再输入指令,将beep测试程序加载到根文件系统。

(8)在SecureCRT里输入insmod beep.ko,将驱动程序加载到内核模块中。 (9)在SecureCRT里输入chmod 777 beep,改变可执行程序的权限。 (10)在SecureCRT里输入./pp。 观看实验现象

六.综合设计总结与思考

这一次易嵌的培训实习,老师给我们安排的设计题目是蜂鸣器驱动程序的设计及开发。第一天培训的时候,老师教我们安装VMware Workstation 软件,由于电脑问题软件装来装去弄了好几遍,虽然花费了不少时间,但也更深刻地记住了软件如何安装和调试的。软件装好后实现虚拟操作环境,首先在虚拟环境中学会编辑简单的C语言(100以内数字输入以及冒泡法排序)及其编译,通过简单的编程,掌握了软件最基本的调试方法和步骤。蜂鸣器设计是最主要也是最难理解的,程序语句相对于基本功没那么扎实的我们来说比较难理解,需要先弄清每个模块的功能,然后再去理解每个模块语句的含义,基础太差语句理解的较困难。经过后两天半老师细心的讲解才有了大致的理解,也初步把学习的课程知识应用到实际操作中,明白课程学习的重要性以及C语言在本专业的重要性,以后学习中还是要多花些时间在编程上,好好提高自己的专业技能。

第一次接触linux操作,会有很多不理解的地方,也是因为对新知识的不了解,通过本次试训自己也在思考自己以后的就业方向以及课程学习的重点,好好利用课余时间多学点知识。

成绩:


相关内容

  • 用单片机驱动蜂鸣器唱歌的设计与原理
    用单片机驱动蜂鸣器唱歌的设计与原理 1. 蜂鸣器 蜂鸣器是一种一体化结构的电子讯响器,主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型,他广泛应用于计算机.打印机.复印机.报警器.电话机等电子产品中作发声器件. 2.单片机驱动 单片机上面使用的蜂 ...
  • 基于单片机的电子密码锁及程序
    基于单片机的电子密码锁设计 摘要 随着科技和人们的生活水平的提高,如何实现家庭防盗这一问题也变的尤为突出,传统的机械锁由于构造简单,被撬事件屡见不鲜.电子密码锁保密性好,使用灵活性高,收到广大用户的青睐. 本设计是以单片机AT89C52作为 ...
  • 89c51抢答器制作
    郑州科技学院 本科课程设计论文 题 目 专 业 姓 名 学 号 指导老师 郑州科技学院信息工程学院 二〇一四年 摘要 ............................................................. ...
  • 密码锁论文
    基于键入控制与无线遥控相结合的密码锁模拟系统的描述 及研究 摘要:本产品采用51单片机为控制系统, 通过密码输入来控制电路工作,同时具备键盘开锁与无线遥控开锁双重功能,本机开锁配有0-9及A,B,C,D 十六个按键,密码正确开锁,错误不开锁 ...
  • 基于51单片机的八位抢答器课程设计
    电子技术应用综合课程设计 -51单片机八位抢答器 目录 第一章:内容提要„„„„„„„„„„„„„„„„„„„„„„„„„„4 1.1设计要求„„„„„„„„„„„„„„„„„„„„„„„„4 1.2总体设计方案„„„„„„„„„„„„„„ ...
  • 智能捕鼠器
    摘 要 当今社会,人们的生活水平和生活方式都在不断的提高,智能化已经在我们 生活中得到了实施.随着科学技术的进步和人们生活条件的友好改善,各种智能设备在人们的生活中不断出现,使人们的生活越来越方便和舒适.其中以单片机为核心实现的智能捕鼠器因 ...
  • 红外传感器制作
    第 I页 2.3设计框图 本次设计是基于STC89C52单片机的电动机保护装置,包括稳压模块.按键控制.红外发射接收模块.模数转换.电机部分. 稳压模块 红外发射 接收模块 模数转换 MCU 信号处理 电 机 按键控制 图2.1 电机保护装 ...
  • 基于单片机的超声波测距仪的设计与实现毕业论文
    基于单片机的超声波测距仪的设计与实现 中文摘要 本设计基于单片机AT89C52,利用超声波传感器HC-SR04.LCD显示屏及蜂鸣器等元件共同实现了带温度补偿功能可报警的超声波测距仪.我们以AT89C52作为主控芯片,通过计算超声波往返时间 ...
  • 知网论文检测查重报告样板20**年
    打印 文本复制检测报告单(全文标明引文) №:ADBD2015R_[***********]0527152407xxxxx 检测时2015-05-27 15:24:07 间: 检测文献: 红外防盗报警系统 作者: XX(xxxxxxxx) ...
  • 基于单片机的三路抢答器的设计 王辉
    基于单片机的三路抢答器的设计 1课程设计的任务与要求 1.1 课程设计的任务 (1)设计一个可供3人进行的抢答器. (2)系统设置复位按钮,按动后,重新开始抢答. (3)抢答器开始时数码管显示序号00,选手抢答实行优先显示,优先抢答选手的编 ...