Skip to main content
Associate III
October 7, 2025
Question

LOW power timers in stm32g0

  • October 7, 2025
  • 2 replies
  • 337 views

Hi, 
I am working on STM32G0c1RET6 board and i want to understand the working of low power timer (LPTIM) in stop mode.

i am using the HAL_LPTIM_Counter_Start_IT(&hlptim1, 65534) to enable LPTIM1 and print a value in function  

 
void HAL_LPTIM_AutoReloadMatchCallback(LPTIM_HandleTypeDef *hlptim) {
 if (hlptim->Instance == LPTIM1) {/* If instance called for HEATER DRIVER */
 printf("1\r\n");
 }
}


is it the correct way to print the value. because at some places i have seen using

HAL_LPTIM_TimeOut_Start_IT() function. which one is correct ??


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

2 replies

TDK
Super User
October 7, 2025

HAL_LPTIM_Counter_Start_IT will start the counter and printf, if configured correctly, will print text.

Note that in STOP 0 or STOP 1 mode, the CPU is not running. It will have to wake up to execute code.

"If you feel a post has answered your question, please click ""Accept as Solution""."
Rohit007Author
Associate III
October 8, 2025

@TDK  Thanks for the reply,
i am facing an issue in generating the interrupt in LPTIM1, my observation is that whenever i enable the LPTIM1 using the HAL_LPTIM_Counter_Start_IT(&hlptim1,5112); function, it is not getting enabled and then when i enable the LPTIM2 using the function HAL_LPTIM_Counter_Start_IT(&hlptim2, 65534); it starts interrupt for LPTIM1 as well. 

these are prints i am getting in LPTIM1 interrupt after enabling LPTIM2;
[2025-10-08 11:27:20.711] 1
[2025-10-08 11:27:20.711] 1
[2025-10-08 11:27:20.727] 1
[2025-10-08 11:27:20.743] 1

i have shared the LPTIM1 and LPTIM2 init function with its callback function.

static void MX_LPTIM1_Init(void)
{

 /* USER CODE BEGIN LPTIM1_Init 0 */

 /* USER CODE END LPTIM1_Init 0 */

 /* USER CODE BEGIN LPTIM1_Init 1 */

 /* USER CODE END LPTIM1_Init 1 */
 hlptim1.Instance = LPTIM1;
 hlptim1.Init.Clock.Source = LPTIM_CLOCKSOURCE_APBCLOCK_LPOSC;
 hlptim1.Init.Clock.Prescaler = LPTIM_PRESCALER_DIV128;
 hlptim1.Init.Trigger.Source = LPTIM_TRIGSOURCE_SOFTWARE;
 hlptim1.Init.OutputPolarity = LPTIM_OUTPUTPOLARITY_HIGH;
 hlptim1.Init.UpdateMode = LPTIM_UPDATE_IMMEDIATE;
 hlptim1.Init.CounterSource = LPTIM_COUNTERSOURCE_INTERNAL;
 hlptim1.Init.Input1Source = LPTIM_INPUT1SOURCE_GPIO;
 hlptim1.Init.Input2Source = LPTIM_INPUT2SOURCE_GPIO;
 if (HAL_LPTIM_Init(&hlptim1) != HAL_OK)
 {
 Error_Handler();
 }
 /* USER CODE BEGIN LPTIM1_Init 2 */

 /* USER CODE END LPTIM1_Init 2 */

}

/**
 * @brief LPTIM2 Initialization Function
 * @param None
 * @retval None
 */
static void MX_LPTIM2_Init(void)
{

 /* USER CODE BEGIN LPTIM2_Init 0 */

 /* USER CODE END LPTIM2_Init 0 */

 /* USER CODE BEGIN LPTIM2_Init 1 */

 /* USER CODE END LPTIM2_Init 1 */
 hlptim2.Instance = LPTIM2;
 hlptim2.Init.Clock.Source = LPTIM_CLOCKSOURCE_APBCLOCK_LPOSC;
 hlptim2.Init.Clock.Prescaler = LPTIM_PRESCALER_DIV128;
 hlptim2.Init.Trigger.Source = LPTIM_TRIGSOURCE_SOFTWARE;
 hlptim2.Init.OutputPolarity = LPTIM_OUTPUTPOLARITY_HIGH;
 hlptim2.Init.UpdateMode = LPTIM_UPDATE_IMMEDIATE;
 hlptim2.Init.CounterSource = LPTIM_COUNTERSOURCE_INTERNAL;
 hlptim2.Init.Input1Source = LPTIM_INPUT1SOURCE_GPIO;
 if (HAL_LPTIM_Init(&hlptim2) != HAL_OK)
 {
 Error_Handler();
 }
 /* USER CODE BEGIN LPTIM2_Init 2 */

 /* USER CODE END LPTIM2_Init 2 */

}

 

void HAL_LPTIM_AutoReloadMatchCallback(LPTIM_HandleTypeDef *hlptim) {
 
	if (hlptim->Instance == LPTIM1) {/* If instance called for HEATER DRIVER */
		HAL_GPIO_TogglePin(HEAT_DRIVER_GPIO_Port, HEAT_DRIVER_Pin);
		printf("1\r\n");
	}
	
 if (hlptim->Instance == LPTIM2) {/* If instance called for HEATER DRIVER */
 pan_delay++;
 /* The pan motor power remains enabled for a few milliseconds after stopping to prevent motor sleep. */
 if ( (pan_power_stop == MOTOR_ENABLE) && (pan_s.motor_enable == MOTOR_DISABLE) && (pan_delay > 10) ) {
 pan_power_off();
 refer_adc = true;
 refer_delay = HAL_GetTick();
 pan_drift_s.motor_drift = NULL_PT;
 pan_delay = 0;
 pan_power_stop = 0;
 HAL_LPTIM_Counter_Stop_IT(&hlptim2);
 }

 }

}



TDK
Super User
October 8, 2025

The timers are independent. I suggest creating a minimal working example which shows the issue. Nothing wrong with the code you presented. Likely a bug in the code elsewhere.

"If you feel a post has answered your question, please click ""Accept as Solution""."
Andrew Neil
Super User
October 7, 2025

@Rohit007 wrote:

is it the correct way to print the value


In general, it's not a good idea to be calling printf from an interrupt handler - especially if you have implemented your printf over a slow interface like UART.

 


@Rohit007 wrote:

at some places i have seen using HAL_LPTIM_TimeOut_Start_IT() function


Where have you seen that? Please give a link...

A complex system that works is invariably found to have evolved from a simple system that worked.A complex system designed from scratch never works and cannot be patched up to make it work.
Rohit007Author
Associate III
October 8, 2025

@Andrew Neil Thanks for the reply,

i have asked it on chatgpt and it suggested that 

Incorrect start function

  • HAL_LPTIM_Counter_Start_IT() → triggers compare match interrupt, not auto-reload.

  • HAL_LPTIM_TimeOut_Start_IT() → triggers auto-reload match callback, but requires proper ARR & clock.

  • If you call the wrong start function, callback will never fire.

Andrew Neil
Super User
October 8, 2025

@Rohit007 wrote:

i have asked it on chatgpt and it suggested that 


You always need to verify what so-called "AI" says!

You can check what those functions actually do in the Cube Firmware Pack documentation.

You could also look at the examples in the Pack ...

PS:

See also:

AN4013, Introduction to timers for STM32 MCUs

AN4776, General-purpose timer cookbook for STM32 microcontrollers

https://wiki.st.com/stm32mcu/wiki/Getting_started_with_TIM

A complex system that works is invariably found to have evolved from a simple system that worked.A complex system designed from scratch never works and cannot be patched up to make it work.