STM32F407ZET6_MRB/Core/Src/user_freertos_support.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();
}
}