SoC输出可调节时钟

在开发过程中,难免会遇到需要SoC给外设输出稳定可调节时钟的需求,因此这里给出几种可实现的方案,基本能涵盖大多数需求。我这里的时钟频率需求为几Hz~几十KHz。

1、具有CLK输出功能的IOMUX

通过查看CLK手册、原理图和PCB图,RK3568开发板可以使用且引出的高频时钟为GPIO2_C1、GPIO3_B0,但其频率均为高频时钟,不符合驱动外设所需的几Hz~几十kHz的时钟频率。

2、可以考虑使用pwm口来实现

通过检查原理图和PCB图,发现开发板上的pwm均被占用,且有一部分没有引出io口,因此只能考虑通过软件的方式来实现,把一个gpio注册成pwm,随后在驱动中通过timer回调拉高拉低GPIO模拟时钟输出

3、软件上可以考虑使用主控的timer,在timer回调函数里拉高拉低GPIO来实现

参考设备树的pwm-gpio配置和pwm-gpio驱动

Documentation/devicetree/bindings/pwm/pwm-gpio.txt

drivers/pwm/pwm-gpio.c

添加到设备树的合适位置,可以参考Led-gpio的位置

    pwm-gpio {
        compatible = "pwm-gpio";
        #pwm-cells = <3>;
        pwm-gpio = <&gpio2 RK_PD5 GPIO_ACTIVE_HIGH>;
    };

编辑kernel/arch/arm64/config/rockchip_linux_defconfig

打开下面的编译选项

CONFIG_PWM_GPIO=y

编译内核

烧录启动进入系统后

对于 PWM kernel user space 使用说明在 Documentation/pwm.txt 有说明,下面重点提下 user space 分。就像 pwm.txt 文档里面说的, PWM 提供了用户层的接口,在 /sys/class/pwm/ 节点下面, PWM 驱动 加载成功后,会在 /sys/class/pwm/ 目录下产生 pwmchip0 目录;向 export 文件写入 0 ,就是打开 pwm 时器 0 ,会产生一个 pwm0 目录,相反的往 unexport 写入 0 就会关闭 pwm 定时器了,同时 pwm0 目录会被删除 , 该目录下有以下几个文件:
enable :写入 1 使能 pwm ,写入 0 关闭 pwm
polarity :有 normal inversed 两个参数选择,表示输出引脚电平翻转;
duty_cycle :在 normal 模式下,表示一个周期内高电平持续的时间(单位:纳秒),在 reversed 模式下,表示一个周期中低电平持续的时间(单位:纳秒 )
period :表示 pwm 波的周期 ( 单位:纳秒 )
以下是 pwmchip0 的例子,设置 pwm0 输出频率 100K ,占空比 50%, 极性为正极性:

通过下面的命令可以设置100K的时钟,示波器测试发现平均值大约为100K,频率并不稳定

cd /sys/class/pwm/pwmchip0/
echo 0 > export
cd pwm0
echo 10000 > period
echo 5000 > duty_cycle
echo normal > polarity
echo 1 > enable

修改频率测试,在80K及以下的时钟频率基本都是稳定可靠的,因为是通过GPIO拉高拉低实现的pwm波形,所以高频以后波形不稳定。

另外又在ping网络的情况下测试了时钟频率,因为网络是通过包的形式发送,会产生较高频率的中断,测试发现ping网络对各频率的时钟没有明显的影响。随后又在cpu压测下测试了时钟频率,top命令可以看到四核的cpu占用率基本100%。

测试结果发现在10KHz以上的频率,会明显观测到影响波形的输出,频率越高越明显。

在5KHz时,则没有明显的异常波形

另外如果想在内核空间去调用可以参考drivers/pwm/pwm-gpio.c,在内核实现pwm的调用

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值