libxr  1.0
Want to be the best embedded framework
Loading...
Searching...
No Matches
LibXR::HPMPWM Class Reference

HPM 平台 PWM 驱动实现 / PWM driver implementation for HPM platform. More...

#include <hpm_pwm.hpp>

Inheritance diagram for LibXR::HPMPWM:
[legend]
Collaboration diagram for LibXR::HPMPWM:
[legend]

Public Member Functions

 HPMPWM (LibXRHpmPwmType *pwm, clock_name_t clock, uint8_t pwm_index, uint8_t cmp_index, bool invert=false, bool auto_board_init=true)
 构造 HPM PWM 对象 / Construct an HPM PWM object.
 
ErrorCode SetDutyCycle (float value) override
 设置占空比 / Set PWM duty cycle.
 
ErrorCode SetConfig (Configuration config) override
 配置 PWM 频率 / Configure PWM frequency.
 
ErrorCode Enable () override
 启动 PWM 输出 / Start PWM output.
 
ErrorCode Disable () override
 停止 PWM 输出 / Stop PWM output.
 
- Public Member Functions inherited from LibXR::PWM

Static Private Member Functions

static uint8_t ResolveGptmrReloadCmpIndex (uint8_t duty_cmp_index)
 

Private Attributes

LibXRHpmPwmType * pwm_
 
GPTMR_Type * gptmr_
 
clock_name_t clock_
 
uint8_t pwm_index_
 
uint8_t cmp_index_
 
bool invert_
 
bool auto_board_init_
 
uint32_t reload_
 
bool configured_
 

Static Private Attributes

static constexpr uint8_t kInvalidCmpIndex = 0xFFu
 

Detailed Description

HPM 平台 PWM 驱动实现 / PWM driver implementation for HPM platform.

Definition at line 31 of file hpm_pwm.hpp.

Constructor & Destructor Documentation

◆ HPMPWM()

HPMPWM::HPMPWM ( LibXRHpmPwmType * pwm,
clock_name_t clock,
uint8_t pwm_index,
uint8_t cmp_index,
bool invert = false,
bool auto_board_init = true )

构造 HPM PWM 对象 / Construct an HPM PWM object.

构造 PWM 实例 / Construct PWM instance.

Parameters
pwmPWM 外设基地址 / PWM peripheral base address.
clockPWM 对应时钟源 / Clock source used by this PWM instance.
pwm_indexPWM 输出通道索引 / PWM output index.
cmp_index与输出绑定的比较器索引 / Comparator index bound to the PWM output.
invert是否反相输出 / Whether to invert output polarity.
auto_board_init是否在 GPTMR fallback 路径自动调用板级时钟/引脚初始化 / Whether to auto-run board-level clock/pin init in GPTMR fallback path.

说明:

  • 当芯片存在原生 PWM 外设时,pwm_ 按原生路径使用;
  • 当芯片仅有 GPTMR 输出比较能力时,gptmr_ 走 fallback 路径。 Notes:
  • If native PWM exists, pwm_ is used in native path.
  • If only GPTMR compare output is available, gptmr_ is used as fallback.

Definition at line 31 of file hpm_pwm.cpp.

33 : pwm_(pwm),
34 gptmr_(reinterpret_cast<GPTMR_Type*>(pwm)),
35 clock_(clock),
36 pwm_index_(pwm_index),
37 cmp_index_(cmp_index),
38 invert_(invert),
39 auto_board_init_(auto_board_init),
40 reload_(0),
41 configured_(false)
42{
43}

Member Function Documentation

◆ Disable()

ErrorCode HPMPWM::Disable ( )
overridevirtual

停止 PWM 输出 / Stop PWM output.

Returns
操作结果 / Operation result.

Implements LibXR::PWM.

Definition at line 207 of file hpm_pwm.cpp.

208{
209#if LIBXR_HPM_PWM_SUPPORTED
210 pwm_stop_counter(pwm_);
211#elif LIBXR_HPM_GPTMR_PWM_FALLBACK
212 gptmr_stop_counter(gptmr_, pwm_index_);
213#else
214 return ErrorCode::NOT_SUPPORT;
215#endif
216 return ErrorCode::OK;
217}

◆ Enable()

ErrorCode HPMPWM::Enable ( )
overridevirtual

启动 PWM 输出 / Start PWM output.

