跳转至

PWM 示例*

提示

1. 概述*

PWM 输出示例 App,演示如何在芯片上使用 PWM(脉冲宽度调制)功能,实现周期性的 PWM 信号开关控制。

2. 功能特性*

  • 双通道 PWM 信号输出(PAD 5 + PAD 6)
  • 定时自动切换 PWM 开/关状态(默认 5 秒周期)
  • 使用宏定义配置引脚和参数,方便修改

3. 目录结构*

app/pwm_app/
├── app.c       # 主程序
├── app.mk       # 编译配置
├── app.name     # Kconfig 选项
└── Kconfig      # 子配置(空)
文件 作用
app.c 主程序,PWM 初始化与定时切换逻辑
app.mk 编译 app.c
app.name 定义 CONFIG_APP_PWM 选项

4. 配置说明*

4.1 宏定义*

// PWM 引脚和 Timer 配置
#define PWM_PIN_1           5       // 第一个 PWM 引脚
#define PWM_TIMER_1         5       // 第一个 PWM 对应的 Timer
#define PWM_PIN_2           6       // 第二个 PWM 引脚
#define PWM_TIMER_2         0       // 第二个 PWM 对应的 Timer

// PWM 信号参数
#define PWM_PERIOD_NS       100000000   // PWM 周期:100ms(纳秒)
#define PWM_DUTY_NS         50000000    // PWM 占空比:50ms(50%)(纳秒)

// 引脚复用配置
#define PWM_PADMUX_PWM      3           // 引脚复用为 PWM 功能
#define PWM_PADMUX_GPIO     7           // 引脚复用为 GPIO 功能

// 切换时间配置
#define TOGGLE_INTERVAL_MS  5000        // 切换间隔:5 秒
#define EVENT_PERIOD_MS     40          // 事件触发周期:40ms
#define TOGGLE_COUNT        (TOGGLE_INTERVAL_MS / EVENT_PERIOD_MS)  // 自动计算:125 次

4.2 引脚映射*

引脚 Timer 复用功能 说明
PAD 5 Timer5 PWM(padmux=3) PWM 通道 1
PAD 6 Timer0 PWM(padmux=3) PWM 通道 2

4.3 PWM API*

gx_timer_enable_pwm_get(timer_id, port, period_ns, duty_ns);
参数 说明
timer_id Timer 编号
port 引脚编号
period_ns PWM 周期(纳秒),100000000ns = 100ms
duty_ns 高电平时间(纳秒),50000000ns = 50ms(50% 占空比)

5. 工作原理*

5.1 初始化流程*

  1. 设置 PAD 5、PAD 6 的引脚复用为 PWM 功能(padmux_set(pin, 3)
  2. 启用 Timer5 和 Timer0 生成 PWM 信号
  3. PWM 初始状态为**开启**

5.2 事件处理*

利用 EVENT_AUDIO_IN_RECORD_DONE 事件实现定时切换:

事件 触发时机 处理逻辑
EVENT_AUDIO_IN_RECORD_DONE Audio-in 录音完成(触发时间由 PCM 帧长决定,根据配置自行确定) 计数器累加,达到 125 次(5 秒)时切换 PWM 状态

5.3 主循环*

app_task_loop() 为空实现。

5.4 状态转换*

初始化 → PWM 开启 → (5 秒后) → PWM 关闭 → (5 秒后) → PWM 开启 → ...

切换逻辑: - PWM 开启 → 调用 gx_timer_disable_pwm() 关闭 Timer PWM,引脚切换为 GPIO 输入模式 - PWM 关闭 → 重新设置引脚复用为 PWM,启用 Timer PWM 输出

6. 使用方法*

6.1 编译*

cp configs/example/app/8006_pwm_app.config .config
make defconfig
make clean; make

或通过 menuconfig 选择:

make menuconfig
# OVP Application Settings → Applications Selection → PWM Sample

6.2 烧录运行*

cd tools/bootx/
./flash_nor.sh 0 -r 1000000

7. 预期输出*

串口(921600 波特率)输出交替日志:

[PWM_APP] Open PWM
[PWM_APP] Close PWM
[PWM_APP] Open PWM
...

每秒约输出 0.2 条(5 秒切换一次)。

8. 注意事项*

  1. 8005 引脚差异:8005 芯片的 PWM 引脚与 8006 不同,使用 8005 时需根据芯片手册修改 PWM_PIN_1PWM_PIN_2 宏定义
  2. Timer 冲突:SDK 中 Timer5 默认被系统占用,如需使用其他 Timer,通过 make menuconfig 修改 MCU_TIMER_ID 配置项:
    MCU settings  --->
       (5) Timer ID For gx_get_time_ms  # 修改此配置
    
  3. 引脚复用:不是所有引脚都支持 PWM 功能,需查阅芯片手册确认引脚的复用功能
  4. 芯片手册参考GX8006 Datasheet - 引脚复用说明
  5. PWM 关闭操作:关闭 PWM 时需要:
  6. 禁用 Timer PWM 功能
  7. 将引脚设置为 GPIO 模式
  8. 设置 GPIO 为输入模式(避免输出干扰)
  9. 休眠/唤醒未实现:当前 SDK 不支持休眠功能,app_suspend()app_resume() 保持空实现即可

9. 故障排查*

现象 可能原因 解决方法
PWM 无输出 引脚复用配置错误 参考芯片手册确认 padmux_set() 参数,PWM 模式值为 3
Timer 初始化失败 Timer 被系统占用 更换其他 Timer 或修改 MCU_TIMER_ID 配置