PWM 示例*
提示
- SDK 路径: http://gitlab.nationalchip.com/nationalchip/voice-wifi-solution/ovp_aiot
- App 路径: SDK 路径下 app/pwm_app/
- 适用芯片 8005/8006
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 初始化流程*
- 设置 PAD 5、PAD 6 的引脚复用为 PWM 功能(
padmux_set(pin, 3)) - 启用 Timer5 和 Timer0 生成 PWM 信号
- 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. 注意事项*
- 8005 引脚差异:8005 芯片的 PWM 引脚与 8006 不同,使用 8005 时需根据芯片手册修改
PWM_PIN_1、PWM_PIN_2宏定义 - Timer 冲突:SDK 中 Timer5 默认被系统占用,如需使用其他 Timer,通过
make menuconfig修改MCU_TIMER_ID配置项:MCU settings ---> (5) Timer ID For gx_get_time_ms # 修改此配置 - 引脚复用:不是所有引脚都支持 PWM 功能,需查阅芯片手册确认引脚的复用功能
- 芯片手册参考:GX8006 Datasheet - 引脚复用说明
- PWM 关闭操作:关闭 PWM 时需要:
- 禁用 Timer PWM 功能
- 将引脚设置为 GPIO 模式
- 设置 GPIO 为输入模式(避免输出干扰)
- 休眠/唤醒未实现:当前 SDK 不支持休眠功能,
app_suspend()和app_resume()保持空实现即可
9. 故障排查*
| 现象 | 可能原因 | 解决方法 |
|---|---|---|
| PWM 无输出 | 引脚复用配置错误 | 参考芯片手册确认 padmux_set() 参数,PWM 模式值为 3 |
| Timer 初始化失败 | Timer 被系统占用 | 更换其他 Timer 或修改 MCU_TIMER_ID 配置 |