HPM SDK
HPMicro Software Development Kit
hpm_pwm_drv.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2021 HPMicro
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  *
6  */
7 
8 #ifndef HPM_PWM_DRV_H
9 #define HPM_PWM_DRV_H
10 
11 #include "hpm_common.h"
12 #include "hpm_pwm_regs.h"
13 #include "hpm_soc_feature.h"
21 #define PWM_UNLOCK_KEY (0xB0382607UL)
22 
23 /* IRQ enable bit mask */
24 #define PWM_IRQ_FAULT PWM_IRQEN_FAULTIRQE_MASK
25 #define PWM_IRQ_EX_RELOAD PWM_IRQEN_XRLDIRQE_MASK
26 #define PWM_IRQ_HALF_RELOAD PWM_IRQEN_HALFRLDIRQE_MASK
27 #define PWM_IRQ_RELOAD PWM_IRQEN_RLDIRQE_MASK
28 #define PWM_IRQ_CMP(x) PWM_IRQEN_CMPIRQEX_SET((1 << x))
29 
30 /* PWM force output mask */
31 #define PWM_FORCE_OUTPUT(pwm_index, force_output) \
32  (force_output << (pwm_index << 1))
33 
34 #define PWM_DUTY_CYCLE_FP_MAX ((1U << 24) - 1)
35 
40 typedef enum pwm_counter_type {
44 
49 typedef enum pwm_cmp_mode {
53 
58 typedef enum pwm_register_update {
64 
69 typedef enum pwm_fault_mode {
74 
85 
90 typedef enum pwm_fault_source {
98 
103 typedef enum pwm_force_source {
111 typedef enum pwm_force_cmd_timing {
117 
122 typedef enum pwm_output_type {
128 
133 typedef struct pwm_cmp_config {
134  uint32_t cmp;
136 #if defined(PWM_SOC_HRPWM_SUPPORT) && PWM_SOC_HRPWM_SUPPORT
137  bool enable_hrcmp;
138 #endif
139  uint8_t mode;
140  uint8_t update_trigger;
141  uint8_t ex_cmp;
142  uint8_t half_clock_cmp;
143  uint8_t jitter_cmp;
144 #if defined(PWM_SOC_HRPWM_SUPPORT) && PWM_SOC_HRPWM_SUPPORT
145  uint8_t hrcmp;
146 #endif
148 
153 typedef struct pwm_output_channel {
154  uint8_t cmp_start_index;
155  uint8_t cmp_end_index;
162 typedef struct pwm_fault_source_config {
163  uint32_t source_mask;
169 
174 typedef struct pwm_config {
175 #if defined(PWM_SOC_HRPWM_SUPPORT) && PWM_SOC_HRPWM_SUPPORT
176  bool hrpwm_update_mode;
177 #endif
180  uint8_t update_trigger;
181  uint8_t fault_mode;
183  uint8_t force_source;
186 
191 typedef struct pwm_pair_config {
194 
195 #ifdef __cplusplus
196 extern "C" {
197 #endif
198 
205 static inline void pwm_deinit(PWM_Type *pwm_x)
206 {
207  pwm_x->IRQEN = 0;
208  pwm_x->DMAEN = 0;
209  pwm_x->SR |= pwm_x->SR;
210  pwm_x->STA = 0;
211  pwm_x->RLD = PWM_RLD_RLD_MASK;
212  for (uint8_t i = 0; i < PWM_SOC_CMP_MAX_COUNT; i++) {
213  pwm_x->CMP[i] = PWM_CMP_CMP_MASK;
214  pwm_x->CMPCFG[i] = 0;
216  }
217  pwm_x->FRCMD = 0;
218  pwm_x->GCR = 0;
219  pwm_x->SHCR = 0;
220  pwm_x->HRPWM_CFG = 0;
221  for (uint8_t i = 0; i < PWM_SOC_OUTPUT_TO_PWM_MAX_COUNT; i++) {
222  pwm_x->PWMCFG[i] = 0;
223  }
224 }
225 
232 {
233  if (pwm_x->SHCR & PWM_SHCR_SHLKEN_MASK) {
234  /*
235  * if lock shadow register has been enabled in SHCR, it has to set
236  * the lock bit twice to issue shadow register lock event.
237  */
238  pwm_x->SHLK = PWM_SHLK_SHLK_MASK;
239  }
240  pwm_x->SHLK = PWM_SHLK_SHLK_MASK;
241 }
242 
248 static inline void pwm_shadow_register_lock(PWM_Type *pwm_x)
249 {
250  pwm_x->SHCR |= PWM_SHCR_SHLKEN_MASK;
251  pwm_x->SHLK = PWM_SHLK_SHLK_MASK;
252 }
253 
259 static inline void pwm_shadow_register_unlock(PWM_Type *pwm_x)
260 {
261  pwm_x->UNLK = PWM_UNLOCK_KEY;
262 }
263 
271 static inline void pwm_set_start_count(PWM_Type *pwm_x,
272  uint8_t ex_start,
273  uint32_t start)
274 {
275  pwm_x->STA = PWM_STA_XSTA_SET(ex_start)
276  | PWM_STA_STA_SET(start);
277 }
278 
279 #if defined(PWM_SOC_HRPWM_SUPPORT) && PWM_SOC_HRPWM_SUPPORT
280 
287 static inline void pwm_set_hrpwm_start_count(PWM_Type *pwm_x,
288  uint32_t start)
289 {
290  pwm_x->STA_HRPWM = PWM_STA_HRPWM_STA_SET(start);
291 }
292 
293 #endif
294 
302 static inline void pwm_set_reload(PWM_Type *pwm_x,
303  uint8_t ex_reload,
304  uint32_t reload)
305 {
307  pwm_x->RLD = PWM_RLD_XRLD_SET(ex_reload)
308  | PWM_RLD_RLD_SET(reload);
309 }
310 
311 #if defined(PWM_SOC_HRPWM_SUPPORT) && PWM_SOC_HRPWM_SUPPORT
312 
320 static inline void pwm_set_hrpwm_reload(PWM_Type *pwm_x,
321  uint16_t hrpwm_reload,
322  uint32_t reload)
323 {
325  pwm_x->RLD_HRPWM = PWM_RLD_HRPWM_RLD_HR_SET(hrpwm_reload)
326  | PWM_RLD_HRPWM_RLD_SET(reload);
327 }
328 
329 #endif
330 
342 static inline void pwm_clear_status(PWM_Type *pwm_x, uint32_t mask)
343 {
344  pwm_x->SR |= mask;
345 }
346 
347 #if defined(PWM_SOC_TIMER_RESET_SUPPORT) && PWM_SOC_TIMER_RESET_SUPPORT
348 
354 static inline void pwm_timer_reset(PWM_Type *pwm_x)
355 {
356  pwm_x->GCR = ((pwm_x->GCR & ~(PWM_GCR_TIMERRESET_MASK)) | PWM_GCR_TIMERRESET_SET(1));
357 }
358 
359 #endif
360 
367 static inline uint32_t pwm_get_status(PWM_Type *pwm_x)
368 {
369  return pwm_x->SR;
370 }
371 
383 static inline void pwm_disable_irq(PWM_Type *pwm_x, uint32_t mask)
384 {
385  pwm_x->IRQEN &= ~mask;
386 }
387 
399 static inline void pwm_enable_irq(PWM_Type *pwm_x, uint32_t mask)
400 {
401  pwm_x->IRQEN |= mask;
402 }
403 
416 static inline void pwm_disable_dma_request(PWM_Type *pwm_x, uint32_t mask)
417 {
418  pwm_x->DMAEN &= ~mask;
419 }
420 
433 static inline void pwm_enable_dma_request(PWM_Type *pwm_x, uint32_t mask)
434 {
435  pwm_x->DMAEN |= mask;
436 }
437 
445  uint8_t target_cmp_index)
446 {
447  pwm_x->SHCR = ((pwm_x->SHCR & ~(PWM_SHCR_FRCSHDWSEL_MASK))
448  | PWM_SHCR_FRCSHDWSEL_SET(target_cmp_index));
449 }
465  uint8_t target_cmp_index)
466 {
468  pwm_x->SHCR = ((pwm_x->SHCR & ~(PWM_SHCR_CNTSHDWSEL_MASK
470  | PWM_SHCR_CNTSHDWSEL_SET(target_cmp_index)
471  | PWM_SHCR_CNTSHDWUPT_SET(trigger));
472  } else {
473  pwm_x->SHCR = ((pwm_x->SHCR & ~(PWM_SHCR_CNTSHDWUPT_MASK))
474  | PWM_SHCR_CNTSHDWUPT_SET(trigger));
475  }
476 }
477 
487 static inline void pwm_load_cmp_shadow_on_capture(PWM_Type *pwm_x,
488  uint8_t index,
489  bool is_falling_edge)
490 {
491  pwm_x->CMPCFG[index] |= PWM_CMPCFG_CMPMODE_MASK;
492  pwm_x->GCR = ((pwm_x->GCR & ~(PWM_GCR_CMPSHDWSEL_MASK | PWM_GCR_HWSHDWEDG_MASK))
493  | PWM_GCR_CMPSHDWSEL_SET(index)
494  | PWM_GCR_HWSHDWEDG_SET(is_falling_edge));
495 }
496 
497 #if defined(PWM_SOC_SHADOW_TRIG_SUPPORT) && PWM_SOC_SHADOW_TRIG_SUPPORT
498 
505 static inline void pwm_set_cnt_shadow_trig_reload(PWM_Type *pwm_x, bool is_enable)
506 {
507  pwm_x->SHCR = ((pwm_x->SHCR & ~PWM_SHCR_CNT_UPDATE_RELOAD_MASK)
508  | PWM_SHCR_CNT_UPDATE_RELOAD_SET(is_enable));
509 }
510 
519 static inline void pwm_set_cnt_shadow_trig_edge(PWM_Type *pwm_x,
520  bool is_falling_edge)
521 {
522  pwm_x->SHCR = ((pwm_x->SHCR & ~PWM_SHCR_CNT_UPDATE_EDGE_MASK)
523  | PWM_SHCR_CNT_UPDATE_EDGE_SET(is_falling_edge));
524 }
525 
534 static inline void pwm_set_force_shadow_trig_edge(PWM_Type *pwm_x,
535  bool is_falling_edge)
536 {
537  pwm_x->SHCR = ((pwm_x->SHCR & ~PWM_SHCR_FORCE_UPDATE_EDGE_MASK)
538  | PWM_SHCR_FORCE_UPDATE_EDGE_SET(is_falling_edge));
539 }
540 
541 #endif
548 static inline void pwm_cmp_disable_half_clock(PWM_Type *pwm_x, uint8_t index)
549 {
550  pwm_x->CMP[index] &= ~PWM_CMP_CMPHLF_MASK;
551 }
552 
559 static inline void pwm_cmp_enable_half_clock(PWM_Type *pwm_x, uint8_t index)
560 {
561  pwm_x->CMP[index] |= PWM_CMP_CMPHLF_MASK;
562 }
563 
571 static inline void pwm_cmp_update_jitter_value(PWM_Type *pwm_x, uint8_t index, uint8_t jitter)
572 {
573  pwm_x->CMP[index] = (pwm_x->CMP[index] & ~PWM_CMP_CMPJIT_MASK) | PWM_CMP_CMPJIT_SET(jitter);
574 }
575 
584 static inline void pwm_cmp_update_cmp_value(PWM_Type *pwm_x, uint8_t index,
585  uint32_t cmp, uint16_t ex_cmp)
586 {
587  pwm_x->CMP[index] = (pwm_x->CMP[index] & ~(PWM_CMP_CMP_MASK | PWM_CMP_XCMP_MASK))
588  | PWM_CMP_CMP_SET(cmp) | PWM_CMP_XCMP_SET(ex_cmp);
589 }
590 
591 #if defined(PWM_SOC_HRPWM_SUPPORT) && PWM_SOC_HRPWM_SUPPORT
600 static inline void pwm_cmp_update_hrcmp_value(PWM_Type *pwm_x, uint8_t index,
601  uint32_t cmp, uint16_t hrcmp)
602 {
603  pwm_x->CMP_HRPWM[index] = (pwm_x->CMP_HRPWM[index] & ~(PWM_CMP_HRPWM_CMP_MASK | PWM_CMP_HRPWM_CMP_HR_MASK))
605 }
606 #endif
607 
615 static inline void pwm_cmp_force_value(PWM_Type *pwm_x, uint8_t index, uint32_t cmp)
616 {
617  pwm_x->CMP[index] = cmp;
618 }
619 
627 static inline void pwm_config_cmp(PWM_Type *pwm_x, uint8_t index, pwm_cmp_config_t *config)
628 {
630  if (config->mode == pwm_cmp_mode_output_compare) {
631 #if defined(PWM_SOC_HRPWM_SUPPORT) && PWM_SOC_HRPWM_SUPPORT
632  if (config->enable_hrcmp) {
633  pwm_x->CMPCFG[index] = PWM_CMPCFG_CMPSHDWUPT_SET(config->update_trigger);
634  pwm_x->CMP[index] = PWM_CMP_HRPWM_CMP_SET(config->cmp)
635  | PWM_CMP_HRPWM_CMP_HR_SET(config->hrcmp);
636  } else {
637 #endif
638  pwm_x->CMPCFG[index] = (config->enable_ex_cmp ? PWM_CMPCFG_XCNTCMPEN_MASK : 0)
640  pwm_x->CMP[index] = PWM_CMP_CMP_SET(config->cmp)
641  | PWM_CMP_XCMP_SET(config->ex_cmp)
643  | PWM_CMP_CMPJIT_SET(config->jitter_cmp);
644 #if defined(PWM_SOC_HRPWM_SUPPORT) && PWM_SOC_HRPWM_SUPPORT
645  }
646 #endif
647  } else {
648  pwm_x->CMPCFG[index] |= PWM_CMPCFG_CMPMODE_MASK;
649  }
650 }
651 
659 static inline void pwm_config_output_channel(PWM_Type *pwm_x, uint8_t index, pwm_output_channel_t *config)
660 {
661  pwm_x->CHCFG[index] = PWM_CHCFG_CMPSELBEG_SET(config->cmp_start_index)
664 }
665 
672 static inline void pwm_config_fault_source(PWM_Type *pwm_x, pwm_fault_source_config_t *config)
673 {
679  | config->source_mask
680  | PWM_GCR_FAULTEXPOL_SET((config->fault_external_0_active_low ? 0x1 : 0) | (config->fault_external_1_active_low ? 0x2 : 0))
683 }
684 
690 static inline void pwm_clear_fault(PWM_Type *pwm_x)
691 {
692  pwm_x->GCR |= PWM_GCR_FAULTCLR_MASK;
693  pwm_x->GCR &= ~PWM_GCR_FAULTCLR_MASK;
694 }
695 
701 static inline void pwm_stop_counter(PWM_Type *pwm_x)
702 {
703  pwm_x->GCR &= ~PWM_GCR_CEN_MASK;
704 }
705 
711 static inline void pwm_start_counter(PWM_Type *pwm_x)
712 {
713  pwm_x->GCR |= PWM_GCR_CEN_MASK;
714 }
715 
721 static inline void pwm_enable_sw_force(PWM_Type *pwm_x)
722 {
723  pwm_x->GCR |= PWM_GCR_SWFRC_MASK;
724 }
725 
731 static inline void pwm_disable_sw_force(PWM_Type *pwm_x)
732 {
733  pwm_x->GCR &= ~PWM_GCR_SWFRC_MASK;
734 }
735 
741 static inline void pwm_enable_reload_at_synci(PWM_Type *pwm_x)
742 {
744 }
745 
752 static inline void pwm_disable_output(PWM_Type *pwm_x, uint8_t index)
753 {
754  pwm_x->PWMCFG[index] &= ~PWM_PWMCFG_OEN_MASK;
755 }
756 
763 static inline void pwm_enable_output(PWM_Type *pwm_x, uint8_t index)
764 {
765  pwm_x->PWMCFG[index] |= PWM_PWMCFG_OEN_MASK;
766 }
767 
774 static inline void pwm_set_force_output(PWM_Type *pwm_x, uint32_t output_mask)
775 {
776  pwm_x->FRCMD = PWM_FRCMD_FRCMD_SET(output_mask);
777 }
778 
787 static inline void pwm_config_force_polarity(PWM_Type *pwm_x, bool polarity)
788 {
789  pwm_x->GCR = (pwm_x->GCR & ~(PWM_GCR_FRCPOL_MASK)) | PWM_GCR_FRCPOL_SET(polarity);
790 }
791 
799 {
800  pwm_x->GCR = (pwm_x->GCR & ~(PWM_GCR_FRCTIME_MASK)) | PWM_GCR_FRCTIME_SET(timing);
801 }
802 
809 static inline void pwm_enable_pwm_sw_force_output(PWM_Type *pwm_x, uint8_t index)
810 {
813 }
814 
821 static inline void pwm_disable_pwm_sw_force_output(PWM_Type *pwm_x, uint8_t index)
822 {
823  pwm_x->PWMCFG[index] &= ~PWM_PWMCFG_FRCSRCSEL_MASK;
824 }
825 
836 static inline void pwm_config_pwm(PWM_Type *pwm_x, uint8_t index,
837  pwm_config_t *config, bool enable_pair_mode)
838 {
839  pwm_x->PWMCFG[index] = PWM_PWMCFG_OEN_SET(config->enable_output)
844  | PWM_PWMCFG_PAIR_SET(enable_pair_mode)
845 #if defined(PWM_SOC_HRPWM_SUPPORT) && PWM_SOC_HRPWM_SUPPORT
846  | PWM_PWMCFG_HR_UPDATE_MODE_SET(config->hrpwm_update_mode)
847 #endif
849 }
850 
857 static inline uint32_t pwm_get_reload_val(PWM_Type *pwm_x)
858 {
859  return PWM_RLD_RLD_GET(pwm_x->RLD);
860 }
861 
868 static inline uint32_t pwm_get_ex_reload_val(PWM_Type *pwm_x)
869 {
870  return PWM_RLD_XRLD_GET(pwm_x->RLD);
871 }
872 
879 static inline uint32_t pwm_get_counter_val(PWM_Type *pwm_x)
880 {
881  return PWM_CNT_CNT_GET(pwm_x->CNT);
882 }
883 
890 static inline uint32_t pwm_get_ex_counter_val(PWM_Type *pwm_x)
891 {
892  return PWM_CNT_XCNT_GET(pwm_x->CNT);
893 }
894 
904  uint8_t index,
905  pwm_cmp_config_t *config);
906 
916 void pwm_get_captured_count(PWM_Type *pwm_x, uint32_t *buf, pwm_counter_type_t counter, uint8_t start_index, uint8_t num);
917 
925 
933 
940 void pwm_get_default_pwm_config(PWM_Type *pwm_x, pwm_config_t *config);
941 
949 
962  uint8_t pwm_index, pwm_config_t *pwm_config,
963  uint8_t cmp_start_index, pwm_cmp_config_t *cmp, uint8_t cmp_num);
976  uint8_t pwm_index, pwm_pair_config_t *pwm_pair_config,
977  uint8_t cmp_start_index, pwm_cmp_config_t *cmp, uint8_t cmp_num);
978 
987 hpm_stat_t pwm_update_raw_cmp_edge_aligned(PWM_Type *pwm_x, uint8_t cmp_index,
988  uint32_t target_cmp);
989 
1000 hpm_stat_t pwm_update_raw_cmp_central_aligned(PWM_Type *pwm_x, uint8_t cmp1_index,
1001  uint8_t cmp2_index, uint32_t target_cmp1, uint32_t target_cmp2);
1002 #if defined(PWM_SOC_HRPWM_SUPPORT) && PWM_SOC_HRPWM_SUPPORT
1008 static inline void pwm_enable_hrpwm(PWM_Type *pwm_x)
1009 {
1010  pwm_x->GCR = (pwm_x->GCR & ~(PWM_GCR_HR_PWM_EN_MASK)) | PWM_GCR_HR_PWM_EN_SET(1);
1011 }
1012 
1018 static inline void pwm_disable_hrpwm(PWM_Type *pwm_x)
1019 {
1020  pwm_x->GCR = pwm_x->GCR & ~(PWM_GCR_HR_PWM_EN_MASK);
1021 }
1022 
1028 static inline void pwm_cal_hrpwm_start(PWM_Type *pwm_x)
1029 {
1031 }
1032 
1039 static inline void pwm_cal_hrpwm_chn_start(PWM_Type *pwm_x, uint8_t chn)
1040 {
1041  pwm_x->HRPWM_CFG |= PWM_HRPWM_CFG_CAL_START_SET(chn);
1042 }
1043 
1050 static inline void pwm_cal_hrpwm_chn_wait(PWM_Type *pwm_x, uint8_t chn)
1051 {
1052  while (PWM_ANASTS_CALON_GET(pwm_x->ANASTS[chn])) {
1053  };
1054 }
1055 
1063 static inline uint32_t pwm_get_cal_hrpwm_status(PWM_Type *pwm_x, uint8_t chn)
1064 {
1065  return PWM_ANASTS_CALON_GET(pwm_x->ANASTS[chn]);
1066 }
1067 
1074 static inline uint32_t pwm_get_hrpwm_reload_val(PWM_Type *pwm_x)
1075 {
1076  return PWM_RLD_HRPWM_RLD_GET(pwm_x->RLD_HRPWM);
1077 }
1078 
1085 static inline uint32_t pwm_get_hrpwm_hr_reload_val(PWM_Type *pwm_x)
1086 {
1087  return PWM_RLD_HRPWM_RLD_HR_GET(pwm_x->RLD_HRPWM);
1088 }
1089 
1090 
1100 hpm_stat_t pwm_update_raw_hrcmp_edge_aligned(PWM_Type *pwm_x, uint8_t cmp_index, uint32_t target_cmp,
1101  uint16_t target_hrcmp);
1102 
1115 hpm_stat_t pwm_update_raw_hrcmp_central_aligned(PWM_Type *pwm_x, uint8_t cmp1_index,
1116  uint8_t cmp2_index, uint32_t target_cmp1, uint32_t target_cmp2,
1117  uint16_t target_hrcmp1, uint16_t target_hrcmp2);
1118 #endif
1119 
1120 #ifdef __cplusplus
1121 }
1122 #endif
1126 #endif /* HPM_PWM_DRV_H */
#define PWM_SOC_CMP_MAX_COUNT
Definition: hpm_soc_feature.h:55
#define PWM_SOC_OUTPUT_TO_PWM_MAX_COUNT
Definition: hpm_soc_feature.h:56
uint32_t hpm_stat_t
Definition: hpm_common.h:119
static void pwm_deinit(PWM_Type *pwm_x)
pwm deinitialize function
Definition: hpm_pwm_drv.h:205
static void pwm_config_pwm(PWM_Type *pwm_x, uint8_t index, pwm_config_t *config, bool enable_pair_mode)
config PWM channel configure registe
Definition: hpm_pwm_drv.h:836
pwm_fault_mode
configure the state of channel 0-7 outputs when the forced output is in effect
Definition: hpm_pwm_drv.h:69
enum pwm_output_type pwm_output_type_t
pwm output type
static void pwm_set_start_count(PWM_Type *pwm_x, uint8_t ex_start, uint32_t start)
set counter start value and extended start value
Definition: hpm_pwm_drv.h:271
void pwm_get_default_cmp_config(PWM_Type *pwm_x, pwm_cmp_config_t *config)
get default cmp config
Definition: hpm_pwm_drv.c:38
static void pwm_disable_irq(PWM_Type *pwm_x, uint32_t mask)
disable pwm irq
Definition: hpm_pwm_drv.h:383
static void pwm_enable_output(PWM_Type *pwm_x, uint8_t index)
enable pwm output
Definition: hpm_pwm_drv.h:763
pwm_force_cmd_timing
select when the FRCMD shadow register will be loaded to its work register
Definition: hpm_pwm_drv.h:111
struct pwm_config pwm_config_t
pwm config data
static uint32_t pwm_get_status(PWM_Type *pwm_x)
get pwm status register
Definition: hpm_pwm_drv.h:367
struct pwm_output_channel pwm_output_channel_t
pwm output channel config
static void pwm_disable_dma_request(PWM_Type *pwm_x, uint32_t mask)
disable pwm dma request
Definition: hpm_pwm_drv.h:416
static void pwm_enable_dma_request(PWM_Type *pwm_x, uint32_t mask)
enable pwm dma request
Definition: hpm_pwm_drv.h:433
static uint32_t pwm_get_reload_val(PWM_Type *pwm_x)
getting the counter reload value for a pwm timer
Definition: hpm_pwm_drv.h:857
struct pwm_pair_config pwm_pair_config_t
pair pwm config
pwm_force_source
Select sources for force output.
Definition: hpm_pwm_drv.h:103
enum pwm_counter_type pwm_counter_type_t
pwm trigger mode
struct pwm_cmp_config pwm_cmp_config_t
pwm compare config
static uint32_t pwm_get_ex_counter_val(PWM_Type *pwm_x)
getting the value of the pwm extended counter
Definition: hpm_pwm_drv.h:890
static void pwm_enable_sw_force(PWM_Type *pwm_x)
enable software force
Definition: hpm_pwm_drv.h:721
enum pwm_force_source pwm_force_source_t
Select sources for force output.
void pwm_get_captured_count(PWM_Type *pwm_x, uint32_t *buf, pwm_counter_type_t counter, uint8_t start_index, uint8_t num)
pwm get captured count
Definition: hpm_pwm_drv.c:24
static void pwm_set_force_output(PWM_Type *pwm_x, uint32_t output_mask)
config pwm force output level per output channel
Definition: hpm_pwm_drv.h:774
static uint32_t pwm_get_ex_reload_val(PWM_Type *pwm_x)
getting the extended counter reload value for a pwm timer
Definition: hpm_pwm_drv.h:868
enum pwm_force_cmd_timing pwm_force_cmd_timing_t
select when the FRCMD shadow register will be loaded to its work register
static void pwm_disable_output(PWM_Type *pwm_x, uint8_t index)
disable pwm output
Definition: hpm_pwm_drv.h:752
enum pwm_fault_mode pwm_fault_mode_t
configure the state of channel 0-7 outputs when the forced output is in effect
hpm_stat_t pwm_setup_waveform_in_pair(PWM_Type *pwm_x, uint8_t pwm_index, pwm_pair_config_t *pwm_pair_config, uint8_t cmp_start_index, pwm_cmp_config_t *cmp, uint8_t cmp_num)
setup pwm waveform in pair
Definition: hpm_pwm_drv.c:79
static void pwm_set_load_counter_shadow_register_trigger(PWM_Type *pwm_x, pwm_shadow_register_update_trigger_t trigger, uint8_t target_cmp_index)
set shadow register control register
Definition: hpm_pwm_drv.h:463
static void pwm_enable_reload_at_synci(PWM_Type *pwm_x)
enable pwm reload value by synci
Definition: hpm_pwm_drv.h:741
static void pwm_shadow_register_lock(PWM_Type *pwm_x)
lock all shawdow register
Definition: hpm_pwm_drv.h:248
hpm_stat_t pwm_update_raw_cmp_edge_aligned(PWM_Type *pwm_x, uint8_t cmp_index, uint32_t target_cmp)
update raw compare value for edge aligned waveform
Definition: hpm_pwm_drv.c:140
enum pwm_fault_source pwm_fault_source_t
fault input signal
static void pwm_load_cmp_shadow_on_capture(PWM_Type *pwm_x, uint8_t index, bool is_falling_edge)
Configure input capture cmp to trigger shadow register updates.
Definition: hpm_pwm_drv.h:487
void pwm_get_default_pwm_pair_config(PWM_Type *pwm_x, pwm_pair_config_t *config)
get default pwm pair config
Definition: hpm_pwm_drv.c:73
static void pwm_cmp_disable_half_clock(PWM_Type *pwm_x, uint8_t index)
disable pwn cmp half clock
Definition: hpm_pwm_drv.h:548
enum pwm_fault_recovery_trigger pwm_fault_recovery_trigger_t
select when to recover PWM output after fault
static void pwm_disable_sw_force(PWM_Type *pwm_x)
disable software force , force will take effect
Definition: hpm_pwm_drv.h:731
static void pwm_config_output_channel(PWM_Type *pwm_x, uint8_t index, pwm_output_channel_t *config)
config pwm output channel
Definition: hpm_pwm_drv.h:659
static void pwm_config_force_cmd_timing(PWM_Type *pwm_x, pwm_force_cmd_timing_t timing)
config the force effective time
Definition: hpm_pwm_drv.h:798
static void pwm_clear_fault(PWM_Type *pwm_x)
clear pwm fault status
Definition: hpm_pwm_drv.h:690
hpm_stat_t pwm_load_cmp_shadow_on_match(PWM_Type *pwm_x, uint8_t index, pwm_cmp_config_t *config)
pwm load cmp shadow on match
Definition: hpm_pwm_drv.c:11
static void pwm_enable_irq(PWM_Type *pwm_x, uint32_t mask)
enable pwm irq
Definition: hpm_pwm_drv.h:399
static void pwm_cmp_force_value(PWM_Type *pwm_x, uint8_t index, uint32_t cmp)
Forced update of pwm cmp register value, cmp content guaranteed accurate by user.
Definition: hpm_pwm_drv.h:615
static void pwm_shadow_register_unlock(PWM_Type *pwm_x)
unlock all shadow register
Definition: hpm_pwm_drv.h:259
static void pwm_disable_pwm_sw_force_output(PWM_Type *pwm_x, uint8_t index)
disable pwm sw force output
Definition: hpm_pwm_drv.h:821
static void pwm_set_force_cmd_shadow_register_hwevent(PWM_Type *pwm_x, uint8_t target_cmp_index)
set target cmp as hardware event to trigger force cmd output
Definition: hpm_pwm_drv.h:444
hpm_stat_t pwm_setup_waveform(PWM_Type *pwm_x, uint8_t pwm_index, pwm_config_t *pwm_config, uint8_t cmp_start_index, pwm_cmp_config_t *cmp, uint8_t cmp_num)
setup waveform
Definition: hpm_pwm_drv.c:115
static void pwm_cmp_update_cmp_value(PWM_Type *pwm_x, uint8_t index, uint32_t cmp, uint16_t ex_cmp)
update pwm cmp value
Definition: hpm_pwm_drv.h:584
void pwm_get_default_pwm_config(PWM_Type *pwm_x, pwm_config_t *config)
get default pwm config
Definition: hpm_pwm_drv.c:62
static void pwm_config_force_polarity(PWM_Type *pwm_x, bool polarity)
config pwm force polarity
Definition: hpm_pwm_drv.h:787
hpm_stat_t pwm_update_raw_cmp_central_aligned(PWM_Type *pwm_x, uint8_t cmp1_index, uint8_t cmp2_index, uint32_t target_cmp1, uint32_t target_cmp2)
update raw compare value for central aligned waveform
Definition: hpm_pwm_drv.c:147
static void pwm_config_fault_source(PWM_Type *pwm_x, pwm_fault_source_config_t *config)
config pwm fault source
Definition: hpm_pwm_drv.h:672
pwm_output_type
pwm output type
Definition: hpm_pwm_drv.h:122
pwm_cmp_mode
pwm cmp mode
Definition: hpm_pwm_drv.h:49
static void pwm_enable_pwm_sw_force_output(PWM_Type *pwm_x, uint8_t index)
enable pwm sw force output
Definition: hpm_pwm_drv.h:809
pwm_counter_type
pwm trigger mode
Definition: hpm_pwm_drv.h:40
static void pwm_set_reload(PWM_Type *pwm_x, uint8_t ex_reload, uint32_t reload)
set the reload value
Definition: hpm_pwm_drv.h:302
enum pwm_cmp_mode pwm_cmp_mode_t
pwm cmp mode
static uint32_t pwm_get_counter_val(PWM_Type *pwm_x)
getting the value of the pwm counter
Definition: hpm_pwm_drv.h:879
static void pwm_start_counter(PWM_Type *pwm_x)
start pwm timer counter
Definition: hpm_pwm_drv.h:711
enum pwm_register_update pwm_shadow_register_update_trigger_t
update time of the shadow register
struct pwm_fault_source_config pwm_fault_source_config_t
pwm fault source config
pwm_register_update
update time of the shadow register
Definition: hpm_pwm_drv.h:58
static void pwm_cmp_update_jitter_value(PWM_Type *pwm_x, uint8_t index, uint8_t jitter)
update pwm cmp jitter counter compare value
Definition: hpm_pwm_drv.h:571
static void pwm_config_cmp(PWM_Type *pwm_x, uint8_t index, pwm_cmp_config_t *config)
config pwm cmp
Definition: hpm_pwm_drv.h:627
static void pwm_issue_shadow_register_lock_event(PWM_Type *pwm_x)
issue all shawdow register
Definition: hpm_pwm_drv.h:231
static void pwm_stop_counter(PWM_Type *pwm_x)
stop the pwm timer counter
Definition: hpm_pwm_drv.h:701
void pwm_get_default_output_channel_config(PWM_Type *pwm_x, pwm_output_channel_t *config)
get default output channel config
Definition: hpm_pwm_drv.c:54
pwm_fault_recovery_trigger
select when to recover PWM output after fault
Definition: hpm_pwm_drv.h:79
#define PWM_UNLOCK_KEY
Definition: hpm_pwm_drv.h:21
static void pwm_cmp_enable_half_clock(PWM_Type *pwm_x, uint8_t index)
enable pwm cmp half clock
Definition: hpm_pwm_drv.h:559
pwm_fault_source
fault input signal
Definition: hpm_pwm_drv.h:90
static void pwm_clear_status(PWM_Type *pwm_x, uint32_t mask)
clear pwm status register
Definition: hpm_pwm_drv.h:342
@ pwm_fault_mode_force_output_1
Definition: hpm_pwm_drv.h:71
@ pwm_fault_mode_force_output_highz
Definition: hpm_pwm_drv.h:72
@ pwm_fault_mode_force_output_0
Definition: hpm_pwm_drv.h:70
@ pwm_force_at_synci
Definition: hpm_pwm_drv.h:114
@ pwm_force_none
Definition: hpm_pwm_drv.h:115
@ pwm_force_immediately
Definition: hpm_pwm_drv.h:112
@ pwm_force_at_reload
Definition: hpm_pwm_drv.h:113
@ pwm_force_source_software
Definition: hpm_pwm_drv.h:105
@ pwm_force_source_force_input
Definition: hpm_pwm_drv.h:104
@ pwm_output_0
Definition: hpm_pwm_drv.h:123
@ pwm_output_1
Definition: hpm_pwm_drv.h:124
@ pwm_output_high_z
Definition: hpm_pwm_drv.h:125
@ pwm_output_no_force
Definition: hpm_pwm_drv.h:126
@ pwm_cmp_mode_output_compare
Definition: hpm_pwm_drv.h:50
@ pwm_cmp_mode_input_capture
Definition: hpm_pwm_drv.h:51
@ pwm_counter_type_capture_falling_edge
Definition: hpm_pwm_drv.h:42
@ pwm_counter_type_capture_rising_edge
Definition: hpm_pwm_drv.h:41
@ pwm_shadow_register_update_on_sh_synci
Definition: hpm_pwm_drv.h:62
@ pwm_shadow_register_update_on_shlk
Definition: hpm_pwm_drv.h:59
@ pwm_shadow_register_update_on_modify
Definition: hpm_pwm_drv.h:60
@ pwm_shadow_register_update_on_hw_event
Definition: hpm_pwm_drv.h:61
@ pwm_fault_recovery_on_hw_event
Definition: hpm_pwm_drv.h:82
@ pwm_fault_recovery_on_fault_clear
Definition: hpm_pwm_drv.h:83
@ pwm_fault_recovery_immediately
Definition: hpm_pwm_drv.h:80
@ pwm_fault_recovery_on_reload
Definition: hpm_pwm_drv.h:81
@ pwm_fault_source_internal_0
Definition: hpm_pwm_drv.h:91
@ pwm_fault_source_internal_2
Definition: hpm_pwm_drv.h:93
@ pwm_fault_source_internal_1
Definition: hpm_pwm_drv.h:92
@ pwm_fault_source_internal_3
Definition: hpm_pwm_drv.h:94
@ pwm_fault_source_external_1
Definition: hpm_pwm_drv.h:96
@ pwm_fault_source_external_0
Definition: hpm_pwm_drv.h:95
#define PWM_SHCR_SHLKEN_MASK
Definition: hpm_pwm_regs.h:557
#define PWM_STA_STA_SET(x)
Definition: hpm_pwm_regs.h:85
#define PWM_CNT_CNT_GET(x)
Definition: hpm_pwm_regs.h:589
#define PWM_PWMCFG_HR_UPDATE_MODE_SET(x)
Definition: hpm_pwm_regs.h:631
#define PWM_SHCR_FRCSHDWSEL_MASK
Definition: hpm_pwm_regs.h:521
#define PWM_GCR_FRCPOL_SET(x)
Definition: hpm_pwm_regs.h:318
#define PWM_RLD_HRPWM_RLD_GET(x)
Definition: hpm_pwm_regs.h:127
#define PWM_GCR_CEN_MASK
Definition: hpm_pwm_regs.h:415
#define PWM_GCR_FRCPOL_MASK
Definition: hpm_pwm_regs.h:316
#define PWM_ANASTS_CALON_GET(x)
Definition: hpm_pwm_regs.h:924
#define PWM_GCR_FAULTI3EN_MASK
Definition: hpm_pwm_regs.h:264
#define PWM_GCR_CMPSHDWSEL_MASK
Definition: hpm_pwm_regs.h:339
#define PWM_GCR_HR_PWM_EN_MASK
Definition: hpm_pwm_regs.h:446
#define PWM_GCR_TIMERRESET_MASK
Definition: hpm_pwm_regs.h:456
#define PWM_CMPCFG_CMPMODE_MASK
Definition: hpm_pwm_regs.h:909
#define PWM_FRCMD_FRCMD_SET(x)
Definition: hpm_pwm_regs.h:213
#define PWM_GCR_FAULTI2EN_MASK
Definition: hpm_pwm_regs.h:274
#define PWM_PWMCFG_FAULTRECTIME_SET(x)
Definition: hpm_pwm_regs.h:686
#define PWM_SHCR_CNTSHDWSEL_MASK
Definition: hpm_pwm_regs.h:531
#define PWM_CMP_HRPWM_CMP_HR_SET(x)
Definition: hpm_pwm_regs.h:198
#define PWM_GCR_HWSHDWEDG_SET(x)
Definition: hpm_pwm_regs.h:331
#define PWM_GCR_FRCTIME_MASK
Definition: hpm_pwm_regs.h:470
#define PWM_SHCR_CNTSHDWSEL_SET(x)
Definition: hpm_pwm_regs.h:533
#define PWM_GCR_FAULTRECEDG_MASK
Definition: hpm_pwm_regs.h:352
#define PWM_GCR_HWSHDWEDG_MASK
Definition: hpm_pwm_regs.h:329
#define PWM_GCR_XRLDSYNCEN_MASK
Definition: hpm_pwm_regs.h:436
#define PWM_GCR_FAULTI1EN_MASK
Definition: hpm_pwm_regs.h:284
#define PWM_CHCFG_OUTPOL_SET(x)
Definition: hpm_pwm_regs.h:255
#define PWM_SHLK_SHLK_MASK
Definition: hpm_pwm_regs.h:222
#define PWM_SHCR_CNTSHDWUPT_SET(x)
Definition: hpm_pwm_regs.h:548
#define PWM_CMP_XCMP_SET(x)
Definition: hpm_pwm_regs.h:147
#define PWM_GCR_FAULTE0EN_MASK
Definition: hpm_pwm_regs.h:382
#define PWM_CMP_CMPHLF_MASK
Definition: hpm_pwm_regs.h:166
#define PWM_CMP_HRPWM_CMP_HR_MASK
Definition: hpm_pwm_regs.h:196
#define PWM_GCR_FAULTCLR_MASK
Definition: hpm_pwm_regs.h:426
#define PWM_RLD_RLD_GET(x)
Definition: hpm_pwm_regs.h:117
#define PWM_STA_XSTA_SET(x)
Definition: hpm_pwm_regs.h:74
#define PWM_RLD_XRLD_GET(x)
Definition: hpm_pwm_regs.h:107
#define PWM_GCR_FAULTEXPOL_MASK
Definition: hpm_pwm_regs.h:394
#define PWM_PWMCFG_FRCSRCSEL_MASK
Definition: hpm_pwm_regs.h:696
#define PWM_PWMCFG_OEN_SET(x)
Definition: hpm_pwm_regs.h:643
#define PWM_SHCR_CNT_UPDATE_EDGE_SET(x)
Definition: hpm_pwm_regs.h:503
#define PWM_CMPCFG_XCNTCMPEN_MASK
Definition: hpm_pwm_regs.h:882
#define PWM_CNT_XCNT_GET(x)
Definition: hpm_pwm_regs.h:580
#define PWM_GCR_CMPSHDWSEL_SET(x)
Definition: hpm_pwm_regs.h:341
#define PWM_CMP_XCMP_MASK
Definition: hpm_pwm_regs.h:145
#define PWM_GCR_FAULTRECEDG_SET(x)
Definition: hpm_pwm_regs.h:354
#define PWM_GCR_FAULTRECHWSEL_MASK
Definition: hpm_pwm_regs.h:362
#define PWM_RLD_HRPWM_RLD_HR_GET(x)
Definition: hpm_pwm_regs.h:137
#define PWM_CMP_HRPWM_CMP_SET(x)
Definition: hpm_pwm_regs.h:188
#define PWM_PWMCFG_DEADAREA_SET(x)
Definition: hpm_pwm_regs.h:720
#define PWM_RLD_HRPWM_RLD_SET(x)
Definition: hpm_pwm_regs.h:126
#define PWM_CMP_CMPJIT_MASK
Definition: hpm_pwm_regs.h:176
#define PWM_GCR_RLDSYNCEN_MASK
Definition: hpm_pwm_regs.h:404
#define PWM_GCR_TIMERRESET_SET(x)
Definition: hpm_pwm_regs.h:458
#define PWM_SHCR_CNTSHDWUPT_MASK
Definition: hpm_pwm_regs.h:546
#define PWM_GCR_FAULTRECHWSEL_SET(x)
Definition: hpm_pwm_regs.h:364
#define PWM_CMPCFG_CMPSHDWUPT_SET(x)
Definition: hpm_pwm_regs.h:899
#define PWM_GCR_FAULTE1EN_MASK
Definition: hpm_pwm_regs.h:372
#define PWM_GCR_SWFRC_MASK
Definition: hpm_pwm_regs.h:480
#define PWM_CHCFG_CMPSELBEG_SET(x)
Definition: hpm_pwm_regs.h:245
#define PWM_PWMCFG_PAIR_SET(x)
Definition: hpm_pwm_regs.h:709
#define PWM_RLD_XRLD_SET(x)
Definition: hpm_pwm_regs.h:106
#define PWM_SHCR_FORCE_UPDATE_EDGE_SET(x)
Definition: hpm_pwm_regs.h:513
#define PWM_PWMCFG_FAULTMODE_SET(x)
Definition: hpm_pwm_regs.h:671
#define PWM_RLD_HRPWM_RLD_HR_SET(x)
Definition: hpm_pwm_regs.h:136
#define PWM_CMP_HRPWM_CMP_MASK
Definition: hpm_pwm_regs.h:186
#define PWM_GCR_FAULTI0EN_MASK
Definition: hpm_pwm_regs.h:294
#define PWM_STA_HRPWM_STA_SET(x)
Definition: hpm_pwm_regs.h:95
#define PWM_GCR_HR_PWM_EN_SET(x)
Definition: hpm_pwm_regs.h:448
#define PWM_HRPWM_CFG_CAL_START_SET(x)
Definition: hpm_pwm_regs.h:936
#define PWM_GCR_FRCTIME_SET(x)
Definition: hpm_pwm_regs.h:472
#define PWM_SHCR_CNT_UPDATE_RELOAD_MASK
Definition: hpm_pwm_regs.h:491
#define PWM_SHCR_FRCSHDWSEL_SET(x)
Definition: hpm_pwm_regs.h:523
#define PWM_CMP_CMP_MASK
Definition: hpm_pwm_regs.h:156
#define PWM_CMP_CMPJIT_SET(x)
Definition: hpm_pwm_regs.h:178
#define PWM_CMP_CMP_SET(x)
Definition: hpm_pwm_regs.h:158
#define PWM_RLD_RLD_MASK
Definition: hpm_pwm_regs.h:114
#define PWM_PWMCFG_OEN_MASK
Definition: hpm_pwm_regs.h:641
#define PWM_PWMCFG_FRCSHDWUPT_SET(x)
Definition: hpm_pwm_regs.h:658
#define PWM_PWMCFG_FRCSRCSEL_SET(x)
Definition: hpm_pwm_regs.h:698
#define PWM_SHCR_CNT_UPDATE_RELOAD_SET(x)
Definition: hpm_pwm_regs.h:493
#define PWM_HRPWM_CFG_CAL_START_MASK
Definition: hpm_pwm_regs.h:934
#define PWM_SHCR_CNT_UPDATE_EDGE_MASK
Definition: hpm_pwm_regs.h:501
#define PWM_SHCR_FORCE_UPDATE_EDGE_MASK
Definition: hpm_pwm_regs.h:511
#define PWM_RLD_RLD_SET(x)
Definition: hpm_pwm_regs.h:116
#define PWM_CMP_CMPHLF_SET(x)
Definition: hpm_pwm_regs.h:168
#define PWM_CHCFG_CMPSELEND_SET(x)
Definition: hpm_pwm_regs.h:235
#define PWM_GCR_FAULTEXPOL_SET(x)
Definition: hpm_pwm_regs.h:396
Definition: hpm_pwm_regs.h:12
__R uint32_t ANASTS[8]
Definition: hpm_pwm_regs.h:49
__RW uint32_t STA
Definition: hpm_pwm_regs.h:15
__RW uint32_t UNLK
Definition: hpm_pwm_regs.h:13
__RW uint32_t RLD
Definition: hpm_pwm_regs.h:19
__RW uint32_t PWMCFG[8]
Definition: hpm_pwm_regs.h:42
__RW uint32_t DMAEN
Definition: hpm_pwm_regs.h:46
__RW uint32_t CMP_HRPWM[24]
Definition: hpm_pwm_regs.h:24
__RW uint32_t SHCR
Definition: hpm_pwm_regs.h:32
__W uint32_t HRPWM_CFG
Definition: hpm_pwm_regs.h:50
__RW uint32_t SHLK
Definition: hpm_pwm_regs.h:28
__RW uint32_t STA_HRPWM
Definition: hpm_pwm_regs.h:16
__RW uint32_t CHCFG[24]
Definition: hpm_pwm_regs.h:29
__RW uint32_t FRCMD
Definition: hpm_pwm_regs.h:27
__RW uint32_t GCR
Definition: hpm_pwm_regs.h:31
__RW uint32_t CMPCFG[24]
Definition: hpm_pwm_regs.h:47
__RW uint32_t RLD_HRPWM
Definition: hpm_pwm_regs.h:20
__RW uint32_t CMP[24]
Definition: hpm_pwm_regs.h:23
__R uint32_t CNT
Definition: hpm_pwm_regs.h:36
__RW uint32_t IRQEN
Definition: hpm_pwm_regs.h:44
__W uint32_t SR
Definition: hpm_pwm_regs.h:43
pwm compare config
Definition: hpm_pwm_drv.h:133
uint8_t half_clock_cmp
Definition: hpm_pwm_drv.h:142
bool enable_ex_cmp
Definition: hpm_pwm_drv.h:135
uint8_t mode
Definition: hpm_pwm_drv.h:139
uint32_t cmp
Definition: hpm_pwm_drv.h:134
uint8_t jitter_cmp
Definition: hpm_pwm_drv.h:143
uint8_t update_trigger
Definition: hpm_pwm_drv.h:140
uint8_t ex_cmp
Definition: hpm_pwm_drv.h:141
pwm config data
Definition: hpm_pwm_drv.h:174
uint8_t fault_recovery_trigger
Definition: hpm_pwm_drv.h:182
uint8_t fault_mode
Definition: hpm_pwm_drv.h:181
bool invert_output
Definition: hpm_pwm_drv.h:179
uint32_t dead_zone_in_half_cycle
Definition: hpm_pwm_drv.h:184
uint8_t force_source
Definition: hpm_pwm_drv.h:183
bool enable_output
Definition: hpm_pwm_drv.h:178
uint8_t update_trigger
Definition: hpm_pwm_drv.h:180
pwm fault source config
Definition: hpm_pwm_drv.h:162
bool fault_recover_at_rising_edge
Definition: hpm_pwm_drv.h:164
bool fault_external_1_active_low
Definition: hpm_pwm_drv.h:166
uint8_t fault_output_recovery_trigger
Definition: hpm_pwm_drv.h:167
uint32_t source_mask
Definition: hpm_pwm_drv.h:163
bool fault_external_0_active_low
Definition: hpm_pwm_drv.h:165
pwm output channel config
Definition: hpm_pwm_drv.h:153
bool invert_output
Definition: hpm_pwm_drv.h:156
uint8_t cmp_end_index
Definition: hpm_pwm_drv.h:155
uint8_t cmp_start_index
Definition: hpm_pwm_drv.h:154
pair pwm config
Definition: hpm_pwm_drv.h:191
pwm_config_t pwm[2]
Definition: hpm_pwm_drv.h:192