Skip to content

Commit 3636262

Browse files
STM32: fix HRTIM pwm init and corner case (#31)
* STM32: fix HRTIM pwm corner cases (0-100%) in read function * STM32: fix HRTIM pwm init with default values * STM32: add helper fun to manage pwmout obj period
1 parent f6d6cdf commit 3636262

File tree

1 file changed

+38
-21
lines changed

1 file changed

+38
-21
lines changed

Diff for: targets/TARGET_STM/pwmout_api.c

+38-21
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@ static hrtim_t hrtim_timer;
5353
static HRTIM_HandleTypeDef HrtimHandle;
5454
static HRTIM_CompareCfgTypeDef sConfig_compare;
5555
static HRTIM_TimeBaseCfgTypeDef sConfig_time_base;
56+
57+
static void _pwmout_obj_period_us(pwmout_t *obj, int us);
5658
#endif
5759

5860
/* Convert STM32 Cube HAL channel to LL channel */
@@ -142,9 +144,9 @@ static void _pwmout_init_direct(pwmout_t *obj, const PinMap *pinmap)
142144
pin_function(pinmap->pin, pinmap->function);
143145
pin_mode(pinmap->pin, PullNone);
144146

145-
obj->period = 0;
146-
obj->pulse = 0;
147-
obj->prescaler = 0;
147+
// Initialize obj with default values (period 550Hz, duty 0%)
148+
_pwmout_obj_period_us(obj, 18000);
149+
obj->pulse = (uint32_t)((float)obj->period * 1.0 + 0.5);
148150

149151
// Initialize the HRTIM structure
150152
HrtimHandle.Instance = HRTIM1;
@@ -444,6 +446,15 @@ float pwmout_read(pwmout_t *obj)
444446
if (obj->period > 0) {
445447
value = (float)(obj->pulse) / (float)(obj->period);
446448
}
449+
450+
if (obj->pwm == PWM_I) {
451+
if (value <= (float)0.0) {
452+
value = 1.0;
453+
} else if (value >= (float)1.0) {
454+
value = 0.0;
455+
}
456+
}
457+
447458
return ((value > (float)1.0) ? (float)(1.0) : (value));
448459
}
449460

@@ -464,24 +475,7 @@ void pwmout_period_us(pwmout_t *obj, int us)
464475
if (obj->pwm == PWM_I) {
465476
float dc = pwmout_read(obj);
466477

467-
uint32_t frequency;
468-
uint32_t clocksource = __HAL_RCC_GET_HRTIM1_SOURCE();
469-
switch (clocksource) {
470-
case RCC_HRTIM1CLK_TIMCLK:
471-
frequency = HAL_RCC_GetHCLKFreq();
472-
break;
473-
case RCC_HRTIM1CLK_CPUCLK:
474-
frequency = HAL_RCC_GetSysClockFreq();
475-
break;
476-
}
477-
478-
/* conversion from us to clock tick */
479-
obj->period = us * (frequency / 1000000) / 4;
480-
obj->prescaler = HRTIM_PRESCALERRATIO_DIV4;
481-
482-
if (obj->period > 0xFFDFU) {
483-
obj->period = 0xFFDFU;
484-
}
478+
_pwmout_obj_period_us(obj, us);
485479

486480
sConfig_time_base.Mode = HRTIM_MODE_CONTINUOUS;
487481
sConfig_time_base.Period = obj->period;
@@ -602,4 +596,27 @@ const PinMap *pwmout_pinmap()
602596
return PinMap_PWM;
603597
}
604598

599+
#if defined(HRTIM1)
600+
void _pwmout_obj_period_us(pwmout_t *obj, int us) {
601+
uint32_t frequency;
602+
uint32_t clocksource = __HAL_RCC_GET_HRTIM1_SOURCE();
603+
switch (clocksource) {
604+
case RCC_HRTIM1CLK_TIMCLK:
605+
frequency = HAL_RCC_GetHCLKFreq();
606+
break;
607+
case RCC_HRTIM1CLK_CPUCLK:
608+
frequency = HAL_RCC_GetSysClockFreq();
609+
break;
610+
}
611+
612+
/* conversion from us to clock tick */
613+
obj->period = us * (frequency / 1000000) / 4;
614+
obj->prescaler = HRTIM_PRESCALERRATIO_DIV4;
615+
616+
if (obj->period > 0xFFDFU) {
617+
obj->period = 0xFFDFU;
618+
}
619+
}
620+
#endif
621+
605622
#endif

0 commit comments

Comments
 (0)