完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
本文档介绍了在 iTOP-4418 开发板上用 PWM 控制蜂鸣器输出的测试历程,基于 QtE 系统。4418MCU 共提供了 5 路 PWM 输出,其中一路未引出,所以共有 4 路可用的 PWM 输出。
注意:本文档中提供的例程,没有注册设备和驱动,只是在驱动入口和出口函数中进行了配置。如果用户需要生成设备节点,则需要自行添加剩余部分,这部分可以参考 GPIO 操作的文档。 |
|
|
|
配置 IO
打开底板电路图,搜索“beep”,可以看到 beep 的网络名为“MCU_ISO7816_CLK”,如下图所示。 在核心板原理图,搜索该关键词“MCU_ISO7816_CLK”,可见其对应 PWM2,如下图所示。 所以,接下来我们便对 PWM2 进行操作。在下面的操作之前,我们需要配置内核,取消内核中 buzzer 的驱动,解除该驱动对蜂鸣器的占用,其目录如下图所示。 将该选项改为未选中状态,如下图所示。 接下来,编译烧写该内核镜像(boot.img)到开发板。再进行下面的操作即可。 |
|
|
|
编写驱动程序
在 linux 内核中有一个规律,Linux 内核开发者把通用的东西都总结出来,个性化的东西就留出接口,和 GPIO 驱动类似,PWM 驱动在内核中也提供了对应的接口函数,内核提供的接口函数声明在 include/linux/pwm.h 中。 //申请一个 PWM 资源 struct pwm_device *pwm_request(int pwm_id, const char *label); //释放一个 PWM 资源 void pwm_free(struct pwm_device *pwm); //配置 PWM int pwm_config(struct pwm_device *pwm, int duty_ns, int period_ns); //使能 PWM,duty_ns 为高电平所用时间,period_ns 整个周期为所用时间,单位为纳秒。 int pwm_enable(struct pwm_device *pwm); //不使能 PWM void pwm_disable(struct pwm_device *pwm); 根据以上这些,我们便可以编写一个简单的 pwm 输出程序,来控制蜂鸣器的频率。创建 名称为 4418x_pwm.c 的文件,程序代码如下所示。 #include #include #include #include #include #include #include #include #include /*pwm for this buzzer*/ struct pwm_device *pwm = NULL; static int __init buzzer_init(void) { int ret; printk(“ check buzzer init./n”); pwm = pwm_request(2, “buzzer”); if ( pwm == NULL ) { printk(“buzzer open error./n”); } //printk(KERN_EMERG “pwm_request %d ”,pwm); ret=pwm_config(pwm,100000,200000);//设置了 1000Hz 频率的声音 printk(“pwm_config %d ”,ret); printk(“pwm_config %d ”,ret); ret=pwm_enable(pwm); printk(“pwm_enable %d ”,ret); printk(KERN_EMERG “done2. /n”) ; return 0; } static void __exit buzzer_exit(void) { pwm_config(pwm,0,0); //关闭蜂鸣器输出 pwm_disable(pwm); // 关闭 pwm pwm_free(pwm); // 释放 pwm 资源 } module_init(buzzer_init); module_exit(buzzer_exit); MODULE_DESCRIPTION(“pwm_buzzer driver”); MODULE_LICENSE(“GPL”); 2.2 编写 Makefile 接下来进行编写 Makefile 文件。 export ARCH=arm obj-m += 4418x_pwm.o KDIR := /home/topeet/4418/4G/20170914/android/kernel PWD = $(shell pwd) all: make -C $(KDIR) M=$(PWD) modules clean: rm -rf *.o modules.order *.ko *mod.c Module.symvers 脚本中,export ARCH=arm 表示设置目标 CPU 类别为 arm,也就是编译的依赖内核和驱动模块目标 CPU 为 ARM。 obj-m += 4418x_pwm.o 表示编译的源文件为 4418x_pwm.c, 如果源文件名有变化,则需要修改成对应的文件名。 KDIR 参数指向对应的内核源码目录。作者的内核源码是在/home/topeet/4418/4G/20170914/android/kernel 目录下,用户要根据自己的具体情况来修改。 2.3 编译运行 首先设置环境变量,使其在编译时使用源码中的编译器。在源码目录中使用”cdkernel”进入 kernel 目录。然后使用命令“make menuconfig”打开内核缺省配置界面,如下图所示。 进入图中高亮的“General setup”,如下图所示。 可以看到图中高亮的文本,描述了当前源码使用的编译器为“arm-eabi-”,我们回到源码文件夹,使用命令“find 。/ -name arm-eabi-*”,可以得到源码中编译器所在路径,如下图所示。 这样,源码编译器的绝对路径为源码所在路径加上上图中红框的路径,在本文中为“/home/topeet/4418/4G/20170914/android/prebuilts/gcc/linux-x86/arm/arm-eabi-4.7/bin/”,因为笔者是用 root 登录的,所以打开文件“/root/.bashrc”在里面添加这样一条内容,如下图所示。 接下来,我们便可以进行编译了。 将 Makefile 与 C 程序放在 Ubuntu 系统的同一目录。如下图所示。 在当前目录输入“make”开始编译,生成内核模块文件“ 4418x_pwm.ko”,如下图所示。 将该内核模块文件拷贝到开发板,接下来在超级终端使用命令“insmod4418x_pwm.ko”加载该模块,如下图所示。 模块加载成功,同时蜂鸣器响起高频声音。然后使用命令“rmmod 4418x_pwm”卸载该驱动,如下图所示。 此时,蜂鸣器停止播放高频声音,PWM 蜂鸣器测试例程到此结束。 |
|
|
|
只有小组成员才能发言,加入小组>>
684 浏览 0 评论
1100 浏览 1 评论
2465 浏览 5 评论
2799 浏览 9 评论
移植了freeRTOS到STMf103之后显示没有定义的原因?
2638 浏览 6 评论
使用eim外接fpga可是端口一点反应都没有有没有大哥指点一下啊
648浏览 9评论
642浏览 7评论
请教大神怎样去解决iMX6Q在linux3.0.35内核上做AP失败的问题呢
775浏览 6评论
619浏览 5评论
661浏览 5评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-19 09:38 , Processed in 1.182558 second(s), Total 84, Slave 65 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号