11#define _2_MHZ 2'000'000
16struct stm32_pwm_config {
18 const uint8_t Channel;
19 const uint8_t AlternateFunc;
24 bool hasInit()
const {
25 return m_driver !=
nullptr;
29 static constexpr uint32_t c_timerFrequency = _2_MHZ;
33 m_channel =
config.Channel;
38 if (m_period > 0xFFF0) {
55 {PWM_OUTPUT_ACTIVE_HIGH,
nullptr},
56 {PWM_OUTPUT_ACTIVE_HIGH,
nullptr},
57 {PWM_OUTPUT_ACTIVE_HIGH,
nullptr},
58 {PWM_OUTPUT_ACTIVE_HIGH,
nullptr}
66 pwmStart(m_driver, &
pwmcfg);
74 criticalError(
"Attempted to set duty on null hard PWM device");
83 uint8_t m_channel = 0;
84 uint32_t m_period = 0;
87 return m_period *
duty;
108#if STM32_PWM_USE_TIM2
114#if STM32_PWM_USE_TIM3
121#if STM32_PWM_USE_TIM4
132#if STM32_PWM_USE_TIM5
133 case Gpio::A0:
return stm32_pwm_config{&PWMD5, 0, 2};
134 case Gpio::A1:
return stm32_pwm_config{&PWMD5, 1, 2};
135 case Gpio::A2:
return stm32_pwm_config{&PWMD5, 2, 2};
136 case Gpio::A3:
return stm32_pwm_config{&PWMD5, 3, 2};
138#if STM32_PWM_USE_TIM8
141#ifndef EFI_INTERNAL_FAST_ADC_PWM
142#if !STM32_PWM_USE_TIM3
146 case Gpio::C6:
return stm32_pwm_config{&PWMD8, 0, 3};
147 case Gpio::C7:
return stm32_pwm_config{&PWMD8, 1, 3};
150 case Gpio::C8:
return stm32_pwm_config{&PWMD8, 2, 3};
151 case Gpio::C9:
return stm32_pwm_config{&PWMD8, 3, 3};
155#if STM32_PWM_USE_TIM9
156 case Gpio::E5:
return stm32_pwm_config{&PWMD9, 0, 3};
157 case Gpio::E6:
return stm32_pwm_config{&PWMD9, 1, 3};
159 default:
return unexpected;
166 for (
size_t i = 0; i < efi::size(
hardPwms); i++) {
172 criticalError(
"Run out of hardware PWM devices!");
178 if (frequencyHz < 50) {
190 device->start(msg, cfg.Value, frequencyHz,
duty);
static const PWMConfig pwmcfg
void efiSetPadMode(const char *msg, brain_pin_e brainPin, iomode_t mode)
static constexpr persistent_config_s * config
void firmwareError(ObdCode code, const char *fmt,...)
PWMDriver PWMD2
PWMD2 driver identifier.
void pwm_lld_enable_channel(PWMDriver *pwmp, pwmchannel_t channel, pwmcnt_t width)
Enables a PWM channel.
PWMDriver PWMD1
PWMD1 driver identifier.
PWMDriver PWMD4
PWMD4 driver identifier.
PWMDriver PWMD3
PWMD3 driver identifier.
uint16_t pwmcnt_t
Type of a PWM counter.
@ CUSTOM_OBD_LOW_FREQUENCY
@ CUSTOM_OBD_HIGH_FREQUENCY
static expected< stm32_pwm_config > getConfigForPin(brain_pin_e pin)
static stm32_hardware_pwm hardPwms[5]
stm32_hardware_pwm * getNextPwmDevice()
Type of a PWM driver configuration structure.
uint32_t frequency
Timer clock in Hz.
Structure representing a PWM driver.
static hardware_pwm * tryInitPin(const char *msg, brain_pin_e pin, float frequencyHz, float duty)
virtual void setDuty(float duty)=0