PWM是我们常用的外设功能之一,csk6总共有8组pwm输出口,本节将通过示例演示如何使用扩展 MCU 的 PWM 功能。运行该代码后, 会在开发板的 EXT_PD2 引脚输出频率为1 HZ,占空比为50%的波形。
int pwm_set_cycles(const struct device * dev, uint32_t channel, uint32_t period, uint32_t pulse, pwm_flags_t flags)
参数说明
参数 | 说明 |
---|---|
dev | pwm设备实例 |
channel | 通道 |
period | 频率 |
pulse | 脉冲宽度 |
flags | PWM标志 |
其中period和pulse的单位是microseconds。
SDK 中提供了 pwm 的示例。
{SDK}\.sdk\csk\samples\driver\exmcu_pwm
适用开发板:大模型开发套件
编译版型:csk6_duomotai_devkit
使用引脚:
在 SDK 根目录(duomotai_ap
)下可通过执行以下指令进行对该示例工程的编译:
lisa zep build -b csk6_duomotai_devkit .sdk/csk/samples/driver/exmcu_pwm/ -p
编译完成后,编译产物二进制文件位于 build\zephyr\zephyr.bin
使用 Type-C 数据线连接开发套件的 DAP_USB
接口,选中以下其中一种方式对固件进行烧录:
cskburn desktop
是一款聆思推出的桌面烧录工具,在下载并安装 cskburn desktop 烧录工具后,双击图标运行软件:
1.点击串口下拉框,选择连接开发套件后识别到的串口编号;
2.将编译输出的.bin
文件拖拽进烧录区域;
3.点击开始烧录,等待烧录完成。
若您已按照 《环境搭建》 教程完成开发环境的安装,可在编译完成后执行 lisa zep exec cskburn
指令完成烧录。
lisa zep exec cskburn -s \\.\COMxx -C 6 -b 1500000 0x000000 --verify-all .\build\zephyr\zephyr.bin
请将命令行中的的 COMx 替换为开发套件在 PC 上对应的串口号(可通过设备管理器查看)。例如:
COM3
。
lisa zep exec cskburn -s PORT -C 6 0x000000 --verify-all ./build/zephyr/zephyr.bin -b 1500000
请将命令行中的 PORT 替换为开发套件连接在 PC 上对应的串口号。例如:
/dev/ttyUSB0
。
烧录完成后,会在开发板的 EXT_PD2 引脚输出频率为1 HZ,占空比为50%的波形,表现为屏幕闪烁:
以下代码与注释已省略一部分非关键接口代码,主要呈现示例的主业务流程与主要接口的使用。
CONFIG_PWM=y
CONFIG_PWM_CSK6_CH32V003=y
CONFIG_I2C=y
CONFIG_PWM_CSK6=n
设备树文件csk6_duomotai_devkit.overlay
配置如下:
/*
* SPDX-License-Identifier: Apache-2.0
*/
&expwm{
clock-prescaler = <4800>;
clock-frequency = <48000000>;
};
/ {
motor {
motor_pwm: motor_pwm {
compatible = "vnd,phandle-holder";
status = "okay";
pwms = <&expwm 0 1000 0x0 100>;
};
};
};
NOTE
如果您想了解更多关于设备树的信息,请学习设备树章节。
1.从设备树中定义的 motor_pwm 节点获取 PWM 设备的配置信息
const struct pwm_dt_spec spec = PWM_DT_SPEC_GET(DT_NODELABEL(motor_pwm));
2.检查 PWM 设备是否就绪
device_is_ready()
3.调用 _pwm_set 函数设置 PWM 的周期和脉冲宽度为周期的一半,产生 50% 的占空比
r = _pwm_set(spec.period, spec.period / 2);
按下开发板复位按钮,运行程序,可用示波器观察 EXT_PD2 引脚输出的波形。
int main(void)
{
int r = 0;
if (!device_is_ready(spec.dev)) {
printk("device: %s is not ready\n", spec.dev->name);
return 0;
}
printk("name: %s \n", spec.dev->name);
printk("channel: %d \n", spec.channel);
printk("period: %d \n", spec.period);
printk("flag: %d \n", spec.flags);
r = _pwm_set(spec.period, spec.period / 2);
if (r) {
printk("pwm set failed, r:%d\n", r);
return 0;
}
return 0;
}