HF Interface Wrapper 0.1.0-dev
Embedded C++ hardware abstraction layer
Loading...
Searching...
No Matches
StmPwm Class Reference

STM32 PWM implementation. More...

#include <StmPwm.h>

Inheritance diagram for StmPwm:
[legend]
Collaboration diagram for StmPwm:
[legend]

Public Member Functions

 StmPwm (TIM_HandleTypeDef *htim, hf_u32_t timer_clock_hz) noexcept
 Construct from HAL timer handle.
 
 StmPwm (const hf_stm32_pwm_config_t &config) noexcept
 Construct from config struct.
 
 ~StmPwm () noexcept override
 
 StmPwm (const StmPwm &)=delete
 
StmPwmoperator= (const StmPwm &)=delete
 
hf_pwm_err_t Initialize () noexcept override
 Initialize the PWM system.
 
hf_pwm_err_t Deinitialize () noexcept override
 Deinitialize the PWM system.
 
hf_pwm_err_t EnableChannel (hf_channel_id_t channel_id) noexcept override
 Enable a PWM channel.
 
hf_pwm_err_t DisableChannel (hf_channel_id_t channel_id) noexcept override
 Disable a PWM channel.
 
bool IsChannelEnabled (hf_channel_id_t channel_id) const noexcept override
 Check if a channel is enabled.
 
hf_pwm_err_t SetDutyCycle (hf_channel_id_t channel_id, float duty_cycle) noexcept override
 Set duty cycle for a channel.
 
hf_pwm_err_t SetDutyCycleRaw (hf_channel_id_t channel_id, hf_u32_t raw_value) noexcept override
 Set raw duty value for a channel.
 
hf_pwm_err_t SetFrequency (hf_channel_id_t channel_id, hf_frequency_hz_t frequency_hz) noexcept override
 Set frequency for a channel.
 
hf_pwm_err_t SetPhaseShift (hf_channel_id_t channel_id, float phase_shift_degrees) noexcept override
 Set phase shift for a channel (if supported)
 
hf_pwm_err_t StartAll () noexcept override
 Start all enabled channels simultaneously.
 
hf_pwm_err_t StopAll () noexcept override
 Stop all channels.
 
hf_pwm_err_t UpdateAll () noexcept override
 Update all channel outputs simultaneously (for synchronized updates)
 
hf_pwm_err_t SetComplementaryOutput (hf_channel_id_t primary_channel, hf_channel_id_t complementary_channel, hf_u32_t deadtime_ns) noexcept override
 Set complementary output configuration (for motor control)
 
float GetDutyCycle (hf_channel_id_t channel_id) const noexcept override
 Get current duty cycle for a channel.
 
hf_frequency_hz_t GetFrequency (hf_channel_id_t channel_id) const noexcept override
 Get current frequency for a channel.
 
TIM_HandleTypeDef * GetHalHandle () const noexcept
 
- Public Member Functions inherited from BasePwm
virtual ~BasePwm () noexcept=default
 
bool IsInitialized () const noexcept
 Check if PWM system is initialized.
 
bool EnsureInitialized () noexcept
 Ensure PWM is initialized (lazy initialization pattern)
 
bool EnsureDeinitialized () noexcept
 Ensure PWM is deinitialized (lazy deinitialization pattern)
 
virtual hf_pwm_err_t GetStatistics (hf_pwm_statistics_t &statistics) const noexcept
 Get PWM statistics.
 
virtual hf_pwm_err_t GetDiagnostics (hf_pwm_diagnostics_t &diagnostics) const noexcept
 Get PWM diagnostics.
 
virtual hf_pwm_err_t ResetStatistics () noexcept
 Reset PWM operation statistics.
 
virtual hf_pwm_err_t ResetDiagnostics () noexcept
 Reset PWM diagnostic information.
 

Static Public Attributes

static constexpr hf_u8_t kMaxChannels = 4
 

Private Member Functions

bool ApplyFrequency (hf_frequency_hz_t freq_hz) noexcept
 Apply freq by recalculating PSC + ARR.
 
void ReapplyDuties () noexcept
 Reapply all cached duty cycles after ARR change.
 

Static Private Member Functions

static hf_u32_t ChannelToHal (hf_channel_id_t ch) noexcept
 Get HAL channel constant from 0-based index.
 

Private Attributes

TIM_HandleTypeDef * htim_
 
hf_u32_t timer_clock_hz_
 
bool channel_enabled_ [kMaxChannels]
 
float duty_ [kMaxChannels]
 Cached duty 0.0–1.0.
 
hf_frequency_hz_t frequency_hz_
 Current frequency (shared)
 

