Showing results for 
Search instead for 
Did you mean: 

ThreadX scheduler in low power mode

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 */

  /* USER CODE END  App_ThreadX_LowPower_Enter */

void App_ThreadX_LowPower_Exit(void)
  /* USER CODE BEGIN  App_ThreadX_LowPower_Exit */
  /* 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);

  // 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)
  /* USER CODE END  App_ThreadX_Timer_Setup */



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.