蜂鸣器驱动的学习

蜂鸣器驱动

蜂鸣器分直流和交流两种,所谓的直流蜂鸣器是加个电压就可以响,交流蜂鸣器其实就相当于一个喇叭,直接加直流后不会出声或者声音很低,需要外加脉冲才能正常工作,这个脉冲可以是方波,也可以是一段音乐,这个信号属于交流信号。

mini2440的蜂鸣器连接图如下:

貌似这是一个交流蜂鸣器,所以需要pwm驱动。

在此之前先介绍几个函数:

S3C2410_GPB

如果gpioa的最低位引脚偏移量为0,总的来说s3c2410_gpb求得是b中的各个引脚相对于GPIOa最低位的偏移量。

s3c2410_gpio_cfgpin

用法:

s3c2410_gpio_cfgpin(S3C2410_GPB(0), S3C2410_GPIO_OUTPUT);

功能:

这个函数的功能是配置IO口的功能。

源码:

纠结了一晚上,原来奥秘就在s3c24xx_gpio_base中。

s3c24xx_gpio_base直接根据端口号算出了其对应的虚拟地址,太nb了吧,不用映射吗?下面来看看这个源码:

可以看出,根据pin对应的寄存器的偏移量计算出其虚拟地址,这里的0xf4000000是早就设定好的地址,我的理解是初始化的时候这以及这之后的一段地址就已经映射到了物理内存,现在直接用就好了。

这里有个问题,就是3G-3G+896M范围内都是直接映射,我的理解是直接映射区域最大896M,这里应该不足896M,剩下的部分分配给了动态内存映射区,也就是说0xf4000000以及之后的一块其实是动态映射到了0x51000000(差不多是这个数。。)左右的物理内存。

大神原话如下:

s3c2410_gpio_setpin

用法:

s3c2410_gpio_setpin(S3C2410_GPB(0), 0);

功能:

将io口拉高或者拉低。

Ioctl的命令构造:

其实ioctl的命令就是个数,但是为了防止你的驱动一不小心打开别的文件结果命令恰巧还对的上,ioctl的命令分为以下几个部分:

1. 幻数:说白了,不同的驱动程序所用的幻数应该是不同的

2. 序号,你自己的驱动程序中命令的序号

3. 数据流向,如果要传参,则涉及到数据流向

4. 数据大小

Cmd的构造方式如下:

_IO(type,nr) //没有参数的命令

_IOR(type,nr,size) //该命令是从驱动读取数据

_IOW(type,nr,size) //该命令是从驱动写入数据

_IOWR(type,nr,size) //双向数据传输

从cmd中提取参数的宏如下:

_IOC_DIR(cmd) //从命令中提取方向

_IOC_TYPE(cmd) //从命令中提取幻数

_IOC_NR(cmd) //从命令中提取序数

_IOC_SIZE(cmd) //从命令中提取数据大小

混杂设备驱动

自动生成设备文件,初始化

设置PWM流程

1. 设置预分频寄存器(TCFG0)

2. 设置分割值(在预分频的基础上再次分割)(TCFG1)

3. 设置计数器的值(TCNTB)

4. 设置占空比(TCMPB)

5. 将控制寄存器器设置为自动重载,然后手动更新一次(TCNTB和TCMPB中的值装入TCNT、TCMP),开启定时器(TCON)

6. 关闭手动更新(TCON)

来自为知笔记(Wiz)

时间: 2024-12-28 21:07:56

蜂鸣器驱动的学习的相关文章

八、蜂鸣器驱动--学习笔记

第八章.蜂鸣器驱动--学习笔记 蜂鸣器是 S3C6410 开发板上带的一个硬件设备.可以通过向寄存器写入特定的值来控制蜂鸣器 发出尖叫声.本节将介绍蜂鸣器实现原犁,并实现一个完整的蜂呜器驱动(可以打开和关闭蜂鸣器).PWM驱动的实现方式不同于LED驱动,PWM驱动将由多个文件组成.这也是大多数i n u x驱动的标准实现方式.也就是说--个复杂的驱动不太可能将所有的代码都放在…个文件中.最好将相关的代码放在相应的文件中.在编译L i n u x驱动时将这些文件进行联合编译.本节将介绍把Li n

第八章 让开发板发出声音:蜂鸣器驱动