Additional Inherited Members

- Static Public Member Functions inherited from BasePwm
static constexpr hf_u32_t DutyCycleToRaw (float duty_cycle, hf_u8_t resolution_bits) noexcept
 Calculate raw duty value from percentage.
 
static constexpr float RawToDutyCycle (hf_u32_t raw_value, hf_u8_t resolution_bits) noexcept
 Calculate duty cycle percentage from raw value.
 
static constexpr bool IsValidDutyCycle (float duty_cycle) noexcept
 Validate duty cycle range.
 
static constexpr bool IsValidFrequency (hf_u32_t frequency_hz, hf_u32_t min_freq_hz, hf_u32_t max_freq_hz) noexcept
 Validate frequency range.
 
static constexpr bool IsValidRawDuty (hf_u32_t raw_value, hf_u8_t resolution_bits) noexcept
 Validate raw duty value against resolution.
 
static constexpr float CalculateFrequencyAccuracy (hf_u32_t target_freq, hf_u32_t actual_freq) noexcept
 Calculate frequency accuracy percentage.
 
static constexpr float ClampDutyCycle (float duty_cycle) noexcept
 Clamp duty cycle to valid range.
 
- Protected Member Functions inherited from BasePwm
 BasePwm () noexcept
 
 BasePwm (const BasePwm &)=delete
 
BasePwmoperator= (const BasePwm &)=delete
 
 BasePwm (BasePwm &&)=delete
 
BasePwmoperator= (BasePwm &&)=delete
 
- Protected Attributes inherited from BasePwm
bool initialized_
 Initialization state.
 
hf_pwm_statistics_t statistics_
 PWM operation statistics.
 
hf_pwm_diagnostics_t diagnostics_
 PWM diagnostic information.
 

Detailed Description

STM32 PWM implementation.

Design:

  • One StmPwm per TIM_HandleTypeDef (one hardware timer).
  • Channels 0–3 map to TIM_CHANNEL_1..TIM_CHANNEL_4.
  • Duty cycle sets the CCR register relative to ARR.
  • Frequency changes recalculate ARR+PSC (affects all channels on the timer).
  • Complementary / dead-time support via TIM1/TIM8 BDTR register.

Constructor & Destructor Documentation

◆ StmPwm() [1/3]

StmPwm::StmPwm ( TIM_HandleTypeDef * htim,
hf_u32_t timer_clock_hz )
explicitnoexcept

Construct from HAL timer handle.

Parameters
htimCubeMX timer handle.
timer_clock_hzAPB timer input clock (e.g. 84 MHz).

◆ StmPwm() [2/3]

StmPwm::StmPwm ( const hf_stm32_pwm_config_t & config)
explicitnoexcept

Construct from config struct.

◆ ~StmPwm()

StmPwm::~StmPwm ( )
overridenoexcept

◆ StmPwm() [3/3]

StmPwm::StmPwm ( const StmPwm & )
delete

Member Function Documentation

◆ ApplyFrequency()

bool StmPwm::ApplyFrequency ( hf_frequency_hz_t freq_hz)
privatenoexcept

Apply freq by recalculating PSC + ARR.

◆ ChannelToHal()

hf_u32_t StmPwm::ChannelToHal ( hf_channel_id_t ch)
staticprivatenoexcept

Get HAL channel constant from 0-based index.

◆ Deinitialize()

hf_pwm_err_t StmPwm::Deinitialize ( )
overridevirtualnoexcept

Deinitialize the PWM system.

Returns
PWM_SUCCESS on success, error code on failure

Implements BasePwm.

◆ DisableChannel()

hf_pwm_err_t StmPwm::DisableChannel ( hf_channel_id_t channel_id)
overridevirtualnoexcept

Disable a PWM channel.

Parameters
channel_idChannel to disable
Returns
PWM_SUCCESS on success, error code on failure

Implements BasePwm.

◆ EnableChannel()

hf_pwm_err_t StmPwm::EnableChannel ( hf_channel_id_t channel_id)
overridevirtualnoexcept

Enable a PWM channel.

Parameters
channel_idChannel to enable
Returns
PWM_SUCCESS on success, error code on failure

Implements BasePwm.

◆ GetDutyCycle()

float StmPwm::GetDutyCycle ( hf_channel_id_t channel_id) const
overridevirtualnoexcept

Get current duty cycle for a channel.

Parameters
channel_idChannel identifier
Returns
Current duty cycle (0.0 - 1.0), or -1.0 on error

Implements BasePwm.

◆ GetFrequency()

