|
| 1 | +From 3636262ae786ae623451985dd40c7a54c40b9ab1 Mon Sep 17 00:00:00 2001 |
| 2 | +From: Leonardo Cavagnis < [email protected]> |
| 3 | +Date: Fri, 29 Sep 2023 10:06:55 +0200 |
| 4 | +Subject: [PATCH] STM32: fix HRTIM pwm init and corner case (#31) |
| 5 | + |
| 6 | +* STM32: fix HRTIM pwm corner cases (0-100%) in read function |
| 7 | + |
| 8 | +* STM32: fix HRTIM pwm init with default values |
| 9 | + |
| 10 | +* STM32: add helper fun to manage pwmout obj period |
| 11 | +--- |
| 12 | + targets/TARGET_STM/pwmout_api.c | 59 +++++++++++++++++++++------------ |
| 13 | + 1 file changed, 38 insertions(+), 21 deletions(-) |
| 14 | + |
| 15 | +diff --git a/targets/TARGET_STM/pwmout_api.c b/targets/TARGET_STM/pwmout_api.c |
| 16 | +index e20ac918a3..71a4839728 100644 |
| 17 | +--- a/targets/TARGET_STM/pwmout_api.c |
| 18 | ++++ b/targets/TARGET_STM/pwmout_api.c |
| 19 | +@@ -53,6 +53,8 @@ static hrtim_t hrtim_timer; |
| 20 | + static HRTIM_HandleTypeDef HrtimHandle; |
| 21 | + static HRTIM_CompareCfgTypeDef sConfig_compare; |
| 22 | + static HRTIM_TimeBaseCfgTypeDef sConfig_time_base; |
| 23 | ++ |
| 24 | ++static void _pwmout_obj_period_us(pwmout_t *obj, int us); |
| 25 | + #endif |
| 26 | + |
| 27 | + /* Convert STM32 Cube HAL channel to LL channel */ |
| 28 | +@@ -142,9 +144,9 @@ static void _pwmout_init_direct(pwmout_t *obj, const PinMap *pinmap) |
| 29 | + pin_function(pinmap->pin, pinmap->function); |
| 30 | + pin_mode(pinmap->pin, PullNone); |
| 31 | + |
| 32 | +- obj->period = 0; |
| 33 | +- obj->pulse = 0; |
| 34 | +- obj->prescaler = 0; |
| 35 | ++ // Initialize obj with default values (period 550Hz, duty 0%) |
| 36 | ++ _pwmout_obj_period_us(obj, 18000); |
| 37 | ++ obj->pulse = (uint32_t)((float)obj->period * 1.0 + 0.5); |
| 38 | + |
| 39 | + // Initialize the HRTIM structure |
| 40 | + HrtimHandle.Instance = HRTIM1; |
| 41 | +@@ -444,6 +446,15 @@ float pwmout_read(pwmout_t *obj) |
| 42 | + if (obj->period > 0) { |
| 43 | + value = (float)(obj->pulse) / (float)(obj->period); |
| 44 | + } |
| 45 | ++ |
| 46 | ++ if (obj->pwm == PWM_I) { |
| 47 | ++ if (value <= (float)0.0) { |
| 48 | ++ value = 1.0; |
| 49 | ++ } else if (value >= (float)1.0) { |
| 50 | ++ value = 0.0; |
| 51 | ++ } |
| 52 | ++ } |
| 53 | ++ |
| 54 | + return ((value > (float)1.0) ? (float)(1.0) : (value)); |
| 55 | + } |
| 56 | + |
| 57 | +@@ -464,24 +475,7 @@ void pwmout_period_us(pwmout_t *obj, int us) |
| 58 | + if (obj->pwm == PWM_I) { |
| 59 | + float dc = pwmout_read(obj); |
| 60 | + |
| 61 | +- uint32_t frequency; |
| 62 | +- uint32_t clocksource = __HAL_RCC_GET_HRTIM1_SOURCE(); |
| 63 | +- switch (clocksource) { |
| 64 | +- case RCC_HRTIM1CLK_TIMCLK: |
| 65 | +- frequency = HAL_RCC_GetHCLKFreq(); |
| 66 | +- break; |
| 67 | +- case RCC_HRTIM1CLK_CPUCLK: |
| 68 | +- frequency = HAL_RCC_GetSysClockFreq(); |
| 69 | +- break; |
| 70 | +- } |
| 71 | +- |
| 72 | +- /* conversion from us to clock tick */ |
| 73 | +- obj->period = us * (frequency / 1000000) / 4; |
| 74 | +- obj->prescaler = HRTIM_PRESCALERRATIO_DIV4; |
| 75 | +- |
| 76 | +- if (obj->period > 0xFFDFU) { |
| 77 | +- obj->period = 0xFFDFU; |
| 78 | +- } |
| 79 | ++ _pwmout_obj_period_us(obj, us); |
| 80 | + |
| 81 | + sConfig_time_base.Mode = HRTIM_MODE_CONTINUOUS; |
| 82 | + sConfig_time_base.Period = obj->period; |
| 83 | +@@ -602,4 +596,27 @@ const PinMap *pwmout_pinmap() |
| 84 | + return PinMap_PWM; |
| 85 | + } |
| 86 | + |
| 87 | ++#if defined(HRTIM1) |
| 88 | ++void _pwmout_obj_period_us(pwmout_t *obj, int us) { |
| 89 | ++ uint32_t frequency; |
| 90 | ++ uint32_t clocksource = __HAL_RCC_GET_HRTIM1_SOURCE(); |
| 91 | ++ switch (clocksource) { |
| 92 | ++ case RCC_HRTIM1CLK_TIMCLK: |
| 93 | ++ frequency = HAL_RCC_GetHCLKFreq(); |
| 94 | ++ break; |
| 95 | ++ case RCC_HRTIM1CLK_CPUCLK: |
| 96 | ++ frequency = HAL_RCC_GetSysClockFreq(); |
| 97 | ++ break; |
| 98 | ++ } |
| 99 | ++ |
| 100 | ++ /* conversion from us to clock tick */ |
| 101 | ++ obj->period = us * (frequency / 1000000) / 4; |
| 102 | ++ obj->prescaler = HRTIM_PRESCALERRATIO_DIV4; |
| 103 | ++ |
| 104 | ++ if (obj->period > 0xFFDFU) { |
| 105 | ++ obj->period = 0xFFDFU; |
| 106 | ++ } |
| 107 | ++} |
| 108 | ++#endif |
| 109 | ++ |
| 110 | + #endif |
| 111 | +-- |
| 112 | +2.42.0 |
| 113 | + |
0 commit comments