当前位置:首页 > 嵌入式 > 嵌入式云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 )。
换一批
延伸阅读

该项目的灵感源于视障人士在陌生或拥挤环境中行走时所面临的挑战。传统白杖仅在物理接触时才能检测到障碍物,可能无法提供足够的时间反应。为了提升安全性和响应速度,本项目模拟了一个智能系统,能够更早地探测到障碍物并即时发出警报。

关键字: 超声波传感器 蜂鸣器 LED灯 STM32F446RE

水资源管理是家庭、工业和农业系统中的一个重要挑战。手动监测水箱常常会导致溢出、浪费用水或水泵干转等问题。在需要持续监控的实时系统中,这些问题变得更加关键。

关键字: LED指示灯 蜂鸣器 STM32F446RE

我用 Raspberry Pi Pico 和 MicroPython 编程设计了一个数字钢琴。

关键字: 数字钢琴 Raspberry Pi Pico 蜂鸣器

在市场中,您可以购买布雷瑟的气象站,它们可以直接与“天气地下地图”连接,并将您当地的环境数据发布给全世界。所以,如果您愿意的话,根本无需做任何工作。但实际上,据我所知,所有型号都可以用于我们的项目,比如我的这个(7 个接...

关键字: 蜂鸣器 BME280 湿度传感器

我想用ESP32打造一款手持游戏体验。该项目重现了经典的“破砖机”(Breakout)机制,并针对小型OLED屏幕进行了优化。它包括一个由模拟操纵杆控制的反应桨和一个随机评分系统,其中一些块的价值比其他块高5倍。

关键字: OLED ESP32 蜂鸣器

狗被广泛认为是人类最好的朋友,这是有充分理由的——它们忠诚,和它们一起玩很有趣,而且会认真地听命令。但任何养过狗或照顾过狗的人都知道,照顾狗是一项繁重的工作。他们总是需要食物和水。即使在极热或极冷的天气里,它们也需要持续...

关键字: 机器狗 游戏控制器 伺服电机 蜂鸣器

一个通过被动蜂鸣器产生声音的电子笛子,可以主动控制音高、音量和被动照明。我制作这个文档是为了让你去构建它——祝你制作过程愉快!

关键字: 蜂鸣器 Arduino 电位器

本项目演示了如何使用ESP8266开发板和蜂鸣器创建一个简单的钢琴风格的旋律播放器。通过代码精确控制时间和频率,ESP8266可以产生音符,可以用来播放熟悉的曲调,比如《铃儿响叮当》。

关键字: ESP8266 开发板 蜂鸣器

用OLED, RGB led和蜂鸣器升级您的SMARS机器人!遵循我的电路设计,3D打印和自定义Android应用程序控制指南。

关键字: OLED RGB LED 蜂鸣器 机器人

在本教程中,我将使用ESP12E和OLED显示器制作游戏机。有了这个主机,我们可以玩不同类型的复古游戏,如蛇,太空战,猎鸭等,所以让我们开始教程。

关键字: OLED显示屏 ESP12E 蜂鸣器
关闭