Skip to content

Commit fa858a5

Browse files
authored
Merge pull request #8771 from jeromecoutant/PR_LPTICKER_LPTIM
STM32 LPTICKER with LPTIM optimisation
2 parents eee6401 + f9ddc5a commit fa858a5

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()
@@ -155,6 +159,12 @@ void lp_ticker_init(void)
155159

156160
__HAL_LPTIM_ENABLE_IT(&LptimHandle, LPTIM_IT_CMPM);
157161
HAL_LPTIM_Counter_Start(&LptimHandle, 0xFFFF);
162+
163+
/* Need to write a compare value in order to get LPTIM_FLAG_CMPOK in set_interrupt */
164+
__HAL_LPTIM_CLEAR_FLAG(&LptimHandle, LPTIM_FLAG_CMPOK);
165+
__HAL_LPTIM_COMPARE_SET(&LptimHandle, 0);
166+
while (__HAL_LPTIM_GET_FLAG(&LptimHandle, LPTIM_FLAG_CMPOK) == RESET) {
167+
}
158168
}
159169

160170
static void LPTIM1_IRQHandler(void)
@@ -201,12 +211,12 @@ void lp_ticker_set_interrupt(timestamp_t timestamp)
201211
LptimHandle.Instance = LPTIM1;
202212
irq_handler = (void (*)(void))lp_ticker_irq_handler;
203213

204-
__HAL_LPTIM_CLEAR_FLAG(&LptimHandle, LPTIM_FLAG_CMPOK);
205-
__HAL_LPTIM_COMPARE_SET(&LptimHandle, timestamp);
206214
/* CMPOK is set by hardware to inform application that the APB bus write operation to the LPTIM_CMP register has been successfully completed */
207215
/* Any successive write before the CMPOK flag be set, will lead to unpredictable results */
208-
while (__HAL_LPTIM_GET_FLAG(&LptimHandle, LPTIM_FLAG_CMPOK) == RESET) {
209-
}
216+
/* LPTICKER_DELAY_TICKS value prevents OS to call this set interrupt function before CMPOK */
217+
MBED_ASSERT(__HAL_LPTIM_GET_FLAG(&LptimHandle, LPTIM_FLAG_CMPOK) == SET);
218+
__HAL_LPTIM_CLEAR_FLAG(&LptimHandle, LPTIM_FLAG_CMPOK);
219+
__HAL_LPTIM_COMPARE_SET(&LptimHandle, timestamp);
210220

211221
lp_ticker_clear_interrupt();
212222

