From e7c36e9ed7d983babb062e16085330e0a587471c Mon Sep 17 00:00:00 2001 From: Leonardo Cavagnis Date: Wed, 27 Sep 2023 16:32:25 +0200 Subject: [PATCH 1/3] STM32: fix HRTIM pwm corner cases (0-100%) in read function --- targets/TARGET_STM/pwmout_api.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/targets/TARGET_STM/pwmout_api.c b/targets/TARGET_STM/pwmout_api.c index e20ac918a35..dfacdc4f995 100644 --- a/targets/TARGET_STM/pwmout_api.c +++ b/targets/TARGET_STM/pwmout_api.c @@ -444,6 +444,15 @@ float pwmout_read(pwmout_t *obj) if (obj->period > 0) { value = (float)(obj->pulse) / (float)(obj->period); } + + if (obj->pwm == PWM_I) { + if (value <= (float)0.0) { + value = 1.0; + } else if (value >= (float)1.0) { + value = 0.0; + } + } + return ((value > (float)1.0) ? (float)(1.0) : (value)); } From 8dab782432b527b8d0abd490c2cf646969eaab3a Mon Sep 17 00:00:00 2001 From: Leonardo Cavagnis Date: Wed, 27 Sep 2023 16:34:20 +0200 Subject: [PATCH 2/3] STM32: fix HRTIM pwm init with default values --- targets/TARGET_STM/pwmout_api.c | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/targets/TARGET_STM/pwmout_api.c b/targets/TARGET_STM/pwmout_api.c index dfacdc4f995..53e3d890b9b 100644 --- a/targets/TARGET_STM/pwmout_api.c +++ b/targets/TARGET_STM/pwmout_api.c @@ -142,9 +142,23 @@ static void _pwmout_init_direct(pwmout_t *obj, const PinMap *pinmap) pin_function(pinmap->pin, pinmap->function); pin_mode(pinmap->pin, PullNone); - obj->period = 0; - obj->pulse = 0; - obj->prescaler = 0; + // Initialize obj with default values (period 550Hz, duty 0%) + uint32_t frequency; + uint32_t clocksource = __HAL_RCC_GET_HRTIM1_SOURCE(); + switch (clocksource) { + case RCC_HRTIM1CLK_TIMCLK: + frequency = HAL_RCC_GetHCLKFreq(); + break; + case RCC_HRTIM1CLK_CPUCLK: + frequency = HAL_RCC_GetSysClockFreq(); + break; + } + obj->period = 18000 * (frequency / 1000000) / 4; + if (obj->period > 0xFFDFU) { + obj->period = 0xFFDFU; + } + obj->pulse = (uint32_t)((float)obj->period * 1.0 + 0.5); + obj->prescaler = HRTIM_PRESCALERRATIO_DIV4; // Initialize the HRTIM structure HrtimHandle.Instance = HRTIM1; From 57d4c0934d15720f5aa0a572c727c89b2a323a8e Mon Sep 17 00:00:00 2001 From: Leonardo Cavagnis Date: Thu, 28 Sep 2023 13:09:53 +0200 Subject: [PATCH 3/3] STM32: add helper fun to manage pwmout obj period --- targets/TARGET_STM/pwmout_api.c | 60 +++++++++++++++------------------ 1 file changed, 27 insertions(+), 33 deletions(-) diff --git a/targets/TARGET_STM/pwmout_api.c b/targets/TARGET_STM/pwmout_api.c index 53e3d890b9b..71a4839728b 100644 --- a/targets/TARGET_STM/pwmout_api.c +++ b/targets/TARGET_STM/pwmout_api.c @@ -53,6 +53,8 @@ static hrtim_t hrtim_timer; static HRTIM_HandleTypeDef HrtimHandle; static HRTIM_CompareCfgTypeDef sConfig_compare; static HRTIM_TimeBaseCfgTypeDef sConfig_time_base; + +static void _pwmout_obj_period_us(pwmout_t *obj, int us); #endif /* Convert STM32 Cube HAL channel to LL channel */ @@ -143,22 +145,8 @@ static void _pwmout_init_direct(pwmout_t *obj, const PinMap *pinmap) pin_mode(pinmap->pin, PullNone); // Initialize obj with default values (period 550Hz, duty 0%) - uint32_t frequency; - uint32_t clocksource = __HAL_RCC_GET_HRTIM1_SOURCE(); - switch (clocksource) { - case RCC_HRTIM1CLK_TIMCLK: - frequency = HAL_RCC_GetHCLKFreq(); - break; - case RCC_HRTIM1CLK_CPUCLK: - frequency = HAL_RCC_GetSysClockFreq(); - break; - } - obj->period = 18000 * (frequency / 1000000) / 4; - if (obj->period > 0xFFDFU) { - obj->period = 0xFFDFU; - } + _pwmout_obj_period_us(obj, 18000); obj->pulse = (uint32_t)((float)obj->period * 1.0 + 0.5); - obj->prescaler = HRTIM_PRESCALERRATIO_DIV4; // Initialize the HRTIM structure HrtimHandle.Instance = HRTIM1; @@ -487,24 +475,7 @@ void pwmout_period_us(pwmout_t *obj, int us) if (obj->pwm == PWM_I) { float dc = pwmout_read(obj); - uint32_t frequency; - uint32_t clocksource = __HAL_RCC_GET_HRTIM1_SOURCE(); - switch (clocksource) { - case RCC_HRTIM1CLK_TIMCLK: - frequency = HAL_RCC_GetHCLKFreq(); - break; - case RCC_HRTIM1CLK_CPUCLK: - frequency = HAL_RCC_GetSysClockFreq(); - break; - } - - /* conversion from us to clock tick */ - obj->period = us * (frequency / 1000000) / 4; - obj->prescaler = HRTIM_PRESCALERRATIO_DIV4; - - if (obj->period > 0xFFDFU) { - obj->period = 0xFFDFU; - } + _pwmout_obj_period_us(obj, us); sConfig_time_base.Mode = HRTIM_MODE_CONTINUOUS; sConfig_time_base.Period = obj->period; @@ -625,4 +596,27 @@ const PinMap *pwmout_pinmap() return PinMap_PWM; } +#if defined(HRTIM1) +void _pwmout_obj_period_us(pwmout_t *obj, int us) { + uint32_t frequency; + uint32_t clocksource = __HAL_RCC_GET_HRTIM1_SOURCE(); + switch (clocksource) { + case RCC_HRTIM1CLK_TIMCLK: + frequency = HAL_RCC_GetHCLKFreq(); + break; + case RCC_HRTIM1CLK_CPUCLK: + frequency = HAL_RCC_GetSysClockFreq(); + break; + } + + /* conversion from us to clock tick */ + obj->period = us * (frequency / 1000000) / 4; + obj->prescaler = HRTIM_PRESCALERRATIO_DIV4; + + if (obj->period > 0xFFDFU) { + obj->period = 0xFFDFU; + } +} +#endif + #endif