Skip to content

Commit baada0e

Browse files
authored
Merge pull request #8242 from jeromecoutant/PR_STM32_LPTICKER
STM32 LPTICKER : Fix tickless and LPTICKER_DELAY_TICKS
2 parents 0b1bc87 + af4841d commit baada0e

File tree

3 files changed

+21
-146
lines changed

3 files changed

+21
-146
lines changed

targets/TARGET_STM/lp_ticker.c

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -145,9 +145,6 @@ void lp_ticker_init(void)
145145

146146
__HAL_LPTIM_ENABLE_IT(&LptimHandle, LPTIM_IT_CMPM);
147147
HAL_LPTIM_Counter_Start(&LptimHandle, 0xFFFF);
148-
149-
/* Need to write a compare value in order to get LPTIM_FLAG_CMPOK in set_interrupt */
150-
__HAL_LPTIM_COMPARE_SET(&LptimHandle, 0);
151148
}
152149

153150
static void LPTIM1_IRQHandler(void)
@@ -194,21 +191,22 @@ void lp_ticker_set_interrupt(timestamp_t timestamp)
194191
LptimHandle.Instance = LPTIM1;
195192
irq_handler = (void (*)(void))lp_ticker_irq_handler;
196193

194+
__HAL_LPTIM_CLEAR_FLAG(&LptimHandle, LPTIM_FLAG_CMPOK);
195+
__HAL_LPTIM_COMPARE_SET(&LptimHandle, timestamp);
197196
/* CMPOK is set by hardware to inform application that the APB bus write operation to the LPTIM_CMP register has been successfully completed */
198197
/* Any successive write before the CMPOK flag be set, will lead to unpredictable results */
199198
while (__HAL_LPTIM_GET_FLAG(&LptimHandle, LPTIM_FLAG_CMPOK) == RESET) {
200199
}
201200

202-
__HAL_LPTIM_CLEAR_FLAG(&LptimHandle, LPTIM_FLAG_CMPOK);
203-
__HAL_LPTIM_CLEAR_FLAG(&LptimHandle, LPTIM_FLAG_CMPM);
204-
__HAL_LPTIM_COMPARE_SET(&LptimHandle, timestamp);
201+
lp_ticker_clear_interrupt();
205202

206203
NVIC_EnableIRQ(LPTIM1_IRQn);
207204
}
208205

209206
void lp_ticker_fire_interrupt(void)
210207
{
211208
lp_Fired = 1;
209+
irq_handler = (void (*)(void))lp_ticker_irq_handler;
212210
NVIC_SetPendingIRQ(LPTIM1_IRQn);
213211
NVIC_EnableIRQ(LPTIM1_IRQn);
214212
}
@@ -217,9 +215,6 @@ void lp_ticker_disable_interrupt(void)
217215
{
218216
NVIC_DisableIRQ(LPTIM1_IRQn);
219217
LptimHandle.Instance = LPTIM1;
220-
/* Waiting last write operation completion */
221-
while (__HAL_LPTIM_GET_FLAG(&LptimHandle, LPTIM_FLAG_CMPOK) == RESET) {
222-
}
223218
}
224219

225220
void lp_ticker_clear_interrupt(void)
@@ -263,7 +258,6 @@ uint32_t lp_ticker_read(void)
263258

264259
void lp_ticker_set_interrupt(timestamp_t timestamp)
265260
{
266-
lp_ticker_disable_interrupt();
267261
rtc_set_wake_up_timer(timestamp);
268262
}
269263

targets/TARGET_STM/rtc_api.c

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -381,6 +381,7 @@ void rtc_set_wake_up_timer(timestamp_t timestamp)
381381
}
382382

383383
RtcHandle.Instance = RTC;
384+
HAL_RTCEx_DeactivateWakeUpTimer(&RtcHandle);
384385
if (HAL_RTCEx_SetWakeUpTimer_IT(&RtcHandle, WakeUpCounter, RTC_WAKEUPCLOCK_RTCCLK_DIV4) != HAL_OK) {
385386
error("rtc_set_wake_up_timer init error\n");
386387
}
@@ -402,10 +403,7 @@ void rtc_fire_interrupt(void)
402403
void rtc_deactivate_wake_up_timer(void)
403404
{
404405
RtcHandle.Instance = RTC;
405-
__HAL_RTC_WRITEPROTECTION_DISABLE(&RtcHandle);
406-
__HAL_RTC_WAKEUPTIMER_DISABLE(&RtcHandle);
407-
__HAL_RTC_WAKEUPTIMER_DISABLE_IT(&RtcHandle, RTC_IT_WUT);
408-
__HAL_RTC_WRITEPROTECTION_ENABLE(&RtcHandle);
406+
HAL_RTCEx_DeactivateWakeUpTimer(&RtcHandle);
409407
NVIC_DisableIRQ(RTC_WKUP_IRQn);
410408
}
411409

0 commit comments

Comments
 (0)