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 小时前
Attention Mechanism: From Theory to Code
人工智能·深度学习·神经网络·学习·自然语言处理
爱上好庆祝6 小时前
svg图片
前端·css·学习·html·css3
嵌入式小企鹅6 小时前
蓝牙学习系列(八):BLE L2CAP 协议详解
网络·学习·蓝牙·ble·协议栈·l2cap
jiayong237 小时前
第 8 课:开始引入组合式函数
前端·javascript·学习
格鸰爱童话8 小时前
向AI学习项目技能(五)
java·学习
技术人生黄勇8 小时前
拆解 Hermes Agent:开源 Agent 里唯一的闭环学习系统
学习
凉、介9 小时前
别再把 PCIe 的 inbound/outbound、iATU 和 eDMA 混为一谈
linux·笔记·学习·嵌入式·pcie
speop9 小时前
TASK01 | Reasoning Kindom
学习
2301_8227032010 小时前
鸿蒙flutter三方库实战——教育与学习平台:Flutter Markdown
学习·算法·flutter·华为·harmonyos·鸿蒙
码喽7号10 小时前
vue学习四:Axios网络请求
前端·vue.js·学习