当前位置:首页 > 嵌入式 > 嵌入式云IOT技术圈
[导读]上次,我们写了一个LED的驱动程序,这一节,我们只需稍微改动一下就可以实现蜂鸣器的驱动,让我们来看看吧。      还是跟之前一样,先找电路图,找到电路板上对应的引脚和相关联的寄存器。      1、看电路图      (1)蜂鸣器接口位于电路板的底板,看电路图可知

上次,我们写了一个LED的驱动程序,这一节,我们只需稍微改动一下就可以实现蜂鸣器的驱动,让我们来看看吧。

     还是跟之前一样,先找电路图,找到电路板上对应的引脚和相关联的寄存器。

     1、看电路图

     (1)蜂鸣器接口位于电路板的底板,看电路图可知道是高电平有效。


       (2)相对应的找到核心板的接口。由此可知,我们的蜂鸣器是GPD0_0


  接下来找数据手册,找到对应的寄存器,然后配置它就可以了。

  2、查数据手册,找到相关的寄存器,并配置

(1)找到GPD0CON,地址是0x114000A0,我们需要配置GPD0CON(0)为输出状态。也就是写0x1这个值到这个寄存器。

 

(2)找到GPD0DAT这个寄存器,用于配置蜂鸣器的高低电平,物理地址是0x114000A4,刚好与上一个差4个字节的偏移

我们只要对这个寄存器写1和写0,那么蜂鸣器就可以叫起来了,哈哈。是不是很简单?


3、开始写驱动程序。


[plain] view plain copy print?

  1. #include <linux/init.h>  

  2. #include <linux/module.h>  

  3. #include <linux/kernel.h>  

  4. #include <linux/fs.h>  

  5. #include <linux/io.h>  

  6. #include <asm/uaccess.h>  

  7. #include <asm/irq.h>  

  8. #include <asm/io.h>  

  9. #define DEV_NAME    "test-dev"  

  10. //定义蜂鸣器配置IO的地址   

  11. #define GPD0CON  0x114000A0  

  12. volatile unsigned long *bell_config = NULL ;   

  13. volatile unsigned long *bell_dat = NULL ;   

  14. int bell_open(struct inode *inode, struct file *filp)  

  15. {  

  16.     printk("bell_open\n");  

  17.     //清寄存器   

  18.     *bell_config &= ~(0xf);  

  19.     //设置io为输出   

  20.     *bell_config |= (0x1);  

  21.     return 0;  

  22. }  

  23.   

  24. int bell_close(struct inode *inode, struct file *filp)  

  25. {  

  26.     printk("bell_close\n");  

  27.     //关闭蜂鸣器   

  28.     *bell_dat &= ~0x1 ;  

  29.     return 0;  

  30. }  

  31.   

  32. long bell_ioctl(struct file *filp, unsigned int request, unsigned long arg)  

  33. {  

  34.     //控制蜂鸣器的状态   

  35.     switch(request)  

  36.     {  

  37.         case 0:  

  38.             printk(KERN_EMERG"bell on\n");  

  39.             *bell_dat |= 0x1 ;  

  40.             break;  

  41.   

  42.         case 1:  

  43.             printk(KERN_EMERG"bell off\n");  

  44.             *bell_dat &=~0x1 ;  

  45.             break;  

  46.     }  

  47.     return 0 ;  

  48. }  

  49.   

  50. struct file_operations fops = {  

  51.     .owner = THIS_MODULE ,  

  52.     .open = bell_open,  

  53.     .release = bell_close,  

  54.     .unlocked_ioctl = bell_ioctl,  

  55. };  

  56.   

  57. int major ;  

  58. int test_init(void)  

  59. {  

  60.     printk("bell_init\n");  

  61.     //注册设备   

  62.     major = register_chrdev(major, DEV_NAME, &fops);  

  63.     //映射IO   

  64.     bell_config = (volatile unsigned long *)ioremap(GPD0CON , 16);  

  65.     //加4个字节偏移到GP0DAT顺便映射该物理地址   

  66.     bell_dat = bell_config + 1 ;      

  67.     return 0;  

  68. }  

  69.   

  70. void test_exit(void)  

  71. {  

  72.     printk("bell_exit\n");  

  73.     //解除注册   

  74.     unregister_chrdev(major, DEV_NAME);  

  75.     //取消映射   

  76.     iounmap(bell_config);  

  77. }  

  78.   

  79. module_init(test_init);  

  80. module_exit(test_exit);  

  81.   

  82. MODULE_LICENSE("GPL");  

  83. MODULE_AUTHOR("Y.X.YANG");  

  84. MODULE_VERSION("2016.1.16");</span>  

4、写测试程序

