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

测试结果

相关推荐
努力努力再努力FFF19 分钟前
医生对AI辅助诊断感兴趣,作为临床人员该怎么了解和学习?
人工智能·学习
sakiko_2 小时前
UIKit学习笔记5-使用UITableView制作聊天页面
笔记·学习·swift·uikit
Alice-YUE2 小时前
【js高频八股】防抖与节流
开发语言·前端·javascript·笔记·学习·ecmascript
北山有鸟3 小时前
修改源码法和插件法
嵌入式硬件·学习
richxu202510013 小时前
嵌入式学习之路->stm32篇->(14)通用定时器(上)
stm32·单片机·嵌入式硬件·学习
qeen874 小时前
【数据结构】建堆的时间复杂度讨论与TOP-K问题
c语言·数据结构·c++·学习·
lizhihai_994 小时前
股市学习心得-六张分时保命图
大数据·人工智能·学习
nashane5 小时前
HarmonyOS 6学习:应用签名文件丢失处理与更新完全指南
学习·华为·harmonyos·harmonyos 5
@codercjw5 小时前
公差的具体标注方法(书本上/理论上标注方法)
学习
久菜盒子工作室6 小时前
时寒冰:第五次产业大转移与未来30年国运:在“双向挤压”中实现惊险一跃
人工智能·学习