APP PWM驱动
宏定义
APP_PWM_PIN_ENABLE
| 描述 | 值 |
|---|---|
开启PWM引脚功能 |
1 |
详细信息请参考文件:SDK_Folder\drivers\inc\app_pwm.h。
APP_PWM_PIN_DISABLE
| 描述 | 值 |
|---|---|
关闭PWM引脚功能 |
0 |
详细信息请参考文件:SDK_Folder\drivers\inc\app_pwm.h。
结构体
app_pwm_pin_t
结构体定义如下:
| 成员 | 描述 | 取值 |
|---|---|---|
app_io_type_t type |
设置IO类型 |
同app_io_evt_t中描述 |
app_io_mux_t mux |
设置IO映射功能 |
参考app_io_init_t结构体,具体映射模式参考芯片Datasheet中的Pin Mux |
uint32_t pin |
设置IO引脚 |
参考app_io_init_t结构体,具体根据芯片Datasheet中PWM资源进行选择 |
app_io_pull_t pull |
设置IO上拉/下拉/浮空 |
同app_io_init_t结构体中描述 |
uin8_t enable |
开启或关闭PIN |
该参数的取值可以是下列值中的任意一个:
|
详细信息请参考文件:SDK_Folder\drivers\inc\app_pwm.h。
app_pwm_pin_cfg_t
结构体定义如下:
| 成员 | 描述 | 取值 |
|---|---|---|
app_pwm_pin_t channel_a |
配置通道A的IO引脚 |
参考结构体app_pwm_pin_t |
app_pwm_pin_t channel_b |
配置通道B的IO引脚 |
参考结构体app_pwm_pin_t |
app_pwm_pin_t channel_c |
配置通道C的IO引脚 |
参考结构体app_pwm_pin_t |
详细信息请参考文件:SDK_Folder\drivers\inc\app_pwm.h。
app_pwm_channel_init_t
结构体定义如下:
| 成员 | 描述 | 取值 |
|---|---|---|
uint8_t duty |
配置PWM输出占空比,占空比从0% ~ 100%可配 |
0 ~ 100之间的任意整数 |
uint8_t drive_polarity |
配置PWM输出极性 |
该参数的取值可以是下列值中的任意一个:
|
uint32_t fstoplvl |
Flicker模式下的停止时电平配置,GR551x无该参数 |
该参数的取值可以是下列值中的任意一个:
|
详细信息请参考文件:SDK_Folder\drivers\inc\app_pwm.h。
app_pwm_params_t
结构体定义如下:
| 成员 | 描述 | 取值 |
|---|---|---|
| app_pwm_id_t id |
指定PWM模块ID |
该参数的取值可以是下列值中的任意一个:
|
| app_pwm_pin_cfg_t pin_cfg |
配置PWM各通道IO属性 |
参考结构体app_pwm_pin_cfg_t |
| app_pwm_active_channel_t active_channel |
配置PWM激活的通道 |
该参数的取值可以是下列值中的任意一个:
|
| pwm_init_t init |
配置PWM初始化参数 |
参考结构体pwm_init_t |
| pwm_env_t pwm_env | 仅用于记录初始化设备的句柄、相关参数等,不需要配置 |
详细信息请参考文件:SDK_Folder\drivers\inc\app_pwm.h。
pwm_init_t
结构体定义如下:
| 成员 | 描述 | 取值 |
|---|---|---|
| uint32_t mode |
PWM模式 |
该参数的取值可以是下列值中的任意一个:
|
| uint32_t align |
PWM脉冲对齐方式 |
该参数的取值可以是下列值中的任意一个:
|
| uint32_t freq |
PWM频率 |
0 ~ SystemFreq/2(SystemFreq为系统时钟频率) |
| uint32_t bperiod |
PWM在呼吸模式下的呼吸周期,单位ms |
0 ~ 0xFFFFFFFF/SystemFreq*1000(SystemFreq为系统时钟频率) 注意: PWM占空比从0%变化到100%所需的周期数应至少大于2。 |
| uint32_t hperiod |
PWM在呼吸模式下的保持时间,单位ms |
0 ~ 0xFFFFFF/SystemFreq*1000(SystemFreq为系统时钟频率) |
| uint32_t bstoplvl |
PWM在呼吸模式下,停止时电平配置(GR551x无该参数) |
该参数的取值可以是下列值中的任意一个:
|
| pwm_channel_init_t channel_a |
通道A的配置参数 |
参考pwm_channel_init_t结构体 |
| pwm_channel_init_t channel_b |
通道B的配置参数 |
参考pwm_channel_init_t结构体 |
| pwm_channel_init_t channel_c |
通道C的配置参数 |
参考pwm_channel_init_t结构体 |
pwm_init_t结构体成员(适用于GR551x、GR5526和GR5x25)的详细信息请参考文件:SDK_Folder\drivers\inc\hal\gr55xx_hal_pwm.h。
| 成员 | 描述 | 取值 |
|---|---|---|
| uint32_t mode |
模式 |
该参数的取值可以是下列值中的任意一个:
|
| uint32_t prd_cycles |
周期循环个数 | 循环输出脉冲数,为0时持续输出 |
| pwm_none_coding_init_t none_coding_mode_cfg | 非编码下配置 | 参考代码中的pwm_none_coding_init_t |
|
pwm_coding_init_t coding_mode_cfg |
编码配置 | 参考代码中的pwm_coding_init_t |
- GR533x :SDK_Folder\drivers\inc\hal\gr533x_hal_pwm.h
- GR5405:SDK_Folder\hal_drv\include\hal_pwm.h
pwm_channel_init_t
结构体定义如下:
| 成员 | 描述 | 取值 |
|---|---|---|
uint8_t duty |
PWM占空比 |
0 ~ 100 |
uint8_t drive_polarity |
PWM输出模式下的驱动极性 |
该参数的取值可以是下列值中的任意一个:
|
uint32_t fstoplvl |
PWM在Flicker模式下,停止时的电平配置(GR551x无该参数) |
该参数的取值可以是下列值中的任意一个:
|
- GR551x/GR5526/GR5x25:SDK_Folder\drivers\inc\hal\gr55xx_hal_pwm.h
- GR533x:SDK_Folder\drivers\inc\hal\gr533x_hal_pwm.h
- GR5405:SDK_Folder\hal_drv\include\hal_pwm.h
枚举
app_pwm_id_t
枚举定义如下:
| 成员 | 描述 |
|---|---|
APP_PWM_ID_0 = 0 |
PWM模块0 |
APP_PWM_ID_1 = 1 |
PWM模块1 |
APP_PWM_ID_MAX |
PWM模块总数为2,用作参数检测 |
详细信息请参考文件:SDK_Folder\drivers\inc\app_pwm.h。
app_pwm_active_channel_t
枚举定义如下:
| 成员 | 描述 |
|---|---|
APP_PWM_ACTIVE_CHANNEL_A = 0x01 |
PWM激活通道A |
APP_PWM_ACTIVE_CHANNEL_B = 0x02 |
PWM激活通道B |
APP_PWM_ACTIVE_CHANNEL_C = 0x04 |
PWM激活通道C |
APP_PWM_ACTIVE_CHANNEL_ALL = 0x07 |
PWM激活所有通道 |
APP_PWM_ACTIVE_CHANNEL_CLEARED = 0x00 |
PWM不激活所有通道 |
详细信息请参考文件:SDK_Folder\drivers\inc\app_pwm.h。
app_pwm_state_t
枚举定义如下:
| 成员 | 描述 |
|---|---|
APP_PWM_INVALID = 0 |
PWM不可用 |
APP_PWM_ACTIVITY = 1 |
PWM运行中 |
APP_PWM_SLEEP= 2 |
PWM睡眠 |
详细信息请参考文件:SDK_Folder\drivers\inc\app_pwm.h。
app_pwm_module_state_t
枚举定义如下:
| 成员 | 描述 |
|---|---|
APP_PWM_STOP = 0 |
PWM停止运行 |
APP_PWM_START = 1 |
PWM开始运行 |
详细信息请参考文件:SDK_Folder\drivers\inc\app_pwm.h。
接口函数
| API | 芯片 | ||||
|---|---|---|---|---|---|
| GR551x | GR5526 | GR5x25 | GR533x | GR5405 | |
| app_pwm_init |
Y |
Y |
Y |
Y |
Y |
| app_pwm_deinit |
Y |
Y |
Y |
Y |
Y |
| app_pwm_start |
Y |
Y |
Y |
Y |
Y |
| app_pwm_stop |
Y |
Y |
Y |
Y |
Y |
| app_pwm_update_freq |
Y |
Y |
Y |
Y |
Y |
| app_pwm_resume | N | N | N | Y | Y |
| app_pwm_pause | N | N | N | Y | Y |
| app_pwm_config_channel |
Y |
Y |
Y |
Y |
Y |
| app_pwm_inactive_channel |
N |
Y |
Y |
Y |
Y |
| app_pwm_get_handle |
Y |
Y |
Y |
Y |
Y |
| app_pwm_set_coding_data_in_one_channel | N | N | N | Y | Y |
| app_pwm_set_coding_data_in_three_channels | N | N | N | Y | Y |
| app_pwm_start_coding_in_one_channel | N | N | N | Y | Y |
| app_pwm_start_coding_in_three_channels | N | N | N | Y | Y |
app_pwm_init
| 函数原型 | uint16_t app_pwm_init(app_pwm_params *p_params) |
|---|---|
| 功能说明 | 根据初始化参数初始化PWM模块 |
| 输入参数 | p_params:初始化参数的结构体指针,把结构体里的初始化变量传入该函数 |
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 |
app_pwm_deinit
| 函数原型 | uint16_t app_pwm_deinit(app_pwm_id_t id) |
|---|---|
| 功能说明 | 反初始化PWM模块 |
| 输入参数 | id:指定需要反初始化的PWM模块(0或1) |
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 |
app_pwm_start
| 函数原型 | uint16_t app_pwm_start(app_pwm_id_t id) |
|---|---|
| 功能说明 | PWM开始运行 |
| 输入参数 | id:指定需要运行的PWM模块(0或1) |
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 |
app_pwm_stop
| 函数原型 | uint16_t app_pwm_stop(app_pwm_id_t id) |
|---|---|
| 功能说明 | PWM停止运行 |
| 输入参数 | id:指定需要停止的PWM模块(0或1) |
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 |
app_pwm_update_freq
| 函数原型 | uint16_t app_pwm_update_freq(app_pwm_id_t id, uint32_t freq) |
|---|---|
| 功能说明 | 更新PWM频率 |
| 输入参数 |
|
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 | 在PWM运行和停止时均可更新频率 |
app_pwm_resume
| 函数原型 | uint16_t app_pwm_resume(app_pwm_id_t id) |
|---|---|
| 功能说明 | 恢复PWM信号输出 |
| 输入参数 | id:指定需要配置的PWM模块(0或1) |
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 |
app_pwm_pause
| 函数原型 | uint16_t app_pwm_pause (app_pwm_id_t id) |
|---|---|
| 功能说明 | 暂停PWM信号输出 |
| 输入参数 | id:指定需要配置的PWM模块(0或1)
|
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 |
app_pwm_config_channel
| 函数原型 | uint16_t app_pwm_config_channel(app_pwm_id_t id, app_pwm_active_channel_t channel, app_pwm_channel_init_t *p_config) |
|---|---|
| 功能说明 | 配置PWM通道参数,包括占空比、极性和停止电平 |
| 输入参数 |
|
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 | 在PWM运行和停止时均可调用该接口 |
app_pwm_inactive_channel
| 函数原型 | uint16_t app_pwm_inactive_channel(app_pwm_id_t id, app_pwm_active_channel_t channel) |
|---|---|
| 功能说明 | 停止指定的通道输出 |
| 输入参数 |
|
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 | 在PWM运行和停止时均可调用该接口 |
app_pwm_get_handle
| 函数原型 | pwm_handle_t *app_pwm_get_handle(app_pwm_id_t id) |
|---|---|
| 功能说明 | 获取当前PWM句柄 |
| 输入参数 | id:指定需要获取的PWM模块(0或1) |
| 返回值 | pwm_handle_t:PWM句柄结构体 |
| 备注 |
app_pwm_set_coding_data_in_one_channel
| 函数原型 | uint16_t app_pwm_set_coding_data_in_one_channel(app_pwm_id_t id, uint32_t coding_data) |
|---|---|
| 功能说明 | 配置单通道模式下PWM模块的编码数据 |
| 输入参数 |
|
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 | 仅单通道模式下可以使用该接口 |
app_pwm_set_coding_data_in_three_channels
| 函数原型 | uint16_t app_pwm_set_coding_data_in_three_channels(app_pwm_id_t id, uint32_t coding_data0, uint32_t coding_data1, uint32_t coding_data2) |
|---|---|
| 功能说明 | 配置三通道模式下PWM模块的编码数据 |
| 输入参数 |
|
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 | 仅三通道模式下可以使用该接口 |
app_pwm_start_coding_in_one_channel
| 函数原型 | uint16_t app_pwm_start_coding_in_one_channel(app_pwm_id_t id, uint32_t coding_data) |
|---|---|
| 功能说明 | 在中断模式下开始生成一个通道的编码波形 |
| 输入参数 |
|
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 | 仅单通道模式下可以使用该接口 |
app_pwm_start_coding_in_three_channels
| 函数原型 | uint16_t app_pwm_start_coding_in_three_channels(app_pwm_id_t id, uint32_t coding_data0, uint32_t coding_data1, uint32_t coding_data2) |
|---|---|
| 功能说明 | 在中断模式下开始生成三个通道的编码波形 |
| 输入参数 |
|
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 | 仅三通道模式下可以使用该接口 |
DMA接口函数
| API | 芯片 | ||||
|---|---|---|---|---|---|
| GR551x | GR5526 | GR5x25 | GR533x | GR5405 | |
| app_pwm_dma_init | N | N | N | Y | Y |
| app_pwm_dma_deinit | N | N | N | Y | Y |
| app_pwm_start_coding_with_dma | N | N | N | Y | Y |
app_pwm_dma_init
| 函数原型 | uint16_t app_pwm_dma_init(app_pwm_params_t *p_params) |
|---|---|
| 功能说明 | 初始化PWM DMA方式传输 |
| 输入参数 | p_params:初始化参数的结构体指针,将结构体中的初始化变量传入该函数 |
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 |
app_pwm_dma_deinit
| 函数原型 | uint16_t app_pwm_dma_deinit(app_pwm_id_t id) |
|---|---|
| 功能说明 | 反初始化PWM DMA方式传输 |
| 输入参数 | id:指定需要获取的PWM模块(0或1) |
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 |
app_pwm_start_coding_with_dma
| 函数原型 | uint16_t app_pwm_start_coding_with_dma(app_pwm_id_t id, uint32_t *p_data, uint16_t size) |
|---|---|
| 功能说明 | 在DMA模式下开始生成单个/三个通道的编码波形 |
| 输入参数 |
|
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 |
|
示例工程
PWM Flicker
示例工程实现PWM的固定占空比模式,并改变PWM的频率、占空比等参数,可以通过逻辑分析仪进行波形观察,工程路径:SDK_Folder\projects\peripheral\pwm\app_pwm。
初始化参数
app_pwm_params_t pwm_params = {
.id = APP_PWM0_MODULE,
.pin_cfg = {
.channel_a = {
.type = APP_PWM0_GPIO_TYPE,
.mux = APP_PWM0_GPIO_MUX,
.pin = APP_PWM0_CHANNEL_A,
.pull = APP_IO_NOPULL,
.enable = APP_PWM_PIN_ENABLE,
},
.channel_b = {
.type = APP_PWM0_GPIO_TYPE,
.mux = APP_PWM0_GPIO_MUX,
.pin = APP_PWM0_CHANNEL_B,
.pull = APP_IO_NOPULL,
.enable = APP_PWM_PIN_ENABLE,
},
.channel_c = {
.type = APP_PWM0_GPIO_TYPE,
.mux = APP_PWM0_GPIO_MUX,
.pin = APP_PWM0_CHANNEL_C,
.pull = APP_IO_NOPULL,
.enable = APP_PWM_PIN_ENABLE,
},
},
.active_channel = APP_PWM_ACTIVE_CHANNEL_ALL,
.init = {
.mode = PWM_MODE_FLICKER,
.align = PWM_ALIGNED_EDGE,
.freq = 100,
.bperiod = 500,
.hperiod = 200,
#if (APP_DRIVER_CHIP_TYPE != APP_DRIVER_GR551X)
.bstoplvl = PWM_STOP_LVL_LOW,
#endif
.channel_a = {
.duty = 30,
.drive_polarity = PWM_DRIVEPOLARITY_POSITIVE,
#if (APP_DRIVER_CHIP_TYPE != APP_DRIVER_GR551X)
.fstoplvl = PWM_STOP_LVL_LOW,
#endif
},
.channel_b = {
.duty = 50,
.drive_polarity = PWM_DRIVEPOLARITY_NEGATIVE,
#if (APP_DRIVER_CHIP_TYPE != APP_DRIVER_GR551X)
.fstoplvl = PWM_STOP_LVL_HIGH,
#endif
},
.channel_c = {
.duty = 80,
.drive_polarity = PWM_DRIVEPOLARITY_POSITIVE,
#if (APP_DRIVER_CHIP_TYPE != APP_DRIVER_GR551X)
.fstoplvl = PWM_STOP_LVL_LOW,
#endif
},
},
};
- id:定义PWM ID
选择APP_PWM0_MODULE,即PWM0
- pin_cfg:配置通道A/B/C引脚
- pin_cfg.channel_a:PWM通道A引脚配置
- pin_cfg.channel_b:PWM通道B引脚配置
- pin_cfg.channel_c:PWM通道C引脚配置
- active_channel:选择激活的通道
选择APP_PWM_ACTIVE_CHANNEL_ALL,激活所有通道
- init:PWM参数配置
- init.mode:采用PWM_MODE_FLICKER,即选择Flicker模式
- init.align:PWM脉冲对齐方式PWM_ALIGNED_EDGE
- init.freq:PWM频率10 MHz
- init.bperiod:PWM在呼吸模式下的呼吸周期为500 ms(Flicker模式下,该参数无效)
- init.hperiod:PWM在呼吸模式下的保持时间为200 ms(Flicker模式下,该参数无效)
- init.bstoplvl:呼吸模式下停止电平:PWM_STOP_LVL_LOW表示停止电平为低电平,PWM_STOP_LVL_HIGH表示停止电平为高电平
- init.channel_a.duty:PWM通道A占空比
- init.channel_a.drive_polarity:PWM输出模式下的驱动极性,PWM_DRIVEPOLARITY_POSITIVE表示正极性,起始电平为低电平;PWM_DRIVEPOLARITY_NEGATIVE表示负极性,起始电平为高电平
- init.channel_a.fstoplvl:Flicker模式下停止电平:PWM_STOP_LVL_LOW表示停止电平为低电平,PWM_STOP_LVL_HIGH表示停止电平为高电平
重要函数
- 初始化PWM
ret = app_pwm_init(&pwm_params) - 开始PWM输出
app_pwm_start(APP_PWM0_MODULE) - 更新PWM频率
app_pwm_update_freq(APP_PWM0_MODULE, 1000) - 修改通道参数
app_pwm_config_channel(APP_PWM0_MODULE, APP_PWM_ACTIVE_CHANNEL_B, &channel_cfg) - 停止指定的通道输出
app_pwm_inactive_channel(APP_PWM0_MODULE, APP_PWM_ACTIVE_CHANNEL_A) - 停止PWM输出
app_pwm_stop(APP_PWM0_MODULE)
测试验证
用逻辑分析仪观察MSIO0、MSIO1和MSIO2的波形变化,以GR5526为例,下面是观察的波形。
- MSIO0:开始输出波形占空比为30%,频率为100 Hz,然后停止输出,最后设置成频率为1000 Hz,占空比为60%的波形。
- MSIO1:开始输出波形占空比为50%,频率为100 Hz,然后进行了一次极性反转,接着输出频率为1000 Hz,占空比为20%的波形,最后设置成频率为1000 Hz,占空比为60%的波形。
- MSIO2:开始输出波形占空比为80%,频率为100 Hz,接着改变频率为1000 Hz,最后设置成频率为1000 Hz,占空比为60%的波形。