Ai-Thinker-Open_RTL8710BX_A.../Living_SDK/board/hf-lpb135/hal_pwm.c

100 lines
1.9 KiB
C
Raw Normal View History

2020-06-18 12:06:52 +00:00
#include "hal/soc/soc.h"
#include "PeripheralNames.h"
#include "pwmout_api.h"
#define PWM_NUM 5
static pwmout_t PWM_OBJ[PWM_NUM];
static PinName PWM_MAP[PWM_NUM] = {
[0] = PD_0,
//[1] = PC_1,
//[2] = PB_0,
[1] = PD_1,
[2] = PD_2,
[3] = PD_3,
[4] = PB_3,
//[5] = PB_5,
//[6] = PB_6,
//[7] = PB_1
};
int32_t hal_pwm_init(pwm_dev_t *pwm){
if(pwm->port >= PWM_NUM){
return -1;
}
#ifndef DELETE_HFILOP_CODE
if(pwm->config.freq > 1000000 || pwm->config.freq < 200)
return -1;
if(pwm->config.duty_cycle > 1 || pwm->config.duty_cycle < 0)
return -1;
#endif
pwm->priv = &PWM_OBJ[pwm->port];
pwmout_init(pwm->priv, PWM_MAP[pwm->port]);
#ifndef DELETE_HFILOP_CODE
static int init_clk = 0;
if(!init_clk)
{
pwmout_clk_set(pwm->priv, 1, 0);
init_clk = 1;
}
#endif
return 0;
}
int32_t hal_pwm_clk(pwm_dev_t *pwm, int src, int div){
if(1 == src){
pwm->config.freq = 10000000;
}else{
pwm->config.freq = 16384;
}
pwmout_clk_set(pwm->priv, src, div);
return 0;
}
int32_t hal_pwm_period_us(pwm_dev_t *pwm, int us){
pwmout_period_us(pwm->priv, us);
return 0;
}
int32_t hal_pwm_write(pwm_dev_t *pwm, float percent){
pwm->config.duty_cycle = percent;
pwmout_write(pwm->priv, percent);
return 0;
}
int32_t hal_pwm_diff_write(pwm_dev_t *pwm, float percent){
pwm->config.duty_cycle = percent;
pwmout_diff_write(pwm->priv, percent);
return 0;
}
int32_t hal_pwm_sync_write(pwm_dev_t *pwm, float percent, uint8_t duty_sel){
pwm->config.duty_cycle = percent;
pwmout_sync_write(pwm->priv, percent, duty_sel);
return 0;
}
int32_t hal_pwm_start(pwm_dev_t *pwm){
#ifndef DELETE_HFILOP_CODE
int us = 1000000/pwm->config.freq;
pwmout_period_us(pwm->priv, us);
pwmout_write(pwm->priv, pwm->config.duty_cycle);
#else
pwmout_start(pwm->priv);
#endif
return 0;
}
int32_t hal_pwm_stop(pwm_dev_t *pwm){
pwmout_stop(pwm->priv);
return 0;
}
int32_t hal_pwm_finalize(pwm_dev_t *pwm){
pwmout_free(pwm->priv);
return 0;
}