解决IMX6ULL GPIO扩展板PWM7/8中的pwm0/period后卡死问题

前言

本篇文章主要是记录解决百问网论坛上面设置 IMX6ULL GPIO扩展板PWM7/8中的pwm0/period后卡死问题,如下图:

一、查看原理图,找出对应引脚

在这里我们如何确定哪个扩展口中的引脚输出PWM波呢?我们可以通过查看原理图。

查看扩展板的原理图,并且与底板的原理图对照,弄清楚每个扩展引脚对应的功能,将来可以查看该引脚的其他复用功能是否可以设置为PWM输出。

底部扩展接口原理图:

由图可知gpio_io20gpio_io19分别对应的是csi_vsync以及csi_hsync

扩展版原理图:

由图可知gpio_io20gpio_io19分别对应扩展版J1 5 接口

利用官方NXP的工具i.MX pins v6,此工具能够查看芯片所支持外设对应的引脚,此工具仅支持为包含电气特性配置(与所有引脚信号相关的)的器件配置引脚路由配置,并创建可用于初始化的源代码,通过寄存器直接初始化或 SDK API 代码和/或器件树代码段(如果支持)的方式。本小节主要利用此工具查看PWM外设所路由到的引脚,也就是说PWM能通过什么引脚哪个引脚输出。

在这里参考大佬文章:使用imx6ull开发板输出PWM波(100ask)_imx6ull pwm-CSDN博客

可以得出只有gpio_io20gpio_io19这两路GPIO有专门的PWM波功能。

二、修改和编译设备树

进入设备树目录,执行以下命令进入

cd ~/100ask_imx6ull-sdk/Linux-4.9.88/arch/arm/boot/dts

修改对应设备树文件(一共两个,现在是第一个):

vi 100ask_imx6ull-14x14.dts

​​

添加上图框起来的部分:

&pwm7 {
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_pwm7>;
        status = "okay";
};

&pwm8 {
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_pwm8>;
        status = "okay";
};
pinctrl_pwm7: pwm7grp {
            fsl,pins = <
                MX6UL_PAD_CSI_VSYNC__PWM7_OUT   0x000010B0
            >;
 
        };
pinctrl_pwm8: pwm8grp {
            fsl,pins = <
                MX6UL_PAD_CSI_HSYNC__PWM8_OUT   0x000010B0
            >;
 
        };

修改第二个文件:

vi imx6ull.dtsi

如图,pwm默认时钟配置都一样,在这里我们将pwm7中的时钟配置改成 CLK_PWM7,pwm8中的时钟配置改成 CLK_PWM8。

然后我们就编译设备树了:

cd ~/100ask_imx6ull-sdk/Linux-4.9.88/
make dtbs

三、通过SG90舵机进行上机测试

将上面编译好的设备树文件 100ask_imx6ull-14x14.dtb 复制到开发板,可以通过挂载 Ubuntu NFS 目录。

具体操作可看:开发板挂载 Ubuntu 的 NFS 目录_开发板nfs挂载ubuntu-CSDN博客

Ubuntu 操作

cd ~/100ask_imx6ull-sdk/Linux-4.9.88/arch/arm/boot/dts
cp 100ask_imx6ull-14x14.dtb ~/nfs_rootfs/

开发板操作:

mount -t nfs -o nolock,vers=3 192.168.5.11:/home/book/nfs_rootfs /mnt
cp /mnt/100ask_imx6ull-14x14.dtb /boot
sync
reboot

在Linux中,sync命令用于将内存中的数据同步至硬盘

这个命令确保所有未写入硬盘的缓冲区数据被立即写入,从而防止数据丢失。操作系统通常会使用内存缓冲区来暂存要写入硬盘的数据,以提高写入效率。不过,这也带来了数据安全风险,因为如果系统突然断电或发生故障,未及时写入硬盘的数据将会丢失。

接着我们在开发板上操作:测试PWM7

[root@100ask:~]# cd /sys/class/pwm
 
//看看这个目录下有什么
root@100ask:/sys/class/pwm]# ls
pwmchip0  pwmchip1  pwmchip2  pwmchip3  pwmchip4  pwmchip5  pwmchip6  pwmchip7
 
//由于我们选择的是pwm7,然后pwm控制器pwmchip0对应pwm1,所以我们pwm7对应pwmchip6
root@100ask:/sys/class/pwm]# cd pwmchip6
 
//调出pwm0目录下设备节点
root@100ask:/sys/class/pwm/pwmchip6]# echo 0 > export
 
//注意,一定要先配置好pwm的周期和占空比才能使能pwm
//配置周期
[root@100ask:/sys/class/pwm/pwmchip6]# echo 20000000 > pwm0/period
 
//配置占空比,高电平时间
root@100ask:/sys/class/pwm/pwmchip6]# echo 1000000 > pwm0/duty_cycle
 
//最后使能pwm
root@100ask:/sys/class/pwm/pwmchip6]# echo 1 > pwm0/enable

接着就可以直接连续修改占空比控制舵机反复运动了。测试,连续输入:

[root@100ask:/sys/class/pwm/pwmchip6]# echo 1200000 > pwm0/duty_cycle
[root@100ask:/sys/class/pwm/pwmchip6]# echo 800000 > pwm0/duty_cycle

同理,测试PWM8的话,PWM8对应pwmchip7,改一下对应参数即可。

测试结果我们可以通过连接舵机模块,具体可看:

STM32—PWM开发SG90舵机_stm32舵机pwm设置-CSDN博客

如图:连接两个舵机,可以分别测试PWM7和PWM8,控制两个舵机不同角度转动。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

热爱嵌入式的小佳同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值