news 2026/4/18 18:38:07

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Zephyr学习之PWM方式驱动LED灯记录

前言

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

工程复制并打开项目

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



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

编写设备树覆盖配置文件

/{// 选择系统控制台和 shell UART 设备chosen{// 指定系统控制台使用 usart1zephyr,console=&usart1;// 指定 shell UART 使用 usart1zephyr,shell-uart=&usart1;};// GPIO LED 配置节点leds{// 兼容性字符串,表示使用 GPIO LED 驱动compatible="gpio-leds";// 第一个 LED 配置led0:led0{// 配置 GPIO 引脚为 PF9(GPIOF 端口第 9 号引脚),高电平有效gpios=<&gpiof9GPIO_ACTIVE_HIGH>;// PF9// 设置 LED 的标签名称label="User LED0";};// 第二个 LED 配置led1:led1{// 配置 GPIO 引脚为 PF10(GPIOF 端口第 10 号引脚),高电平有效gpios=<&gpiof10GPIO_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=<&pwm141PWM_MSEC(100)PWM_POLARITY_INVERTED>;// 设置 PWM LED 的标签名称label="PWM LED0";};};// 别名定义,简化设备引用aliases{// 将 uart0 映射到 usart1uart0=&usart1;// 将 led0 映射到 led0led0=&led0;// 将 led1 映射到 led1led1=&led1;// 将 pwmled0 映射到 pwm_led0pwmled0=&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";};};

注意

编写测试函数

/* * 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"staticconststructpwm_dt_specpwm_led0=PWM_DT_SPEC_GET(DT_ALIAS(pwmled0));intmain(void){uint32_tmax_period=0;uint32_tperiod;uint8_tdir=0U;intret;if(!pwm_is_ready_dt(&pwm_led0)){printk("Error: PWM device %s is not ready\n",pwm_led0.dev->name);return0;}uint32_tpulse_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));}return0;}

测试结果

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 15:32:10

从中心化到混合架构:数字资产交易所的技术革命与生态重构

引言&#xff1a;一场静默的金融基础设施革命当全球数字资产市值突破5万亿美元大关&#xff0c;当Coinbase单日交易量超越纽约证券交易所&#xff0c;当Solana链上衍生品合约规模直追传统金融市场——这场由区块链技术驱动的金融革命&#xff0c;正在重塑人类社会的价值交换方式…

作者头像 李华
网站建设 2026/4/16 16:08:44

2.运放选型调试方法论

一般学习过模电的同学&#xff0c;懂负反馈、虚短虚断、会计算&#xff0c;但是还是不会具体应用。接下来先根据需求锁定关键参数&#xff0c;再通过规范调试排除问题。一、 运放选型&#xff1a;从需求出发&#xff0c;按优先级筛选参数选型的核心是 **“按需取舍”—— 没有万…

作者头像 李华
网站建设 2026/4/16 10:43:53

基于STM32单片机汽车防盗报警GSM短信GPS北斗定位地图APP设计37(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码**

基于STM32单片机汽车防盗报警GSM短信GPS北斗定位地图APP设计37(设计源文件万字报告讲解)&#xff08;支持资料、图片参考_相关定制&#xff09;_文章底部可以扫码 STM32单片机电动车防盗报警GSM短信上报GPS定位37 产品功能描述&#xff1a; 本系统由STM32F103C8T6单片机核心板、…

作者头像 李华
网站建设 2026/4/16 11:18:44

SpringBoot学习:整合Quartz实现定时任务

在应用开发中&#xff0c;经常会遇到需要定时执行操作的场景&#xff0c;例如日志清理、邮件发送、订单处理等。SpringBoot支持多种定时任务实现方式&#xff0c;包括Timer、ScheduledExecutorService、SpringTask、Quartz以及xxljob等。本文将重点介绍如何使用Quartz框架实现可…

作者头像 李华
网站建设 2026/4/18 9:42:39

Kubernetes平滑部署全景实战指南

在Kubernetes中实现平滑部署&#xff08;亦称无损发布或零宕机部署&#xff09;的核心原理在于&#xff1a;必须确保新Pod已启动并通过就绪检查、能够接收流量后&#xff0c;再终止旧Pod。若这一顺序被打破&#xff0c;则可能引发服务闪断、请求丢失或短暂不可用。 一、实现平…

作者头像 李华
网站建设 2026/4/18 17:35:30

什么网盘能够解决超大文件传输难题?

一、超大文件传输为何成为难题&#xff1f;现代社会的数字化程度从未像今天这样深刻影响我们的生活和工作。先做一个简单的思维试验&#xff1a;每次需要传输视频文件、设计素材、数据库备份或者超大文档时&#xff0c;你是不是曾经历过以下这些问题&#xff1f;电子邮件容量有…

作者头像 李华