1 LuckFox Pico引脚分布
LuckFox Pico的引脚分布如下图,本次实验只关注PWM引脚。选择PWM0_M1来控制LED灯的循环亮灭。
2 PWM控制代码
1、在虚拟机上新建文件夹“myprogram”,并新建C语言脚本,命名为“pwm.c”,如下图:
编写控制代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#define PWM_PATH "/sys/class/pwm/pwmchip0" //PWM路径
#define PERIOD_NS 1000000 //周期(ns)
#define MIN_DUTY_CYCLE_NS 0 //最小占空比0
#define MAX_DUTY_CYCLE_NS 1000000 //最大占空比100
int main() {
FILE *pwm_export = fopen(PWM_PATH "/export", "w");
if (!pwm_export) {
perror("Failed to open PWM export");
return 1;
}
fprintf(pwm_export, "0"); //写入设备索引(通常为0),以导出指定的PWM通道供用户空间控制
fclose(pwm_export);
FILE *period_file = fopen(PWM_PATH "/pwm0/period", "w");
if (!period_file) {
perror("Failed to open PWM period");
return 1;
}
fprintf(period_file, "%d", PERIOD_NS); //写入周期值 “1000000”(以纳秒为单位),以设置PWM的周期为1KHZ。
fclose(period_file);
FILE *enable_file = fopen(PWM_PATH "/pwm0/enable", "w"); //enable使能文件写入"1",以启用PWM信号的输出。
if (!enable_file) {
perror("Failed to open PWM enable");
return 1;
}
fprintf(enable_file, "1");
fclose(enable_file);
int direction = 1; // 1 for increasing duty cycle, -1 for decreasing
int duty_cycle_ns = 0;
while (1) {
duty_cycle_ns += 10000 * direction;
if(duty_cycle_ns == MAX_DUTY_CYCLE_NS)
direction = -1;
else if(duty_cycle_ns == MIN_DUTY_CYCLE_NS)
direction = 1;
FILE *duty_cycle_file = fopen(PWM_PATH "/pwm0/duty_cycle", "w");
if (!duty_cycle_file) {
perror("Failed to open PWM duty cycle");
return 1;
}
fprintf(duty_cycle_file, "%d", duty_cycle_ns); //写入占空比值,whilex循环不断改变duty_cycle_ns的值,实现PWM占空比从0% // 渐增加到100%,然后再从100%逐渐减小到0%的呼吸灯效果
fclose(duty_cycle_file);
usleep(50000); // Adjust this value for desired breathing speed,延时50000ns,控制呼吸的速度
}
FILE *pwm_unexport = fopen(PWM_PATH "/unexport", "w");
if (!pwm_unexport) {
perror("Failed to open PWM unexport");
return 1;
}
fprintf(pwm_unexport, "0"); //写入设备索引,取消导出指定的PWM通道到用户空间。
fclose(pwm_unexport);
return 0;
}
2、用交叉编译工具链编译pwm.c文件,命令如下:
“arm-rockchip830-linux-uclibcgnueabihf-gcc pwm.c -o pwm”
官方提供的虚拟机已配置好交叉编译环境,此处不用再配置。生成pwm可执行文件,如下图:
3 修改设备树
1、Luckfox pico 设备树文件路径如下:
/home/luckfox/Luckfox-Pico/luckfox-pico/sysdrv/source/kernel/arch/arm/boot/dts
2、开启PWM0_M0。需要修改rv1103g-luckfox-pico.dts文件,注释掉pwm0m0,启用pwm0m1。如下图:
因为PWM0_M1(GPIO1_D2_d) 默认功能为 I2C3 功能,所以需要在设备树中注释掉 I2C3的代码片段。如下图:
4 编译内核
1、选择编译分支。cd 到/home/luckfox/Luckfox-Pico/luckfox-pico路径。运行“./build.sh luch”。0对应的是Luckfox pico分支,1对应的是Luckfox pico plus分支。 这里选择0。如下图:
2、重新编译内核kernel。运行“./build.sh kernel”命令。
3、重新烧录固件
内核编译完成后会在/home/luckfox/Luckfox-Pico/luckfox-pico/output/image路径下生成boot.img,env.txt等文件,默认会替换掉源文件。
重新烧录SD卡。选择烧录上一步刚生成的boot.img,其他img文件可保持不变。如下图:
5 运行代码
1、通过adb指令将生成的pwm可执行文件上传到Luckfox pico开发板上。
2、修改pwm可执行文件的权限,然后运行。
3、LED灯正极接开发板“1D2_D”引脚,负极接“GND”。可以观察到LED灯逐渐变亮,然后逐渐熄灭,之后又逐渐变亮,如此循环。
如下图,逐渐变亮:
逐渐变暗:
实验成功。