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;
}

测试结果

相关推荐
西岸行者4 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意4 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码4 天前
嵌入式学习路线
学习
毛小茛4 天前
计算机系统概论——校验码
学习
babe小鑫4 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms4 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下5 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。5 天前
2026.2.25监控学习
学习
im_AMBER5 天前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode
CodeJourney_J5 天前
从“Hello World“ 开始 C++
c语言·c++·学习