PWM
介绍
对于不同底层驱动的pwm操作实现,统一封装成本文所述hal pwm接口。 hal相关头文件位于目录:[include/aos/hal] hal相关实现位于具体的mcu目录下,如:[platform/mcu/stm32f1xx/hal/]
API列表
函数名称 | 功能描述 |
---|---|
hal_pwm_init | 初始化指定PWM |
hal_pwm_start | 开始输出指定PWM |
hal_pwm_stop | 停止输出指定PWM |
hal_pwm_para_chg | 修改指定PWM参数 |
hal_pwm_finalize | 关闭指定PWM |
API详情
请参考[include/aos/hal/pwm.h]
相关宏定义
#define PWM0_GROUP_MASK 0x00
#define PWM1_GROUP_MASK 0x40
#define PWM2_GROUP_MASK 0x80
#define PWM3_GROUP_MASK 0xC0
#define PWM_PORT_MASK 0x3F
相关数据结构
pwm_dev_t
typedef struct {
uint8_t port; /* pwm port */
pwm_config_t config; /* spi config */
void *priv; /* priv data */
} pwm_dev_t;
pwm_config_t
typedef struct {
float duty_cycle; /* the pwm duty_cycle */
uint32_t freq; /* the pwm freq */
} pwm_config_t;
hal_pwm_init
初始化指定PWM
函数原型
int32_t hal_pwm_init(pwm_dev_t *pwm);
参数
参数名称 | 出入参 | 参数描述 | 参数示例 |
---|---|---|---|
pwm_dev_t *pwm | 入参 | PWM设备描述,定义需要初始化的PWM参数 | 用户自定义一个pwm_dev_t结构体 |
返回值
返回成功或失败, 返回0表示PWM初始化成功,非0表示失败
调用示例
#define PWM1_PORT_NUM 1
/* define dev */
pwm_dev_t pwm1;
/* pwm port set */
pwm1.port = PWM1_PORT_NUM;
/* pwm attr config */
pwm1.config.duty_cycle = 0.5f; /* 1s */
pwm1.config.freq = 300000; /* 1s */
/* init pwm1 with the given settings */
ret = hal_pwm_init(&pwm1);
hal_pwm_start
开始输出指定PWM
函数原型
int32_t hal_pwm_start(pwm_dev_t *pwm);
参数
参数名称 | 出入参 | 参数描述 | 参数示例 |
---|---|---|---|
pwm_dev_t *pwm | 入参 | PWM设备描述 | 使用hal_pwm_init时传入pwm_dev_t结构体 |
返回值
返回成功或失败, 返回0表示PWM开始输出成功,非0表示失败
调用示例
// pwm1初始化同上
ret = hal_pwm_start(&pwm1);
hal_pwm_stop
停止输出指定PWM
函数原型
int32_t hal_pwm_stop(pwm_dev_t *pwm);
参数
参数名称 | 出入参 | 参数描述 | 参数示例 |
---|---|---|---|
pwm_dev_t *pwm | 入参 | PWM设备描述 | 使用hal_pwm_init时传入pwm_dev_t结构体 |
返回值
返回成功或失败, 返回0表示PWM停止输出成功,非0表示失败
调用示例
ret = hal_pwm_stop(&pwm1);
hal_pwm_para_chg
修改指定PWM参数
函数原型
int32_t hal_pwm_para_chg(pwm_dev_t *pwm, pwm_config_t para);
参数
参数名称 | 出入参 | 参数描述 | 参数示例 |
---|---|---|---|
pwm_dev_t *pwm | 入参 | PWM设备描述 | 使用hal_pwm_init时传入pwm_dev_t结构体 |
pwm_config_t para | 入参 | 新配置参数 | {0.25f,300000} |
返回值
返回成功或失败, 返回0表示PWM参数修改成功,非0表示失败
调用示例
pwm_config_t para = {0.25f,300000};
ret = hal_pwm_para_chg(&pwm1,para);
hal_pwm_finalize
关闭指定PWM
函数原型
int32_t hal_pwm_finalize(pwm_dev_t *pwm);
参数
参数名称 | 出入参 | 参数描述 | 参数示例 |
---|---|---|---|
pwm_dev_t *pwm | 入参 | PWM设备描述 | 使用hal_pwm_init时传入pwm_dev_t结构体 |
返回值
返回成功或失败, 返回0表示PWM关闭成功,非0表示失败
调用示例
ret = hal_pwm_finalize(&pwm1);
使用
添加该组件
在相应的platform/mcu的mk内,添加对应hal文件的编译包含。
包含头文件
#include "aos/hal/pwm.h"
使用示例
#include <aos/hal/pwm.h>
#define PWM1_PORT_NUM 1
/* define dev */
pwm_dev_t pwm1;
int application_start(int argc, char *argv[])
{
int32_t ret = -1;
pwm_config_t pwm_cfg;
static int count = 0;
/* pwm port set */
pwm1.port = PWM1_PORT_NUM;
/* pwm attr config */
pwm1.config.duty_cycle = 0.5f; /* 1s */
pwm1.config.freq = 300000; /* 1s */
/* init pwm1 with the given settings */
ret = hal_pwm_init(&pwm1);
if (ret != 0) {
printf("pwm1 init error !\n");
}
/* start pwm1 */
ret = hal_pwm_start(&pwm1);
if (ret != 0) {
printf("pwm1 start error !\n");
}
while(1) {
/* change the duty cycle to 30% */
if (count == 5) {
memset(&pwm_cfg, 0, sizeof(pwm_config_t));
pwm_cfg.duty_cycle = 0.3f;
ret = hal_pwm_para_chg(&pwm1, pwm_cfg);
if (ret != 0) {
printf("pwm1 para change error !\n");
}
}
/* stop and finalize pwm1 */
if (count == 20) {
hal_pwm_stop(&pwm1);
hal_pwm_finalize(&pwm1);
}
/* sleep 1000ms */
aos_msleep(1000);
count++;
};
}
注:port为逻辑端口号,其与物理端口号的对应关系见具体的对接实现
移植说明
新建hal_pwm_xxmcu.c和hal_pwm_xxmcu.h的文件,并将这两个文件放到platform/mcu/xxmcu/hal目录下。在hal_pwm_xxmcu.c中实现所需要的hal函数,hal_pwm_xxmcu.h中放置相关宏定义。<br /> 参考platform/mcu/stm32l4xx/src/STM32L496G-Discovery/hal/hal_pwm_stm32l4.c