hf_frequency_hz_t StmPwm::GetFrequency ( hf_channel_id_t channel_id) const
overridevirtualnoexcept

Get current frequency for a channel.

Parameters
channel_idChannel identifier
Returns
Current frequency in Hz, or 0 on error

Implements BasePwm.

◆ GetHalHandle()

TIM_HandleTypeDef * StmPwm::GetHalHandle ( ) const
inlinenoexcept

◆ Initialize()

hf_pwm_err_t StmPwm::Initialize ( )
overridevirtualnoexcept

Initialize the PWM system.

Returns
PWM_SUCCESS on success, error code on failure

Implements BasePwm.

◆ IsChannelEnabled()

bool StmPwm::IsChannelEnabled ( hf_channel_id_t channel_id) const
overridevirtualnoexcept

Check if a channel is enabled.

Parameters
channel_idChannel to check
Returns
true if enabled, false otherwise

Implements BasePwm.

◆ operator=()

StmPwm & StmPwm::operator= ( const StmPwm & )
delete

◆ ReapplyDuties()

void StmPwm::ReapplyDuties ( )
privatenoexcept

Reapply all cached duty cycles after ARR change.

◆ SetComplementaryOutput()

hf_pwm_err_t StmPwm::SetComplementaryOutput ( hf_channel_id_t primary_channel,
hf_channel_id_t complementary_channel,
hf_u32_t deadtime_ns )
overridevirtualnoexcept

Set complementary output configuration (for motor control)

Parameters
primary_channelPrimary channel
complementary_channelComplementary channel
deadtime_nsDeadtime in nanoseconds
Returns
PWM_SUCCESS on success, error code on failure

Implements BasePwm.

◆ SetDutyCycle()

hf_pwm_err_t StmPwm::SetDutyCycle ( hf_channel_id_t channel_id,
float duty_cycle )
overridevirtualnoexcept

Set duty cycle for a channel.

Parameters
channel_idChannel identifier
duty_cycleDuty cycle (0.0 - 1.0)
Returns
PWM_SUCCESS on success, error code on failure

Implements BasePwm.

◆ SetDutyCycleRaw()

hf_pwm_err_t StmPwm::SetDutyCycleRaw ( hf_channel_id_t channel_id,
hf_u32_t raw_value )
overridevirtualnoexcept

Set raw duty value for a channel.

Parameters
channel_idChannel identifier
raw_valueRaw duty register value
Returns
PWM_SUCCESS on success, error code on failure

Implements BasePwm.

◆ SetFrequency()

hf_pwm_err_t StmPwm::SetFrequency ( hf_channel_id_t channel_id,
hf_frequency_hz_t frequency_hz )
overridevirtualnoexcept

Set frequency for a channel.

Parameters
channel_idChannel identifier
frequency_hzFrequency in Hz
Returns
PWM_SUCCESS on success, error code on failure

Implements BasePwm.

◆ SetPhaseShift()

hf_pwm_err_t StmPwm::SetPhaseShift ( hf_channel_id_t channel_id,
float phase_shift_degrees )
overridevirtualnoexcept

Set phase shift for a channel (if supported)

Parameters
channel_idChannel identifier
phase_shift_degreesPhase shift in degrees (0-360)
Returns
PWM_SUCCESS on success, error code on failure

Implements BasePwm.

◆ StartAll()

hf_pwm_err_t StmPwm::StartAll ( )
overridevirtualnoexcept

Start all enabled channels simultaneously.

Returns
PWM_SUCCESS on success, error code on failure

Implements BasePwm.

◆ StopAll()

hf_pwm_err_t StmPwm::StopAll ( )
overridevirtualnoexcept

Stop all channels.

Returns
PWM_SUCCESS on success, error code on failure

Implements BasePwm.

◆ UpdateAll()

hf_pwm_err_t StmPwm::UpdateAll ( )
overridevirtualnoexcept

Update all channel outputs simultaneously (for synchronized updates)

Returns
PWM_SUCCESS on success, error code on failure

Implements BasePwm.

Member Data Documentation

◆ channel_enabled_

bool StmPwm::channel_enabled_[kMaxChannels]
private

◆ duty_

float StmPwm::duty_[kMaxChannels]
private

Cached duty 0.0–1.0.

◆ frequency_hz_

hf_frequency_hz_t StmPwm::frequency_hz_
private

Current frequency (shared)

◆ htim_

TIM_HandleTypeDef* StmPwm::htim_
private

◆ kMaxChannels

constexpr hf_u8_t StmPwm::kMaxChannels = 4
staticconstexpr

◆ timer_clock_hz_

hf_u32_t StmPwm::timer_clock_hz_
private

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