Skip to content

Commit f9ddc5a

Browse files
committed
STM32 LPTICKER with LPTIM optimisation
1 parent 1ac4d9b commit f9ddc5a

File tree

2 files changed

+31
-4
lines changed

2 files changed

+31
-4
lines changed

targets/TARGET_STM/lp_ticker.c

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,10 @@
3838
#include "lp_ticker_api.h"
3939
#include "mbed_error.h"
4040

41+
#if !defined(LPTICKER_DELAY_TICKS) || (LPTICKER_DELAY_TICKS < 3)
42+
#warning "lpticker_delay_ticks value should be set to 3"
43+
#endif
44+
4145
LPTIM_HandleTypeDef LptimHandle;
4246

4347
const ticker_info_t *lp_ticker_get_info()
@@ -145,6 +149,12 @@ void lp_ticker_init(void)
145149

146150
__HAL_LPTIM_ENABLE_IT(&LptimHandle, LPTIM_IT_CMPM);
147151
HAL_LPTIM_Counter_Start(&LptimHandle, 0xFFFF);
152+
153+
/* Need to write a compare value in order to get LPTIM_FLAG_CMPOK in set_interrupt */
154+
__HAL_LPTIM_CLEAR_FLAG(&LptimHandle, LPTIM_FLAG_CMPOK);
155+
__HAL_LPTIM_COMPARE_SET(&LptimHandle, 0);
156+
while (__HAL_LPTIM_GET_FLAG(&LptimHandle, LPTIM_FLAG_CMPOK) == RESET) {
157+
}
148158
}
149159

150160
static void LPTIM1_IRQHandler(void)
@@ -191,12 +201,12 @@ void lp_ticker_set_interrupt(timestamp_t timestamp)
191201
LptimHandle.Instance = LPTIM1;
192202
irq_handler = (void (*)(void))lp_ticker_irq_handler;
193203

194-
__HAL_LPTIM_CLEAR_FLAG(&LptimHandle, LPTIM_FLAG_CMPOK);
195-
__HAL_LPTIM_COMPARE_SET(&LptimHandle, timestamp);
196204
/* CMPOK is set by hardware to inform application that the APB bus write operation to the LPTIM_CMP register has been successfully completed */
197205
/* Any successive write before the CMPOK flag be set, will lead to unpredictable results */
198-
while (__HAL_LPTIM_GET_FLAG(&LptimHandle, LPTIM_FLAG_CMPOK) == RESET) {
199-
}
206+
/* LPTICKER_DELAY_TICKS value prevents OS to call this set interrupt function before CMPOK */
207+
MBED_ASSERT(__HAL_LPTIM_GET_FLAG(&LptimHandle, LPTIM_FLAG_CMPOK) == SET);
208+
__HAL_LPTIM_CLEAR_FLAG(&LptimHandle, LPTIM_FLAG_CMPOK);
209+
__HAL_LPTIM_COMPARE_SET(&LptimHandle, timestamp);
200210

201211
lp_ticker_clear_interrupt();
202212

