搜索

121

主题

128

帖子

665

积分

网站编辑

Rank: 8Rank: 8

积分
665
发表于 2021-5-28 16:09:04 11903 浏览 0 回复

iTOP-6818开发板PWM 输出实验

本帖最后由 翠花儿 于 2021-5-28 16:10 编辑

本章节介绍了如何配置使用开发板的 PWM输出功能。需要的资料包在网盘“iTOP6818开发板资料汇总(不含光盘内容)\09_iTOP-6818开发板最小linux_Qt_Ubuntu扩展文档\54_章节_PWM 输出实验”下载。
6818MCU 共提供了 5 路 PWM 输出,其中一路未引出,所以共有 4 路可用的 PWM 输出。
注意:本文档中提供的例程,没有注册设备和驱动,只是在驱动入口和出口函数中进行了配置。如果用户需要生成设备节点,则需要自行添加剩余部分,这部分可以参考 GPIO 操作的文档。
1 配置IO
打开底板电路图,搜索“beep”,可以看到 beep 的网络名为“MCU_ISO7816_CLK”,如下图所示。
在核心板原理图,搜索该关键词“MCU_ISO7816_CLK”,可见其对应 PWM2,如下图所示。
所以,接下来我们便对 PWM2 进行操作。在下面的操作之前,我们需要配置内核,取消
内核中 buzzer 的驱动,解除该驱动对蜂鸣器的占用,其目录如下图所示。
将该选项改为未选中状态,如下图所示。
接下来,编译烧写该内核镜像(boot.img)到开发板。再进行下面的操作即可。
2 编写驱动程序
在 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 输出程序,来控制蜂鸣器的频率。创建名称为 6818x_pwm.c 的文件,程序代码如下所示。
#include <linux/init.h>
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/errno.h>
#include <linux/miscdevice.h>
#include <linux/types.h>
#include <linux/io.h>
#include <linux/pwm.h>
#include <linux/fs.h>
/*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");
3 编写Makefile
编写 Makefile 文件。
export ARCH=arm
obj-m += 6818x_pwm.o
KDIR := /home/topeet//6818/android5.1/lollipop-5.1.1_r6/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 += 6818x_pwm.o 表示编译的源文件为 6818x_pwm.c, 如果源文件名有变化,则需要修改成对应的文件名。
        KDIR 参数指向对应的内核源码目录。作者的内核源码是在/home/topeet/6818/android5.1/lollipop-5.1.1_r6/kernel  目录下,用户要根据自己的具体情况来修改。
4 编译运行
将 Makefile 与 C 程序放在 Ubuntu 系统的同一目录。如下图所示。
在当前目录输入“make”开始编译,生成内核模块文件“ 6818x_pwm.ko”,如下图所示。
将该内核模块文件拷贝到开发板,接下来在超级终端使用命令“insmod 6818x_pwm.ko”加载该模块,如下图所示。
模块加载成功,同时蜂鸣器响起高频声音。然后使用命令“rmmod 6818x_pwm”卸载该驱动,如下图所示。
此时,蜂鸣器停止播放高频声音,PWM 蜂鸣器测试例程到此结束。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

返回列表
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

登录或注册

官方客服

QQ:2551456065

官方QQ群

195631883

扫一扫关注迅为公众号

群号652692981

 
快速回复 返回顶部 返回列表