Zephyr学习之PWM方式驱动LED灯记录

前言

  1. Zephyr学习之点亮LED文章。
  2. 本次使用的示例工程blinky_pwm
  3. 驱动的引脚为PF9

工程复制并打开项目

参考提供的设备树文件的PWM节点编写规则



找到我们这边使用的pf9对应的引脚定义

编写设备树覆盖配置文件

c 复制代码
/ {
	// 选择系统控制台和 shell UART 设备
	chosen {
		// 指定系统控制台使用 usart1
		zephyr,console = &usart1;
		// 指定 shell UART 使用 usart1
		zephyr,shell-uart = &usart1;
	};

	// GPIO LED 配置节点
	leds {
		// 兼容性字符串,表示使用 GPIO LED 驱动
		compatible = "gpio-leds";

		// 第一个 LED 配置
		led0: led0 {
			// 配置 GPIO 引脚为 PF9(GPIOF 端口第 9 号引脚),高电平有效
			gpios = <&gpiof 9 GPIO_ACTIVE_HIGH>;  // PF9
			// 设置 LED 的标签名称
			label = "User LED0";
		};

		// 第二个 LED 配置
		led1: led1 {
			// 配置 GPIO 引脚为 PF10(GPIOF 端口第 10 号引脚),高电平有效
			gpios = <&gpiof 10 GPIO_ACTIVE_HIGH>;  // PF10
			// 设置 LED 的标签名称
			label = "User LED1";
		};
	};

	// PWM LED 配置节点
	pwmleds {
		// 启用 PWM LED 设备
		status = "okay";
		// 兼容性字符串,表示使用 PWM LED 驱动
		compatible = "pwm-leds";

		// PWM 控制的 LED 配置
		pwm_led0: pwm_led0 {
			// 配置 PWM 属性:引用 PWM 设备、通道号、周期、极性
			// &pwm14: 引用 PWM 设备
			// 1: 使用通道 1
			// PWM_MSEC(100): 设置周期为 100 毫秒
			// PWM_POLARITY_INVERTED: 设置为反向极性
			pwms = <&pwm14 1 PWM_MSEC(100) PWM_POLARITY_INVERTED>;
			// 设置 PWM LED 的标签名称
			label = "PWM LED0";
		};
	};

	// 别名定义,简化设备引用
	aliases {
		// 将 uart0 映射到 usart1
		uart0 = &usart1;
		// 将 led0 映射到 led0
		led0 = &led0;
		// 将 led1 映射到 led1
		led1 = &led1;
		// 将 pwmled0 映射到 pwm_led0
		pwmled0 = &pwm_led0;
	};
};

&pinctrl {
	tim14_ch1_pf9: tim14_ch1_pf9 {
		pinmux = <STM32_PINMUX('F', 9, AF9)>;
	};
};
// 串口1
&usart1 {
	pinctrl-0 = <&usart1_tx_pa9 &usart1_rx_pa10>;
	pinctrl-names = "default";
	current-speed = <115200>;
	status = "okay";
};
// 定时器
&timers14 {
	status = "okay";
	pwm14: pwm {
		status = "okay";
		pinctrl-0 = <&tim14_ch1_pf9>;
		pinctrl-names = "default";
	};
};

注意

编写测试函数

c 复制代码
/*
 * Copyright (c) 2016 Intel Corporation
 * Copyright (c) 2020 Nordic Semiconductor ASA
 *
 * SPDX-License-Identifier: Apache-2.0
 */

/**
 * @file Sample app to demonstrate PWM.
 */

#include <zephyr/kernel.h>
#include <zephyr/sys/printk.h>
#include <zephyr/device.h>
#include <zephyr/drivers/pwm.h>
#include <zephyr/drivers/gpio.h>
#include "autoconf.h"
static const struct pwm_dt_spec pwm_led0 = PWM_DT_SPEC_GET(DT_ALIAS(pwmled0));
int main(void)
{
    uint32_t max_period = 0;
    uint32_t period;
    uint8_t dir = 0U;
    int ret;
    if (!pwm_is_ready_dt(&pwm_led0))
    {
        printk("Error: PWM device %s is not ready\n",
               pwm_led0.dev->name);
        return 0;
    }
    uint32_t pulse_width = 0;
    max_period = 1000;
    pwm_set_dt(&pwm_led0, max_period, pulse_width);

    while (1)
    {
        ret = pwm_set_dt(&pwm_led0, max_period, pulse_width);
        if (ret)
        {
            printk("Error %d: failed to set pulse width\n", ret);
        }
        printk("Using pulse_width %d\n", pulse_width);

        if (dir == 0)
        {
            if (pulse_width < max_period)
            {
                pulse_width++;
            }
            else
            {
                dir = 1;
            }
        }
        else
        {
            if (pulse_width > 0)
            {
                pulse_width--;
            }
            else
            {
                dir = 0;
            }
        }

        k_sleep(K_MSEC(5U));
    }
    return 0;
}

测试结果

相关推荐
roo_12 小时前
JAVA学习-MAC搭建java环境和spring boot搭建
java·学习·macos
枷锁—sha2 小时前
【PortSwigger Academy】SQLi UNION 攻击 (确定列数)
服务器·数据库·学习·安全·网络安全
1379号监听员_2 小时前
PID学习笔记
笔记·学习
Tina Tang2 小时前
Agentic AI学习笔记(2)
笔记·学习
_李小白2 小时前
【Android GLSurfaceView源码学习】第三天:GLSurfaceView的Surface、GLES与EGLSurface的关联
android·学习
m0_748240442 小时前
ThinkPHP框架学习全攻略
学习
zhangrelay2 小时前
ROS Noetic 与 Ubuntu 24.04
笔记·学习
H Corey2 小时前
Java抽象类与接口实战指南
java·开发语言·学习·intellij-idea
后来后来啊3 小时前
2026.1.21学习笔记
笔记·学习·leetcode·#算法·#cpp