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

测试结果

相关推荐
sinat_255487817 小时前
读者、作家 Java集合学习笔记
java·笔记·学习
Edward111111118 小时前
3.18异常学习
学习
正经人_x8 小时前
学习日记34:UNETR
学习
科技林总8 小时前
【系统分析师】12.3 软件架构描述与表示
学习
wincheshe9 小时前
AI Agent 开发学习 --- 框架开发实践(三)
人工智能·学习
2501_9181269111 小时前
学习所有6502写游戏存档的语句
汇编·嵌入式硬件·学习·游戏·个人开发
星雨流星天的笔记本11 小时前
2.用洗洁精洗过的三口烧瓶的处理方法
学习
云边散步11 小时前
godot2D游戏教程系列二(18)
笔记·学习·游戏
風清掦11 小时前
【江科大STM32学习笔记-09】USART串口协议 - 9.1 STM32 USART串口外设
笔记·stm32·单片机·嵌入式硬件·学习
奶茶精Gaaa12 小时前
AI实战(二)生成ui自动化
功能测试·学习·自动化