targets/targets.json

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2233,6 +2233,7 @@
22332233
"value": 1
22342234
}
22352235
},
2236+
"overrides": { "lpticker_delay_ticks": 3 },
22362237
"detect_code": ["0744"],
22372238
"device_has_add": [
22382239
"ANALOGOUT",
@@ -2395,6 +2396,7 @@
23952396
"value": 1
23962397
}
23972398
},
2399+
"overrides": { "lpticker_delay_ticks": 3 },
23982400
"detect_code": ["0743"],
23992401
"macros_add": ["USB_STM_HAL", "USBHOST_OTHER"],
24002402
"device_has_add": [
@@ -2431,6 +2433,7 @@
24312433
"value": 1
24322434
}
24332435
},
2436+
"overrides": { "lpticker_delay_ticks": 3 },
24342437
"detect_code": ["0743"],
24352438
"macros_add": ["USB_STM_HAL", "USBHOST_OTHER"],
24362439
"device_has_add": [
@@ -2646,6 +2649,7 @@
26462649
"value": 1
26472650
}
26482651
},
2652+
"overrides": { "lpticker_delay_ticks": 3 },
26492653
"macros_add": ["USBHOST_OTHER"],
26502654
"supported_form_factors": ["ARDUINO"],
26512655
"detect_code": ["0816"],
@@ -2691,6 +2695,7 @@
26912695
"value": 1
26922696
}
26932697
},
2698+
"overrides": { "lpticker_delay_ticks": 3 },
26942699
"macros_add": [
26952700
"TRANSACTION_QUEUE_SIZE_SPI=2",
26962701
"USBHOST_OTHER",
@@ -2743,6 +2748,7 @@
27432748
"value": 1
27442749
}
27452750
},
2751+
"overrides": { "lpticker_delay_ticks": 3 },
27462752
"supported_form_factors": ["ARDUINO"],
27472753
"macros_add": ["USBHOST_OTHER"],
27482754
"detect_code": ["0818"],
@@ -2902,6 +2908,7 @@
29022908
"value": 1
29032909
}
29042910
},
2911+
"overrides": { "lpticker_delay_ticks": 3 },
29052912
"detect_code": ["0770"],
29062913
"device_has_add": [
29072914
"ANALOGOUT",
@@ -2932,6 +2939,7 @@
29322939
"value": 1
29332940
}
29342941
},
2942+
"overrides": { "lpticker_delay_ticks": 3 },
29352943
"detect_code": ["0779"],
29362944
"device_has_add": [
29372945
"ANALOGOUT",
@@ -2990,6 +2998,7 @@
29902998
"value": 1
29912999
}
29923000
},
3001+
"overrides": { "lpticker_delay_ticks": 3 },
29933002
"detect_code": ["0765"],
29943003
"macros_add": ["USBHOST_OTHER", "TWO_RAM_REGIONS"],
29953004
"device_has_add": [
@@ -3047,6 +3056,7 @@
30473056
"value": 1
30483057
}
30493058
},
3059+
"overrides": { "lpticker_delay_ticks": 3 },
30503060
"detect_code": ["0827"],
30513061
"macros_add": [
30523062
"USBHOST_OTHER",
@@ -3433,6 +3443,7 @@
34333443
"value": 1
34343444
}
34353445
},
3446+
"overrides": { "lpticker_delay_ticks": 3 },
34363447
"detect_code": ["0815"],
34373448
"macros_add": ["USB_STM_HAL", "USBHOST_OTHER"],
34383449
"device_has_add": [
@@ -3476,6 +3487,7 @@
34763487
"value": 1
34773488
}
34783489
},
3490+
"overrides": { "lpticker_delay_ticks": 3 },
34793491
"detect_code": ["0817"],
34803492
"macros_add": ["USB_STM_HAL", "USBHOST_OTHER"],
34813493
"device_has_add": [
@@ -3509,6 +3521,7 @@
35093521
"value": 1
35103522
}
35113523
},
3524+
"overrides": { "lpticker_delay_ticks": 3 },
35123525
"supported_form_factors": ["ARDUINO"],
35133526
"detect_code": ["0764"],
35143527
"macros_add": ["USBHOST_OTHER", "TWO_RAM_REGIONS"],
@@ -3540,6 +3553,7 @@
35403553
"value": 1
35413554
}
35423555
},
3556+
"overrides": { "lpticker_delay_ticks": 3 },
35433557
"detect_code": ["0820"],
35443558
"macros_add": ["USBHOST_OTHER", "TWO_RAM_REGIONS"],
35453559
"device_has_add": [
@@ -6844,6 +6858,7 @@
68446858
"value": 1
68456859
}
68466860
},
6861+
"overrides": { "lpticker_delay_ticks": 3 },
68476862
"detect_code": ["0822"],
68486863
"device_has_add": [
68496864
"ANALOGOUT",
@@ -6874,6 +6889,7 @@
68746889
"value": 1
68756890
}
68766891
},
6892+
"overrides": { "lpticker_delay_ticks": 3 },
68776893
"detect_code": ["0823"],
68786894
"device_has_add": [
68796895
"ANALOGOUT",
@@ -6908,6 +6924,7 @@
69086924
"value": 1
69096925
}
69106926
},
6927+
"overrides": { "lpticker_delay_ticks": 3 },
69116928
"detect_code": ["0776"],
69126929
"device_has_add": [
69136930
"ANALOGOUT",

0 commit comments

Comments
 (0)