Returns
操作结果 / Operation result.

Implements LibXR::PWM.

Definition at line 189 of file hpm_pwm.cpp.

190{
191 if (!configured_)
192 {
193 return ErrorCode::INIT_ERR;
194 }
195
196#if LIBXR_HPM_PWM_SUPPORTED
197 pwm_start_counter(pwm_);
198#elif LIBXR_HPM_GPTMR_PWM_FALLBACK
199 gptmr_start_counter(gptmr_, pwm_index_);
200#else
201 return ErrorCode::NOT_SUPPORT;
202#endif
203
204 return ErrorCode::OK;
205}

◆ ResolveGptmrReloadCmpIndex()

uint8_t HPMPWM::ResolveGptmrReloadCmpIndex ( uint8_t duty_cmp_index)
staticprivate

Definition at line 12 of file hpm_pwm.cpp.

13{
14 if (duty_cmp_index >= GPTMR_CH_CMP_COUNT)
15 {
16 return kInvalidCmpIndex;
17 }
18 return static_cast<uint8_t>(duty_cmp_index == 0u ? 1u : 0u);
19}

◆ SetConfig()

ErrorCode HPMPWM::SetConfig ( Configuration config)
overridevirtual

配置 PWM 频率 / Configure PWM frequency.

Parameters
configPWM 配置参数 / PWM configuration.
Returns
操作结果 / Operation result.

Implements LibXR::PWM.

Definition at line 88 of file hpm_pwm.cpp.

89{
90 if (config.frequency == 0u)
91 {
92 return ErrorCode::ARG_ERR;
93 }
94
95 uint32_t clock_hz = 0u;
96
97#if LIBXR_HPM_GPTMR_PWM_FALLBACK && LIBXR_HPM_PWM_HAS_BOARD_HELPER
98 if (auto_board_init_ && gptmr_ != nullptr)
99 {
100 // 为了与 STM32 风格一致,应用层可不显式调用 board_init_*。
101 // To keep STM32-like app style, board_init_* can be hidden inside driver.
102 clock_hz = board_init_gptmr_clock(gptmr_);
103 board_init_gptmr_channel_pin(gptmr_, pwm_index_, true);
104 }
105#endif
106
107 if (clock_hz == 0u)
108 {
109 clock_hz = clock_get_frequency(clock_);
110 }
111
112 if (clock_hz == 0u)
113 {
114 return ErrorCode::INIT_ERR;
115 }
116
117 uint32_t reload = clock_hz / config.frequency;
118 if (reload == 0u || reload > 0xFFFFFFu)
119 {
120 return ErrorCode::INIT_ERR;
121 }
122 reload_ = reload;
123
124#if LIBXR_HPM_PWM_SUPPORTED
125 pwm_stop_counter(pwm_);
126
127 pwm_config_t pwm_config{};
128 pwm_cmp_config_t cmp_config{};
129
130 pwm_get_default_pwm_config(pwm_, &pwm_config);
131 pwm_get_default_cmp_config(pwm_, &cmp_config);
132
133 pwm_config.enable_output = true;
134 pwm_config.invert_output = invert_;
135 pwm_config.dead_zone_in_half_cycle = 0;
136
137 pwm_set_reload(pwm_, 0, reload_);
138 pwm_set_start_count(pwm_, 0, 0);
139
140 cmp_config.mode = pwm_cmp_mode_output_compare;
141 cmp_config.cmp = reload_ + 1;
142 cmp_config.update_trigger = pwm_shadow_register_update_on_modify;
143
144 if (pwm_setup_waveform(pwm_, pwm_index_, &pwm_config, cmp_index_, &cmp_config, 1) !=
145 status_success)
146 {
147 return ErrorCode::INIT_ERR;
148 }
149
150 pwm_issue_shadow_register_lock_event(pwm_);
151#elif LIBXR_HPM_GPTMR_PWM_FALLBACK
152 if (gptmr_ == nullptr)
153 {
154 return ErrorCode::ARG_ERR;
155 }
156
157 const uint8_t reload_cmp_index = ResolveGptmrReloadCmpIndex(cmp_index_);
158 if (reload_cmp_index == kInvalidCmpIndex)
159 {
160 return ErrorCode::ARG_ERR;
161 }
162
163 // 重新配置前先停计数器,避免切换参数时输出毛刺。
164 // Stop counter before reconfiguration to avoid output glitches.
165 gptmr_stop_counter(gptmr_, pwm_index_);
166
167 gptmr_channel_config_t cfg;
168 gptmr_channel_get_default_config(gptmr_, &cfg);
169 cfg.mode = gptmr_work_mode_no_capture;
170 cfg.cmp_initial_polarity_high = invert_;
171 cfg.enable_cmp_output = true;
172 cfg.reload = reload_;
173 cfg.cmp[cmp_index_] = reload_ / 2u;
174 cfg.cmp[reload_cmp_index] = reload_;
175
176 if (gptmr_channel_config(gptmr_, pwm_index_, &cfg, false) != status_success)
177 {
178 return ErrorCode::INIT_ERR;
179 }
180 gptmr_channel_reset_count(gptmr_, pwm_index_);
181#else
182 return ErrorCode::NOT_SUPPORT;
183#endif
184
185 configured_ = true;
186 return ErrorCode::OK;
187}