这一章的主要内容是让开发板发出声音——蜂鸣器驱动,在Linux驱动开发中重点也学习了这一部分内容,同时最后我们小组的考核内容是通过中断控制蜂鸣器发七个音符的音. 这一部分中,要中断控制蜂鸣器,在中断和蜂鸣器代码的基础上进行增加.中断与蜂鸣器的代码不变,在中断的测试代码中,首先要定义七个音符,之后将开发板上的七个键与七个音符相连接,再将七个音符的转换与蜂鸣器相连接,来达到所需的效果. 核心代码: int main() { int fd,fd1; int div; int keyval; fd1 =

第8章 让开发板发出声音,蜂鸣器驱动 心得体会

第8章让开发板发出声音,蜂鸣器驱动 心得体会 通过学习Android深度探索(卷1)HAL与驱动开发的第8章 让开发板发出声音,蜂鸣器驱动,我加深对驱动的认识.以下主要是我对本节实验和参考在Linux驱动开发中使用PWM控制蜂鸣器中的一些见解. 先编写一个简单的蜂鸣器驱动程序,根据开发板上的硬件IO接口和Android驱动规范,在kernel中的driver目录中新建一个Buzzer文件,新建一个buzzer.c的源文 在目录下创建一个Makefile文件 先运行make clean命令清楚到编

第八章、让开发板发出声音:蜂鸣器驱动

通过对这一章节的学习我学到了如下知识: 一.蜂鸣器的知识:蜂鸣器也称为PWM(脉冲宽度调制),其基本原理是通过脉冲来控制蜂鸣器的打开和关闭,定时器的输出引脚与蜂鸣器的三极管相连,此电路的三极管是PNP性,当引脚是高电平时,此三极管处于饱和状态,电路导通,电流流过蜂鸣器,此时蜂鸣器发声,反之,当引脚是高电平时,此三极管处于截止状态,电路关断,蜂鸣器停止发声.       蜂鸣器驱动由三个文件组成:pwm_c.pwm_fun.h.pwm_fun.c.其中pwm.c是驱动主程序.pwm_fun.h引用

第八章 蜂鸣器驱动

(1)代码重用 代码重用分为静态和动态两种.静态方式为编译由多个文件组成的 Linux 驱动,这种方式是代码级的重用,也就是将需要重用的代码和使用这些代码的使用者放在一起进行编译,最终生成一个可执行文件或程序 库 (.ko. .so 等).另外一种代码共享的方式:模块依赖,也称为导出符号.如果只能用一句话解释 如何利用导出符号实现代码共享,这句话就是“在一个驱动模块里使用另一个驱动模块里的被导出 的符号(常章.变量.函数等〉”,在 Linux 驱动中可以使用如下两个宏导出函数: EXPORT S

Android深度探索(卷1)HAL与驱动开发学习笔记(2)

Android深度探索(卷1)HAL与驱动开发学习笔记(2) 第二章搭建Android开发环境 书中介绍了两种JDK的安装方法, 方法一: 从官网下载JDK并进行配置,解压后在终端打开profile文件来设置PATH环境变量(# soure /etc/profile),打开profile文件后输入下面的内容 export PATH=.:developer/jdk6/bin:$PATH 保存profile文件以后,有两种方法可以重新加载profile文件. 1.# sourse  /etc/pro

让开发板发出声音:蜂鸣器驱动

第八章介绍了一个个实验:蜂鸣器驱动,让开发板发出声音. 将介绍蜂鸣器的实现原理,并实现一个完整的蜂鸣器驱动,通过该驱动可以控制蜂鸣器的打开与关闭. 蜂鸣器也称为PWM脉冲宽度调制,基本原理就是通过脉冲来控制蜂鸣器的打开和停止.蜂鸣器是开发板上带的一个硬件设备,可以通过向寄存器写入特定的值来控制蜂鸣器发出的声音.本节介绍了蜂鸣器的实现原理,并实现一个完整的蜂鸣器驱动,可以打开和关闭.PWM驱动的实现方式不同于LED驱动,PWM驱动由多个文件组成,这也是大多数Linux驱动的标准实现方式. Linu

第八章 让开发板发出声音:蜂鸣器驱动 心得笔记

蜂鸣器也称为PWM脉冲宽度调制,基本原理就是通过脉冲来控制蜂鸣器的打开和停止.蜂鸣器是开发板上带的一个硬件设备,可以通过向寄存器写入特定的值来控制蜂鸣器发出的声音.本节介绍了蜂鸣器的实现原理,并实现一个完整的蜂鸣器驱动,可以打 开和关闭.PWM驱动的实现方式不同于LED驱动,PWM驱动由多个文件组成,这也是大多数Linux驱动的标准实现方式. Linux驱动的代码重用有很多种方法.分为静态重用和动态重用,静态重用是代码级的重用,就是将需要重用的代码和使用这些代码的文档放在一起编 译,最终生成一个

Linux设备驱动开发学习(1):前言

虽然网络上已经有很多Linux设备驱动开发学习的文章和博客,更是有很多经典的Linux设备驱动开 发的书籍,写这些博文似乎意义不大,但把自己的学习过程.学习心得记录下来,一方面有着强化巩固的 意义,另一方面也是把所学知识转化为自己所得的必要途径之一,这是我写这些的博客的原始动力.