Skip to content

Commit fee275d

Browse files
committed
patches: add STM32 HRTIM corner case fix
1 parent 1f6f488 commit fee275d

File tree

1 file changed

+113
-0
lines changed

1 file changed

+113
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
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

Comments
 (0)