targets/targets.json

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2338,6 +2338,7 @@
23382338
"value": 1
23392339
}
23402340
},
2341+
"overrides": { "lpticker_delay_ticks": 3 },
23412342
"detect_code": ["0744"],
23422343
"device_has_add": [
23432344
"ANALOGOUT",
@@ -2509,6 +2510,7 @@
25092510
"value": 1
25102511
}
25112512
},
2513+
"overrides": { "lpticker_delay_ticks": 3 },
25122514
"detect_code": ["0743"],
25132515
"macros_add": ["USB_STM_HAL", "USBHOST_OTHER"],
25142516
"device_has_add": [
@@ -2546,6 +2548,7 @@
25462548
"value": 1
25472549
}
25482550
},
2551+
"overrides": { "lpticker_delay_ticks": 3 },
25492552
"detect_code": ["0743"],
25502553
"macros_add": ["USB_STM_HAL", "USBHOST_OTHER"],
25512554
"device_has_add": [
@@ -2767,6 +2770,7 @@
27672770
"value": 1
27682771
}
27692772
},
2773+
"overrides": { "lpticker_delay_ticks": 3 },
27702774
"macros_add": ["USBHOST_OTHER"],
27712775
"supported_form_factors": ["ARDUINO"],
27722776
"detect_code": ["0816"],
@@ -2813,6 +2817,7 @@
28132817
"value": 1
28142818
}
28152819
},
2820+
"overrides": { "lpticker_delay_ticks": 3 },
28162821
"macros_add": [
28172822
"TRANSACTION_QUEUE_SIZE_SPI=2",
28182823
"USBHOST_OTHER",
@@ -2866,6 +2871,7 @@
28662871
"value": 1
28672872
}
28682873
},
2874+
"overrides": { "lpticker_delay_ticks": 3 },
28692875
"supported_form_factors": ["ARDUINO"],
28702876
"macros_add": ["USBHOST_OTHER"],
28712877
"detect_code": ["0818"],
@@ -3034,6 +3040,7 @@
30343040
"value": 1
30353041
}
30363042
},
3043+
"overrides": { "lpticker_delay_ticks": 3 },
30373044
"detect_code": ["0770"],
30383045
"device_has_add": [
30393046
"ANALOGOUT",
@@ -3065,6 +3072,7 @@
30653072
"value": 1
30663073
}
30673074
},
3075+
"overrides": { "lpticker_delay_ticks": 3 },
30683076
"detect_code": ["0779"],
30693077
"device_has_add": [
30703078
"ANALOGOUT",
@@ -3125,6 +3133,7 @@
31253133
"value": 1
31263134
}
31273135
},
3136+
"overrides": { "lpticker_delay_ticks": 3 },
31283137
"detect_code": ["0765"],
31293138
"macros_add": ["USBHOST_OTHER", "TWO_RAM_REGIONS"],
31303139
"device_has_add": [
@@ -3184,6 +3193,7 @@
31843193
"value": 1
31853194
}
31863195
},
3196+
"overrides": { "lpticker_delay_ticks": 3 },
31873197
"detect_code": ["0827"],
31883198
"macros_add": [
31893199
"USBHOST_OTHER",
@@ -3617,6 +3627,7 @@
36173627
"value": 1
36183628
}
36193629
},
3630+
"overrides": { "lpticker_delay_ticks": 3 },
36203631
"detect_code": ["0815"],
36213632
"macros_add": ["USB_STM_HAL", "USBHOST_OTHER"],
36223633
"device_has_add": [
@@ -3662,6 +3673,7 @@
36623673
"value": 1
36633674
}
36643675
},
3676+
"overrides": { "lpticker_delay_ticks": 3 },
36653677
"detect_code": ["0817"],
36663678
"macros_add": ["USB_STM_HAL", "USBHOST_OTHER"],
36673679
"device_has_add": [
@@ -3696,6 +3708,7 @@
36963708
"value": 1
36973709
}
36983710
},
3711+
"overrides": { "lpticker_delay_ticks": 3 },
36993712
"supported_form_factors": ["ARDUINO"],
37003713
"detect_code": ["0764"],
37013714
"macros_add": ["USBHOST_OTHER", "TWO_RAM_REGIONS"],
@@ -3728,6 +3741,7 @@
37283741
"value": 1
37293742
}
37303743
},
3744+
"overrides": { "lpticker_delay_ticks": 3 },
37313745
"detect_code": ["0820"],
37323746
"macros_add": ["USBHOST_OTHER", "TWO_RAM_REGIONS"],
37333747
"device_has_add": [
@@ -7089,6 +7103,7 @@
70897103
"value": 1
70907104
}
70917105
},
7106+
"overrides": { "lpticker_delay_ticks": 3 },
70927107
"detect_code": ["0822"],
70937108
"device_has_add": [
70947109
"ANALOGOUT",
@@ -7120,6 +7135,7 @@
71207135
"value": 1
71217136
}
71227137
},
7138+
"overrides": { "lpticker_delay_ticks": 3 },
71237139
"detect_code": ["0823"],
71247140
"device_has_add": [
71257141
"ANALOGOUT",
@@ -7155,6 +7171,7 @@
71557171
"value": 1
71567172
}
71577173
},
7174+
"overrides": { "lpticker_delay_ticks": 3 },
71587175
"detect_code": ["0776"],
71597176
"device_has_add": [
71607177
"ANALOGOUT",

0 commit comments

Comments
 (0)