本帖最后由 qiao--- 于 2023-12-2 23:57 编辑
hello,各位大佬们,经过一晚上的努力咱们的舵机测试他来了。由于这个出厂系统默认是不支持舵机测试的,原因就是他的这个设备树上定时器的pwm功能没有打开,因此这次的测试还需要涉及到修改设备树的内容,这个我们下面会讲到。那么对于这个pwm脉冲咱们应该如何下手呢,多的不说少的不唠,咱们直接上干货!
首先我们来看看这个原厂系统是否支持pwm功能。
因为/sys/class是Linux系统中的一个目录,用于存储设备和驱动程序的信息。这个目录包含了各种设备类别的子目录,每个子目录包含了该类别下所有设备的信息。
所以我们利用串口进入板子的终端(这个我们上期测评讲过),输入
cd /sys/class/pwm
ls
发现下什么都没有,说明这个板子的系统没有支持pwm驱动,因此接下来的思路就是改驱动,那这个原厂系统这么大,怎么改呢?
因为现在最新的Linux内核是设备和驱动分离的,设备是用设备树描述的;而驱动则写在Linux内核里。所以咱们的下手点就是先在设备树文件中看看设备树这个节点有没有添加,然后看内核的驱动有没有打开(对于pwm这种驱动)原厂一般都会写好提供,我们只需要打开这个驱动就行了。最后再编译修改好以后的设备树和内核。
将这些修改好了后就可以利用网络把这新的内核和设备树传到咱们得板子上。
思路有了,我们把这些需求列成一个大纲咱们一个一个去实现它。
1.板子需要和我们的Linux主机构成一个局域网,因为只有这样我们才可以把新的设备树和内核传到板子上。
2.下载出厂系统的代码,方便我们检查。
3.检查设备树文件是否有pwm节点。
4.检查内核是否支持pwm驱动。
5.将新的内核和设备树传到板子上。
6.简单测试一下。
现在我们就按照这个大纲一个个的实现它就行了
1.解决网络。我们这个板子是有两个网口的,还有一个usb接口,就是上期我们讲到的烧录系统的那个接口也可以模拟一个网口,如果没有网线的话可以利用这个USB接口模拟网口。我们将这个板子的ETH1和和我们的电脑的网口相接。给电脑输入静态ip,我输入的是
进入虚拟机,给虚拟机也配置一个静态ip
给我们的板子配置静态ip,在终端输入
ifconfig end0 192.168.11.11 netmask 255.255.255.0 broadcast 192.168.11.1
以上的过程是保证让这三个系统在同一个网段内,可以相互通信。
接下来来测试一下网络。在板子上进行输入下面的命令来测试我们的板子能不能和我们得虚拟机通信。
ping 192.168.11.13
发现下面这样的情况,就代表可以正常通信。
这样咱们的网络部分就解决了。
2.下载出厂源码。
我们在下面这个网址下载这个系统的出厂源码。
STM32MP1Dev - STM32MP1 OpenSTLinux Developer Package - STMicroelectronics
我们在之前创建的Linux_source目录下创建一个source_code文件夹
mkdir source_code
将其用filezilla软件传到我们的虚拟机上的这个文件夹下面。然后对源码进行解压
cd source_code
tar xvf en.sources-stm32mp1-openstlinux-6.1-yocto-mickledore-mp1-v23.06.21.tar.gz
cd stm32mp1-openstlinux-6.1-yocto-mickledore-mp1-v23.06.21/sources/arm-ostl-linux-gnueabi/linux-stm32mp-6.1.28-stm32mp-r1-r0
tar xvf linux-6.1.28.tar.xz
对Linux源码进行打补丁
cd linux-6.1.28
for p in `ls -1 ../*.patch`; do patch -p1 < $p; done
选择应用架构
make ARCH=arm multi_v7_defconfig "fragment*.config"
for f in `ls -1 ../fragment*.config`; do scripts/kconfig/merge_config.sh -m -r .config $f; done
yes '' | make ARCH=arm oldconfig
现在源码就准备好啦。
3.检查设备树文件。为了更方便的检查源码,我们下载一个vscode代码编辑工具(这个网上有很多安装教程)。我们用vscode打开Linux源码的目录,相对路径是在Linux_source/sourceCode/stm32mp1-openstlinux-6.1-yocto-mickledore-mp1-v23.06.21/sources/arm-ostl-linux-gnueabi/linux-stm32mp-6.1.28-stm32mp-r1-r0/linux-6.1.28
打开后我们来寻找这个板子的设备树文件在哪,打开arch/arm/boot/dts所在的文件夹,这个文件夹是存放所有板子的设备树文件的文件夹。我们找到stm32mp135f-dk.dts这个文件,这个文件就是我们板子对应的源文件。找到stm32mp131.dtsi文件,这个文件描述了系统的一些内部资源,找到timers(因为pwm由定时器产生),这些timers全部是关着的
由此可以断定这个设备树是需要我们修改的。于是我们在stm32mp135f-dk.dts这个文件下的/节点下加入以下代码
&timers3 {
/delete-property/dmas;
/delete-property/dma-names;
status = "okay";
pwm1:pwm {
pinctrl-0 = <&pwm3_pins_a>;
pinctrl-1 = <&pwm3_sleep_pins_a>;
pinctrl-names = "default", "sleep";
status = "okay";
};
};
这样设备树就修改好啦。
4.检查内核驱动。在终端输入make menuconfig,这是图形配置驱动界面,我们进入
发现这个驱动已经配置好了,说明内核部分不需要修改。
接下来我们就可以重新编译设备树啦,终端输入下面的命令编译设备树文件
make ARCH=arm stm32mp135f-dk.dtb LOADADDR=0xC2000040
将编译好的设备树文件拷贝到板子上
scp arch/arm/boot/dts/stm32mp135f-dk.dtb root@192.168.11.11:/boot
重启板子
reboot
在进入到/sys/class/pwm文件下看看
cd /sys/class/pwm
ls
发现我们的pwm文件下出现了一个节点
我们接下来就可以操作这个节点来测试我们pwm功能了。
5.测试。先接入我们的舵机,因为我开的是time3的通道4口,这个对应板子的PB1引脚,所以舵机接线如图所示
注:由于我这个舵机用的是SG90,板子可以直接驱动,如果用有的舵机,可能需要接个舵机驱动板。
我们在板子的终端输入以下命令
cd /sys/class/pwm/pwmchip0
echo 3 > export
echo 20000000 > pwm3/period
echo 2500000 > pwm3/duty_cycle
echo 1 > pwm3/enable
就会发现神奇的一幕!
IMG_7779
舵机转了!
总结:这款开发板的pwm输出的稳定性还是可以的,能够稳定的控制舵机;软件部分也很给力,大部分驱动已经编写好了,只需要我们用图形界面添加即可。
这就是我们这期测评的全部内容,如果有时间的话我会把这个舵机控制写成代码分享给大家。