[plain] view plain copy print?

  1. #include <stdio.h>  

  2. #include <sys/types.h>  

  3. #include <sys/stat.h>  

  4. #include <fcntl.h>  

  5.   

  6. int main(int argc, char **argv)  

  7. {  

  8.     int fd;  

  9.     //打开设备   

  10.     fd = open("/dev/test-dev",O_RDWR) ;  

  11.     if(-1 == fd)  

  12.     {  

  13.         printf("open fair!\n");  

  14.         return -1 ;  

  15.     }  

  16.     while(1){  

  17.         //打开蜂鸣器   

  18.         ioctl(fd,1);  

  19.         sleep(1);  

  20.         //关闭蜂鸣器   

  21.         ioctl(fd,0);  

  22.         sleep(1);  

  23.     }  

  24.     return 0;  

  25. }</span>  

5、编写makefile

[plain] view plain copy print?

  1. obj-m   += bell.o  

  2.   

  3. ROOTFS = /disk/A9/filesystem  

  4. KERNEL = /disk/A9/linux-3.5/  

  5. all:  

  6.     make -C $(KERNEL) M=`pwd` modules  

  7.   

  8. clean:  

  9.     make -C $(KERNEL) M=`pwd` clean  

  10.     rm -rf my_bell  

  11.   

  12. install:  

  13.     make -C $(KERNEL) M=`pwd` modules_install INSTALL_MOD_PATH=$(ROOTFS)  

  14.   

  15. my_bell:  

  16.     arm-linux-gcc my_bell.c -o my_bell  

  17. </span>  


6、编译


  

7、查看设备主设备号,这里就省略图了,我们得到主设备号是250  cat /proc/devices   

8、创建设备节点  mknod  /dev/test-dev  c   250  0

9、开始执行


由于蜂鸣器的现象没有实质的效果展示,只能通过终端打印,如有兴趣,自己去尝试,用其它板子也可以,就照着我这个方法写驱动,一定成功的!


免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
换一批
延伸阅读

台湾新竹 – 2026 年 10 月 13 日 –––新唐科技近日推出 NSP2340BA24E Smart Buzzer,将语音功能与蜂鸣器驱动整合于单一 IC,让传统压电式蜂鸣器不再局限于单纯的哔哔声,而能直接播放语...

关键字: 蜂鸣器 智能家电 安防系统

问题(厨房瓶颈):现代商用厨房是时间与精准的杰作,但点餐管理系统却存在根本性缺陷。厨师们不得不处理丢失的纸质收据,或频繁触摸油腻且不卫生的触摸屏。每一次与屏幕的物理接触都可能引发交叉污染风险,并导致必须洗手以中断工作流程...

关键字: 视觉AI 电子墨水 蜂鸣器 ESP32-C3

一台小型NVR,但没有报警继电器,想要一个吗?无需订阅,无需云端,只需一块电路板和软件即可。于是,需求催生了另一个奇妙的创意,不久后便诞生了这款产品。虽然做工粗糙,但效果极佳。我在网上找不到类似的产品,所以决定分享一下。

关键字: 继电器 蜂鸣器 ESP

一款简单有趣的Arduino游戏,用于测试你的反应速度。通过LED灯、按钮和蜂鸣器,玩家需要快速响应不断变化的信号。除了娱乐性强之外,该项目还展示了Arduino编程和电子电路设计的基础知识。

关键字: LED 按钮 蜂鸣器 Arduino

火焰无声,但我们可以通过简单的电子元件为它们“安装”耳朵。本DIY项目展示了如何制作一个高度灵敏的独立红外火焰探测器,当检测到火源时,会立即发出声音和视觉警报。该项目无需编写微控制器程序,非常适合电子爱好者、学生和创客作...

关键字: 传感器 整流二极管 蜂鸣器 1N4007

火焰无声,但我们可以通过简单的电子元件为它们“装上耳朵”!这个DIY火灾报警器项目利用红外接收传感器检测火光辐射,并立即触发声音(蜂鸣器)和视觉(LED)报警。该电路以13009 NPN晶体管作为主开关,结构简单、可靠且...

关键字: 蜂鸣器 LED 传感器 1N4007二极管

本项目使用RT-Spark开发板和STM32F407ZGT6微控制器构建,主要通过代码延时来产生频率,实现引脚的开关控制、读取按钮输入、保存状态,并通过被动蜂鸣器发出提示音。

关键字: 蜂鸣器 开发板 STM32F407ZGT6

作为一名创作者和开发者,每天不断查看 AdMob、Cults3D、Google Console 和 YouTube Analytics 的数据会耗费大量时间。我不喜欢日复一日地记录新数据——这对创作者来说实在不现实。为了...

关键字: 显示屏 蜂鸣器 稳压器 ESP32-C3

冰壶运动员在比赛中使用秒表来判断冰球滑下冰面的速度。计时过程还能为运动员提供有关冰面“速度”的信息,即冰球与冰面之间的摩擦力大小。大多数传统秒表在冰壶运动中给运动员带来两个挑战:

关键字: 计时器 蜂鸣器 ESP32

这个项目从广受欢迎的战术射击游戏《反恐精英2》中提取了一个核心的游戏玩法元素,并将其转化为一个真实的互动玩具。该设备采用Arduino Uno/Nano、4x4矩阵键盘、I2C LCD显示屏和蜂鸣器,模拟了游戏中经典的倒...

关键字: Arduino LCD显示屏 蜂鸣器
关闭