I have been trying for some time to put my stm32f4 disc board in sleep mode with freertos and wake it up via an interrupt on my PB9
without success. I would like my stm to go to sleep and wake up only if I have an interrupt on my pin (sleep time can be long).
After research on the internet I guess I have to use the mode tickless
in FreeRTOS. Here is my FreeRTOSConfig.h
#define configUSE_TICKLESS_IDLE 1
#define configEXPECTED_IDLE_TIME_BEFORE_SLEEP 100
#define configTICK_RATE_HZ ((TickType_t)1000)
My EXTI9_5_IRQHandler
work fine I’ve tested it.
void EXTI9_5_IRQHandler(void) {
BaseType_t xHigherPriorityTaskWoken = pdFALSE;
uint32_t current_time = HAL_GetTick();
if (__HAL_GPIO_EXTI_GET_IT(STAT_ALIM_GPIO_PIN) != RESET) {
__HAL_GPIO_EXTI_CLEAR_IT(STAT_ALIM_GPIO_PIN);
if (current_time - last_interrupt_time > 50) {
last_interrupt_time = current_time;
if (HAL_GPIO_ReadPin(GPIOB, STAT_ALIM_GPIO_PIN) == GPIO_PIN_RESET) {
vTaskNotifyGiveFromISR(T_handleStatAlimInterrupt, &xHigherPriorityTaskWoken);
portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
}
}
}
}
My Task
void User_handleStatAlimInterrupt(__unused void const *argument) {
while (1) {
ulTaskNotifyTake(pdTRUE, portMAX_DELAY);
if(HAL_GPIO_ReadPin (STAT_ALIM_GPIO_PORT, STAT_ALIM_GPIO_PIN)) {
vTaskSuspend(task1);
vTaskSuspend(task2);
__HAL_RCC_PWR_CLK_ENABLE();
HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);
vTaskResume(task1);
vTaskResume(task2);
}else{
USER_LOG_INFO("stat alim 0");
}
}
}
And for finish vPortSuppressTicksAndSleep
redefinition
void vPortSuppressTicksAndSleep(TickType_t xExpectedIdleTime) {
__disable_irq();
__DSB();
__ISB();
if (eTaskConfirmSleepModeStatus() == eAbortSleep) {
__enable_irq();
} else {
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
__enable_irq();
}
}
my problem my stm never stays in sleep mode…