cancel
Showing results for 
Search instead for 
Did you mean: 

ThreadX scheduler in low power mode

paolog
Associate III

Hi everyone.

I'm currently testing low power modes in ThreadX on a NUCLEO-F767ZI board using CubeMX and CubeIDE (current versions).

ThreadX tick period is set to 1 ms, and low power is enabled. What happens is that the scheduler awakes every millisecond even if HAL_SuspendTick() is called (seems because ThreadX SysTick_Handler remains active).

Shouldn't the scheduler be suspended for some milliseconds until next timer should be ready to run (or an interrupt would fire)? If this is correct a timeout timer seems to be not necessary. Is this due to the faster ThreadX tick?

This is the partial code:

 

 

void App_ThreadX_LowPower_Enter(void) { /* USER CODE BEGIN App_ThreadX_LowPower_Enter */ HAL_SuspendTick(); HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI); /* USER CODE END App_ThreadX_LowPower_Enter */ } void App_ThreadX_LowPower_Exit(void) { /* USER CODE BEGIN App_ThreadX_LowPower_Exit */ HAL_ResumeTick(); /* USER CODE END App_ThreadX_LowPower_Exit */ } ULONG App_ThreadX_TimerAdjust(void) { /* USER CODE BEGIN App_ThreadX_TimerAdjust */ uint32_t tmp1; tmp1 = __HAL_TIM_GET_COUNTER(&htim13); HAL_TIM_Base_Stop(&htim13); // Convert to system ticks, always returns 0 as timer is stopped in 1 ms return tmp1 / 1000; /* USER CODE END App_ThreadX_TimerAdjust */ } void App_ThreadX_Timer_Setup(ULONG count) { /* USER CODE BEGIN App_ThreadX_Timer_Setup */ uint16_t timeout; timeout = (count * 1000 / TX_TIMER_TICKS_PER_SECOND); __HAL_TIM_SET_COUNTER(&htim13, 0); htim13.Instance->ARR = timeout * 1000 - 1; if (HAL_TIM_Base_Start(&htim13) != HAL_OK) { Error_Handler(); } /* USER CODE END App_ThreadX_Timer_Setup */ }
View more

 

 

Also, in order to reduce power consumption in sleep mode, is it correct to call __HAL_RCC_xxx_CLK_SLEEP_DISABLE once for the peripherals not needed in sleep mode?

Thank you for your comments.

 

2 REPLIES 2
rdot
Associate

@paolog Did you ever get an answer to this? I have the same questions on a STM32U5 project.

paolog
Associate III

@rdot unfortunately not. So I decided to abandon ThreadX as no support is available. I moved to FreeRTOS (considering adopting SafeRTOS at a later project stage) as there's a lot more information available, as well examples.