87 const uint32_t clock_hz = clock_get_frequency(clock_);
94 uint32_t reload = clock_hz / config.
frequency;
95 if (reload == 0u || reload > 0xFFFFFFu)
101#if LIBXR_HPM_PWM_SUPPORTED
102 pwm_stop_counter(pwm_);
104 pwm_config_t pwm_config{};
105 pwm_cmp_config_t cmp_config{};
107 pwm_get_default_pwm_config(pwm_, &pwm_config);
108 pwm_get_default_cmp_config(pwm_, &cmp_config);
110 pwm_config.enable_output =
true;
111 pwm_config.invert_output = invert_;
112 pwm_config.dead_zone_in_half_cycle = 0;
114 pwm_set_reload(pwm_, 0, reload_);
115 pwm_set_start_count(pwm_, 0, 0);
117 cmp_config.mode = pwm_cmp_mode_output_compare;
118 cmp_config.cmp = reload_ + 1;
119 cmp_config.update_trigger = pwm_shadow_register_update_on_modify;
121 if (pwm_setup_waveform(pwm_, pwm_index_, &pwm_config, cmp_index_, &cmp_config, 1) !=
127 pwm_issue_shadow_register_lock_event(pwm_);
128#elif LIBXR_HPM_GPTMR_PWM_FALLBACK
129 if (gptmr_ ==
nullptr)
134 const uint8_t reload_cmp_index = ResolveGptmrReloadCmpIndex(cmp_index_);
135 if (reload_cmp_index == INVALID_CMP_INDEX)
142 gptmr_stop_counter(gptmr_, pwm_index_);
144 gptmr_channel_config_t cfg;
145 gptmr_channel_get_default_config(gptmr_, &cfg);
146 cfg.mode = gptmr_work_mode_no_capture;
147 cfg.cmp_initial_polarity_high = invert_;
148 cfg.enable_cmp_output =
true;
149 cfg.reload = reload_;
150 cfg.cmp[cmp_index_] = reload_ / 2u;
151 cfg.cmp[reload_cmp_index] = reload_;
153 if (gptmr_channel_config(gptmr_, pwm_index_, &cfg,
false) != status_success)
157 gptmr_channel_reset_count(gptmr_, pwm_index_);
HPMPWM(LibXRHpmPwmType *pwm, clock_name_t clock, uint8_t pwm_index, uint8_t cmp_index, Polarity polarity)
构造 HPM PWM 对象 / Construct an HPM PWM object.