cancel
Showing results for 
Search instead for 
Did you mean: 

STM32U5 STOP2 with FreeRTOS

caiChangKun
Associate II

What should I pay attention to when I use stm32u5 FreeRtos stop2,
W
hen exiting stop2, do the relevant i2c spi adc uart peripherals need to be reinitialized?
Is the value retained?
Is there a routine for FreeRtos stop2?

void Bsp_PowerManage_enter_stop_mode(void)
{
if ((device_state_info.stimulate_state) || (device_state_info.device_ota)) {
return;
}
osKernelLock(); /
while (__HAL_UART_GET_FLAG(&hlpuart1, USART_ISR_BUSY));
while (__HAL_UART_GET_FLAG(&hlpuart1, USART_ISR_REACK) == RESET);
__HAL_RCC_LPUART1_CLKAM_ENABLE();
__HAL_RCC_LPTIM1_CLKAM_ENABLE();
HAL_UARTEx_EnableStopMode(&hlpuart1);
device_lowpower_state.stop_mode_state = 1;
HAL_SuspendTick(); // 
#if Bsp_IWDG
if (HAL_LPTIM_TimeOut_Start_IT(&hlptim1, 61438) != HAL_OK)
{
Error_Handler();
}
#endif
HAL_PWREx_EnterSTOP2Mode(PWR_STOPENTRY_WFI);
SystemClock_Config();
HAL_InitTick(TICK_INT_PRIORITY)

if (!__HAL_PWR_GET_FLAG(PWR_FLAG_STOPF)) Error_Handler();
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_STOPF);
if (__HAL_PWR_GET_FLAG(PWR_FLAG_STOPF)) Error_Handler();


#if Bsp_IWDG
HAL_LPTIM_TimeOut_Stop_IT(&hlptim1);
#endif
HAL_UARTEx_DisableStopMode(&hlpuart1);
HAL_UARTEx_ReceiveToIdle_IT(&hlpuart1, uart_recv_data.buf, 512);
device_lowpower_state.stop_mode_state = 0;
osKernelUnlock();
Function_Open_PowerManageTimer();// Open FreeRtos TIME

}

Edited to apply source code formatting - please see How to insert source code for future reference.

2 REPLIES 2
Saket_Om
ST Employee

Hello @caiChangKun 

Several peripheral support the autonomous mode and can run in STOP mode without CPU wakeup. Please refer to the reference manual

Saket_Om_1-1754992862003.png

So you don't need to reinitialize these peripheral. 

Below is typical sequence for entering and exiting STOP2 with FreeRTOS:

void Enter_Stop2_Mode(void)
{
    // 1. Prepare peripherals (stop ongoing transfers, etc.)
    // 2. Lock the RTOS kernel
    osKernelLock();

    // 3. Suspend SysTick
    HAL_SuspendTick();

    // 4. Enter STOP2 mode
    HAL_PWREx_EnterSTOP2Mode(PWR_STOPENTRY_WFI);

    // 5. Upon wakeup, reconfigure system clock
    SystemClock_Config();

    // 6. Resume SysTick
    HAL_ResumeTick();

    // 8. Unlock the RTOS kernel
    osKernelUnlock();
}

 

To give better visibility on the answered topics, please click on "Accept as Solution" on the reply which solved your issue or answered your question.
Saket_Om
Saket_Om
ST Employee

Hello @caiChangKun 

Any update on this thread please? 

To give better visibility on the answered topics, please click on "Accept as Solution" on the reply which solved your issue or answered your question.
Saket_Om