41 lines
931 B
C
41 lines
931 B
C
#include "FreeRTOS.h"
|
|
#include "task.h"
|
|
|
|
#include "stm32f4xx_hal.h"
|
|
|
|
#include "user_power_mgmt.h"
|
|
|
|
static void pre_enter_lpm(void) {
|
|
// FreeRTOS tick uses SysTick timer, disable it.
|
|
SysTick->CTRL &= ~SysTick_CTRL_TICKINT_Msk;
|
|
|
|
// HAL SysTick uses TIM6, disable TIM6 interrupt.
|
|
HAL_SuspendTick();
|
|
|
|
__disable_irq();
|
|
__DSB();
|
|
__ISB();
|
|
}
|
|
|
|
static void post_enter_lpm(void) {
|
|
__enable_irq();
|
|
__DSB();
|
|
__ISB();
|
|
|
|
HAL_ResumeTick();
|
|
SysTick->CTRL |= SysTick_CTRL_TICKINT_Msk;
|
|
}
|
|
|
|
void vApplicationSleep(uint32_t xExpectedIdleTime) {
|
|
pre_enter_lpm();
|
|
eSleepModeStatus eSleepStatus = eTaskConfirmSleepModeStatus();
|
|
if(eSleepStatus == eAbortSleep) {
|
|
// Do nothing, just return.
|
|
post_enter_lpm();
|
|
}
|
|
else {
|
|
uint32_t actual_ms = user_pm_idle_timeout(xExpectedIdleTime / portTICK_RATE_MS);
|
|
vTaskStepTick(actual_ms);
|
|
post_enter_lpm();
|
|
}
|
|
} |