◆ SetDutyCycle()

ErrorCode HPMPWM::SetDutyCycle ( float value)
overridevirtual

设置占空比 / Set PWM duty cycle.

Parameters
value占空比范围 [0.0, 1.0] / Duty cycle in range [0.0, 1.0].
Returns
操作结果 / Operation result.

Implements LibXR::PWM.

Definition at line 45 of file hpm_pwm.cpp.

46{
47 if (!configured_)
48 {
49 return ErrorCode::INIT_ERR;
50 }
51
52 if (value < 0.0f)
53 {
54 value = 0.0f;
55 }
56 else if (value > 1.0f)
57 {
58 value = 1.0f;
59 }
60
61#if LIBXR_HPM_PWM_SUPPORTED
62 const float duty_percent = value * 100.0f;
63 if (pwm_update_duty_edge_aligned(pwm_, cmp_index_, duty_percent) != status_success)
64 {
65 return ErrorCode::FAILED;
66 }
67#elif LIBXR_HPM_GPTMR_PWM_FALLBACK
68 // GPTMR 比较值不允许落在 0 或 reload,避免输出退化成常高/常低。
69 // Keep compare away from 0/reload to avoid constant-high/constant-low output.
70 uint32_t cmp = static_cast<uint32_t>(static_cast<float>(reload_) * value);
71 if (cmp == 0u)
72 {
73 cmp = 1u;
74 }
75 else if (cmp >= reload_)
76 {
77 cmp = reload_ - 1u;
78 }
79 gptmr_update_cmp(gptmr_, pwm_index_, cmp_index_, cmp);
80#else
81 (void)value;
82 return ErrorCode::NOT_SUPPORT;
83#endif
84
85 return ErrorCode::OK;
86}

Field Documentation

◆ auto_board_init_

bool LibXR::HPMPWM::auto_board_init_
private

Definition at line 83 of file hpm_pwm.hpp.

◆ clock_

clock_name_t LibXR::HPMPWM::clock_
private

Definition at line 79 of file hpm_pwm.hpp.

◆ cmp_index_

uint8_t LibXR::HPMPWM::cmp_index_
private

Definition at line 81 of file hpm_pwm.hpp.

◆ configured_

bool LibXR::HPMPWM::configured_
private

Definition at line 85 of file hpm_pwm.hpp.

◆ gptmr_

GPTMR_Type* LibXR::HPMPWM::gptmr_
private

Definition at line 78 of file hpm_pwm.hpp.

◆ invert_

bool LibXR::HPMPWM::invert_
private

Definition at line 82 of file hpm_pwm.hpp.

◆ kInvalidCmpIndex

uint8_t LibXR::HPMPWM::kInvalidCmpIndex = 0xFFu
staticconstexprprivate

Definition at line 74 of file hpm_pwm.hpp.

◆ pwm_

LibXRHpmPwmType* LibXR::HPMPWM::pwm_
private

Definition at line 77 of file hpm_pwm.hpp.

◆ pwm_index_

uint8_t LibXR::HPMPWM::pwm_index_
private

Definition at line 80 of file hpm_pwm.hpp.

◆ reload_

uint32_t LibXR::HPMPWM::reload_
private

Definition at line 84 of file hpm_pwm.hpp.


The documentation for this class was generated from the following files: