这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 【gd32f527移植Zephyr】5PWM呼吸灯驱动移植详细记录

共2条 1/1 1 跳转至

【gd32f527移植Zephyr】5PWM呼吸灯驱动移植详细记录

高工
2026-02-19 20:16:25     打赏

一、概述

本项目在GD32F527-EVAL开发板上实现了PWM呼吸灯功能,使用TIMER12的

通道0(PA8)输出PWM波形控制LED实现平滑的呼吸效果。

硬件平台:GD32F527-EVAL

软件平台:Zephyr RTOS

PWM频率:1kHz (无闪烁)

呼吸周期:约640ms (64步 × 5ms)

二、硬件连接

LED2 连接信息:

  - GPIO端口:GPIOF

  - GPIO引脚:PF8

  - 复用功能:TIMER12_CH0

  - 复用编号:AF9 (Alternate Function 9)

  - 活动电平:高电平点亮

TIMER12 信息:

  - 基地址:0x40001C00

  - 所在总线:APB1

  - 时钟频率:200MHz (系统时钟)

三、设备树配置 (gd32f527_eval.dts)

1. LED2设备节点定义:

     led_2: led_2 {

       gpios = <&gpiof 8 GPIO_ACTIVE_HIGH>;

       label = "LED2";

   };


2. PWM设备定义:

     &timer12 {

       status = "okay";

       prescaler = <200>;      /* 200MHz / 200 = 1MHz */

       channels = <4>;


       pwm12: pwm {

           compatible = "gd,gd32-pwm";

           status = "okay";

           #pwm-cells = <3>;

           pinctrl-0 = <&pwm12_ch0_pf8>;

           pinctrl-names = "default";

       };

   };


3. 引脚复用配置 (gd32f527_eval-pinctrl.dtsi):

   pwm12_ch0_pf8: pwm12_ch0_pf8 {

       group1 {

           pinmux = <TIMER12_CH0_PF8>;

       };

   };


4. 引脚复用定义 (gd32f527xx-pinctrl.h):

   #define TIMER12_CH0_PF8 \

       GD32_PINMUX_AF('F', 8, AF9)



四、PWM驱动说明


Zephyr的GD32 PWM驱动位于:zephyr/drivers/pwm/pwm_gd32.c


主要API函数:

  pwm_set_cycles(dev, channel, period, pulse, flags)

    - dev: PWM设备指针

    - channel: PWM通道 (0-3)

    - period: 周期(cycles或微秒)

    - pulse: 脉冲宽度(cycles或微秒)

    - flags: 极性标志


设备获取方式:

  #define PWM_DEV DT_ALIAS(pwmled3)

  const struct device *pwm_dev = DEVICE_DT_GET(PWM_DEV);


五、源代码实现


文件位置:samples/boards/gd32f527_eval/pwm_breath_led/src/main.c


1. 头文件包含:

   #include <zephyr/kernel.h>
   #include <zephyr/drivers/gpio.h>
   #include <zephyr/drivers/pwm.h>
   #include <zephyr/sys/printk.h>
   #include <zephyr/device.h>
   #include <zephyr/shell/shell.h>

2. 关键定义:

    #define PWM_PERIOD_US 1000    /* 1kHz, 1000us */

   #define PWM_CHANNEL 0         /* TIMER12_CH0 */

3. 正弦波查找表(64步完成一个呼吸周期):

   暗->亮过渡:0,0,0,0,1,2,3,5,7,10,12,15,18,22,26,30,35,40,45,50,

              55,60,65,70,75,80,85,88,91,93,95,97,98,99,100

   亮状态:100,100,100,100,100,100,100,100,100,100,100,100

   亮->暗过渡:100,100,99,98,97,95,93,91,88,85,80,75,70,65,60,55


4. Shell命令实现:

   - breath: 启动/停止呼吸灯效果

   - pwm_led2 <0-100>: 设置占空比(0-100%)


5. 呼吸灯循环:

   while (1) {
       if (breath_active) {
           duty = sine_table[breath_index];
           pulse = (PWM_PERIOD_US * duty) / 100;
           pwm_set_cycles(pwm_dev, PWM_CHANNEL, PWM_PERIOD_US, pulse, 0);

           breath_index++;
           if (breath_index >= 64) {
               breath_index = 0;
           }
       }
       k_msleep(5);
   }

六、关键配置参数

时钟配置:

  - 系统时钟:200MHz

  - APB1时钟:200MHz

  - TIMER12时钟:200MHz

  - PSC预分频:199 (200MHz / 200 = 1MHz)

  - CAR自动重装:999 (1MHz / 1000 = 1kHz)


PWM参数:

  - 频率:1kHz (周期1000us)

  - 分辨率:1000级 (0.1%精度)

  - 占空比范围:0-100%


呼吸效果:

  - 步数:64步/周期

  - 步进延迟:5ms

  - 呼吸周期:64 × 5ms = 320ms (半周期)


七、Shell命令使用

1. 启动呼吸灯:

 

uart:~$ breath
Breathing started
uart:~$

2. 停止呼吸灯:

uart:~$ breath
Breathing stopped
uart:~$


3. 设置占空比:

    uart:~$ pwm_led2 50
   PWM LED2: 50%
   uart:~$ pwm_led2 20
   PWM LED2: 20%
   uart:~$ pwm_led2 0
   PWM LED2: 0%

八、常见问题排查

1. LED不亮:

   - 检查GPIOF时钟是否使能

   - 检查引脚复用是否正确配置为AF9

   - 检查TIMER12计数器是否使能

2. PWM波形频率异常:

   - 检查PSC和CAR寄存器的值

   - 确认APB1时钟是否为200MHz

3. 呼吸效果不平滑:

   - 检查正弦波查找表是否正确

   - 检查步进延迟是否合适(建议5-10ms)

4. 调试方法:

   - 使用timer12_reg命令查看寄存器值

   - 使用示波器测量PF8引脚波形

【参考资料】

1. GD32F5xx技术参考手册 - 定时器章节

2. Zephyr PWM驱动源码 - zephyr/drivers/pwm/pwm_gd32.c

3. GD32F527-EVAL原理图

4. Zephyr项目文档 - PWM子系统





关键词: gd32f527     Zephyr     呼吸灯     pwm    

院士
2026-02-19 23:38:31     打赏
2楼

楼主也是使用正弦波产生PWM的占空比


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]