90 lines
2.0 KiB
C
90 lines
2.0 KiB
C
#include "hdl_pwm.h"
|
|
|
|
/*unit 0.01us*/
|
|
static void TmrAConfig(uint32_t t)
|
|
{
|
|
|
|
stc_clock_freq_t sysFrq;
|
|
|
|
CLK_GetClockFreq(&sysFrq);
|
|
|
|
uint32_t peroid = 1.0 *sysFrq.u32Pclk1Freq / t;
|
|
|
|
stc_tmra_init_t stcTmraInit;
|
|
stc_tmra_pwm_init_t stcPwmInit;
|
|
|
|
/* 1. Enable TimerA peripheral clock. */
|
|
FCG_Fcg2PeriphClockCmd(TMRA_PERIPH_CLK, ENABLE);
|
|
|
|
/* 2. Set a default initialization value for stcTmraInit. */
|
|
(void)TMRA_StructInit(&stcTmraInit);
|
|
|
|
/* 3. Modifies the initialization values depends on the application. */
|
|
stcTmraInit.sw_count.u8CountMode = TMRA_MD;
|
|
stcTmraInit.sw_count.u8CountDir = TMRA_DIR;
|
|
stcTmraInit.u32PeriodValue = (peroid-1);
|
|
(void)TMRA_Init(TMRA_UNIT, &stcTmraInit);
|
|
|
|
/* 4. Set the comparison reference value. */
|
|
#if (APP_FUNC == APP_FUNC_NORMAL_SINGLE_PWM)
|
|
(void)TMRA_PWM_StructInit(&stcPwmInit);
|
|
|
|
stcPwmInit.u32CompareValue = 0;
|
|
stcPwmInit.u16PeriodMatchPolarity = TMRA_PWM_HIGH;
|
|
GPIO_SetFunc(TMRA_PWM_PORT, TMRA_PWM_PIN, TMRA_PWM_PIN_FUNC);
|
|
(void)TMRA_PWM_Init(TMRA_UNIT, TMRA_PWM_CH, &stcPwmInit);
|
|
TMRA_PWM_OutputCmd(TMRA_UNIT, TMRA_PWM_CH, ENABLE);
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
void hdl_pwm_init(int frq){
|
|
|
|
/* MCU Peripheral registers write unprotected. */
|
|
LL_PERIPH_WE(LL_PERIPH_GPIO | LL_PERIPH_FCG | LL_PERIPH_PWC_CLK_RMU);
|
|
|
|
/* Configures TimerA. */
|
|
TmrAConfig( frq);
|
|
|
|
/* MCU Peripheral registers write protected. */
|
|
LL_PERIPH_WP(LL_PERIPH_GPIO | LL_PERIPH_FCG | LL_PERIPH_PWC_CLK_RMU);
|
|
|
|
}
|
|
|
|
void hdl_pwm_enable(void){
|
|
|
|
/* Starts TimerA. */
|
|
TMRA_Start(TMRA_UNIT);
|
|
}
|
|
|
|
void hdl_pwm_disable(void){
|
|
|
|
/* Starts TimerA. */
|
|
TMRA_Stop(TMRA_UNIT);
|
|
}
|
|
|
|
void hdl_pwm_set_duty(int duty){
|
|
|
|
uint32_t period = TMRA_GetPeriodValue(TMRA_UNIT)+1;
|
|
|
|
uint32_t val = duty*0.01*period;
|
|
|
|
if(val <1){
|
|
val =1;
|
|
}
|
|
|
|
if(val >period){
|
|
val =period;
|
|
}
|
|
|
|
TMRA_Stop(TMRA_UNIT);
|
|
TMRA_SetCountValue(TMRA_UNIT,0);
|
|
TMRA_SetCompareValue(TMRA_UNIT,TMRA_PWM_CH,val-1);
|
|
TMRA_Start(TMRA_UNIT);
|
|
}
|
|
|
|
|
|
|
|
|