73 cpr_ctlapbclken_grctl__pwm_pclk_en__setf(ENABLE);
74 cpr_rstctl_ctlapb_sw__pwm_rstn__setf(RSTCTL_ENABLE);
75 cpr_rstctl_ctlapb_sw__pwm_rstn__setf(RSTCTL_DISABLE);
77 cpr_pwm_clk_ctl__pwm_clk_en__setf(ENABLE);
78 cpr_pwm_clk_ctl__pwm_clksel__setf(init_cfg->
SrcClk);
79 cpr_pwm_clk_ctl__pwm_clk0_div__setf(init_cfg->
DivClk);
80 cpr_pwm_clk_ctl__pwm_clk1_div__setf(init_cfg->
DivClk);
87 pwm_en__en__setf(reg_idx, DISABLE);
89 pwm_en__en_sel__setf(reg_idx, init_cfg->
SrcEnable);
95 pwm_compen__pwmcompen__setf(reg_idx, init_cfg->
InvertEnable);
97 pwm_comptime__comptime__setf(reg_idx, init_cfg->
InvertDelay);
100void xc_pwm_start(uint8_t reg_idx) { pwm_en__en__setf(reg_idx, PWM_EN_ENABLE); }
102void xc_pwm_stop(uint8_t reg_idx) { pwm_en__en__setf(reg_idx, PWM_EN_DISABLE); }
104void pwm_src_enable_set(uint8_t reg_idx, uint8_t src_enable) { pwm_en__en_sel__setf(reg_idx, src_enable); }
124 if (reg_idx == PWM0_IDX || reg_idx == PWM1_IDX) {
134 }
else if (reg_idx == PWM2_IDX) {
139 }
else if (reg_idx == PWM3_IDX) {
144 }
else if (reg_idx == PWM4_IDX) {
149 }
else if (reg_idx == PWM5_IDX) {
161 switch (pwm_cfg->
SrcClk) {
178 uint32_t freq_max = PWM_FREQ_MAX_CAL(pwm_clk, pwm_cfg->
DutyCycleAcc);
182 if (freq > freq_max) {
183 DEBUG(
"%s,line=%d,set freq=%d,The maximum configurable frequency %d hz "
184 "has been exceeded.\n",
185 __func__, __LINE__, freq, freq_max);
187 DEBUG(
"%s,line=%d,set freq=%d,maximum configurable frequency %d hz\n", __func__, __LINE__, freq, freq_max);
195 pwm_en__mode__setf(reg_idx, PWM_EN_MODE_ACC_65535);
197 pwm_ocpy__ocpy_ratio_config__setf(reg_idx, (dutycycle_acc - 1));
199 pwm_ocpy__ocpy_ratio__setf(reg_idx, dutycycle_acc - dutycycle);
201 pwm_up__update__setf(reg_idx, PWM_UP_UPDATE_ENABLE);
210 pwm_en__sleep_incr__setf(reg_idx, direction);
217 val = pwm_break_ctl__pwm_brk_enable__getf(PWM0_IDX);
219 if (reg_idx == PWM0_IDX || reg_idx == PWM1_IDX) {
220 val &= ~(PWM_BRK0_ENABLE_ENABLE);
221 val |= (PWM_BRK0_ENABLE_ENABLE);
222 }
else if (reg_idx == PWM2_IDX || reg_idx == PWM3_IDX) {
223 val &= ~(PWM_BRK1_ENABLE_ENABLE);
224 val |= (PWM_BRK1_ENABLE_ENABLE);
225 }
else if (reg_idx == PWM4_IDX || reg_idx == PWM5_IDX) {
226 val &= ~(PWM_BRK2_ENABLE_ENABLE);
227 val |= (PWM_BRK2_ENABLE_ENABLE);
230 pwm_break_ctl__pwm_brk_enable__setf(PWM0_IDX, val);
237 val = pwm_break_ctl__pwm_brk_enable__getf(PWM0_IDX);
239 if (reg_idx == PWM0_IDX || reg_idx == PWM1_IDX) {
240 val &= ~(PWM_BRK0_ENABLE_ENABLE);
241 }
else if (reg_idx == PWM2_IDX || reg_idx == PWM3_IDX) {
242 val &= ~(PWM_BRK1_ENABLE_ENABLE);
243 }
else if (reg_idx == PWM4_IDX || reg_idx == PWM5_IDX) {
244 val &= ~(PWM_BRK2_ENABLE_ENABLE);
247 pwm_break_ctl__pwm_brk_enable__setf(PWM0_IDX, val);
262 pwm_break_ctl__brk_dbc_en__setf(PWM0_IDX, debounce);
263 pwm_break_ctl__brk_dbc_step__setf(PWM0_IDX, step);
275 pwm_cap_tim_int_en__capture_upd_0_en__setf(ENABLE);
276 }
else if (ch == 1) {
277 pwm_cap_tim_int_en__capture_upd_1_en__setf(ENABLE);
278 }
else if (ch == 2) {
279 pwm_cap_tim_int_en__capture_upd_2_en__setf(ENABLE);
285 if (ch == PWM_IC_CH0) {
286 pwm_cap_tim_int_en__capture_upd_0_en__setf(DISABLE);
287 }
else if (ch == PWM_IC_CH1) {
288 pwm_cap_tim_int_en__capture_upd_1_en__setf(DISABLE);
289 }
else if (ch == PWM_IC_CH2) {
290 pwm_cap_tim_int_en__capture_upd_2_en__setf(DISABLE);
298 cap_tim_ctl__dbc_en__setf(ch, PWM_CAPTURE_DBC_ENABLE);
300 cap_tim_ctl__dbc_step__setf(ch, step);
305 cap_tim_ctl__dbc_en__setf(ch, PWM_CAPTURE_DBC_DISABLE);
307 cap_tim_ctl__dbc_step__setf(ch, step);
316 cap_tim_ctl__common_cnt_enable__setf(ch, PWM_CAPTURE_COMMON_CNT_ENABLE);
321 cap_tim_ctl__common_cnt_enable__setf(ch, PWM_CAPTURE_COMMON_CNT_DISABLE);
341 if (reg_idx > PWM_TIMER5_IDX)
345 cpr_ctlapbclken_grctl__pwm_pclk_en__setf(ENABLE);
346 cpr_rstctl_ctlapb_sw__pwm_rstn__setf(RSTCTL_ENABLE);
347 cpr_rstctl_ctlapb_sw__pwm_rstn__setf(RSTCTL_DISABLE);
349 cpr_pwm_clk_ctl__pwm_clk_en__setf(ENABLE);
350 cpr_pwm_clk_ctl__pwm_clksel__setf(init_cfg->
src_clk);
351 cpr_pwm_clk_ctl__pwm_clk0_div__setf(init_cfg->
clk_div);
352 cpr_pwm_clk_ctl__pwm_clk1_div__setf(init_cfg->
clk_div);
361 pwm_timer_controlreg_set(reg_idx, ctl_reg);
367 cpr_ctlapbclken_grctl__pwm_pclk_en__setf(DISABLE);
382 uint16_t high_cnt = ((uint32_t)(
period * dutycycle) / 100);
383 uint16_t low_cnt = (uint32_t)(
period - high_cnt);
385 pwm_timer_loadcount__timer_lc__setf(reg_idx, low_cnt);
386 pwm_timer_loadcount2__timer_lc2__setf(reg_idx, high_cnt);
391 pwm_timer_loadcount2__timer_lc2__setf(reg_idx, high_cnt);
396 pwm_timer_loadcount__timer_lc__setf(reg_idx, low_cnt);
408void xc_pwm_timer_stop(uint8_t reg_idx) { pwm_timer_controlreg__timer_en__setf(reg_idx, DISABLE); }
414 uint32_t cap_tim_int;
416 cap_tim_int = pwm_cap_tim_int_get();
418 pwm_cap_tim_int_set(cap_tim_int);
420 if ((cap_tim_int & PWM_CAPTURE_UPD0_EN_ENABLE) == PWM_CAPTURE_UPD0_EN_ENABLE) {
423 if ((cap_tim_int & PWM_CAPTURE_UPD1_EN_ENABLE) == PWM_CAPTURE_UPD1_EN_ENABLE) {
426 if ((cap_tim_int & PWM_CAPTURE_UPD2_EN_ENABLE) == PWM_CAPTURE_UPD2_EN_ENABLE) {
GPIO_FUN_SEL_TypeDef FunSel
PWM_ClkSrc_TypeDef SrcClk
uint8_t timer_0to100_pwm_en
PWM_ClkDiv_TypeDef clk_div
PWM_ClkSrc_TypeDef src_clk
uint8_t timer_int_mask_en
CLOCK_LFCLK_In_Typedef xc_clock_lfclk_in_get(void)
xc_clock_lfclk_in_get
CLOCK_HFCLK_In_Typedef xc_clock_hfclk_in_get(void)
xc_clock_hfclk_in_get
void xc_gpio_init(GPIO_InitCfg_t *init_cfg)
xc_gpio_init
uint8_t xc_pwm_brake_signal_valid_get(void)
void xc_pwm_brake_signal_mask_set(uint32_t mask)
void xc_pwm_capture_enable(uint8_t ch)
void xc_pwm_brake_recovery_mode_set(uint32_t mode)
pwm_handler_callback pwm_n_callback[3]
void xc_pwm_stop_all(void)
void xc_pwm_timer_set_dutycycle(uint8_t reg_idx, double dutycycle)
__WEAK uint8_t pwm_capture_ch1_callback(void *context)
void xc_pwm_capture_debounce_disable(uint8_t ch, uint32_t step)
void xc_pwm_init(uint8_t reg_idx, PWM_InitCfg_t *init_cfg)
void xc_pwm_brake_enable(uint8_t reg_idx)
static uint16_t pwm_freq_to_period(PWM_InitCfg_t *pwm_cfg, PWM_ClkDiv_TypeDef div_clk)
void xc_pwm_brake_clear()
void xc_pwm_timer_set_high_cnt(uint8_t reg_idx, uint16_t high_cnt)
void xc_pwm_dutycycle_set(uint8_t reg_idx, uint32_t dutycycle_acc, uint32_t dutycycle)
void xc_pwm_brake_disable(uint8_t reg_idx)
void xc_pwm_capture_disable_it(uint8_t ch)
static uint32_t pwm_clk_init_state
void xc_pwm_timer_set_low_cnt(uint8_t reg_idx, uint16_t low_cnt)
void xc_pwm_stop(uint8_t reg_idx)
void xc_pwm_start_all(void)
void xc_pwm_lowpower_disable(uint8_t reg_idx)
__WEAK uint8_t pwm_capture_ch2_callback(void *context)
void xc_pwm_timer_init(uint8_t reg_idx, PWM_Timer_InitCfg_t *init_cfg)
__WEAK uint8_t pwm_capture_ch0_callback(void *context)
void xc_pwm_capture_debounce_enable(uint8_t ch, uint32_t step)
void xc_pwm_lowpower_countdirection_set(uint8_t reg_idx, uint32_t direction)
void xc_pwm_capture_enable_it(uint8_t ch)
void xc_pwm_brake_debounce_set(uint32_t debounce, uint32_t step)
void xc_pwm_capture_counter_disable(uint8_t ch)
void xc_pwm_timer_start(uint8_t reg_idx)
void xc_pwm_capture_psc_set(uint8_t ch, uint32_t psc)
void xc_pwm_timer_deinit(uint8_t reg_idx)
void xc_pwm_brake_signal_trigger_level_set(uint32_t level)
void xc_pwm_capture_edge_set(uint8_t ch, uint32_t edge)
uint8_t xc_pwm_brake_recovery_mode_get(void)
void xc_pwm_lowpower_enable(uint8_t reg_idx)
void xc_pwm_start(uint8_t reg_idx)
void xc_pwm_capture_counter_enable(uint8_t ch)
void xc_pwm_capture_signal_set(uint8_t ch, uint32_t signal)
void xc_pwm_timer_set_freq(uint8_t reg_idx, uint32_t freq)
void pwm_src_enable_set(uint8_t reg_idx, uint8_t src_enable)
uint16_t xc_pwm_capture_val_get(uint8_t ch)
void xc_pwm_timer_stop(uint8_t reg_idx)
void xc_pwm_capture_disable(uint8_t ch)
void pwm_pin_set(uint8_t reg_idx, PWM_InitCfg_t *pwm_cfg)
The header of xc_drv_pwm.c
uint8_t(* pwm_handler_callback)(void *context)