Skip to main content
Explorer II
August 10, 2024
Question

General info on Clock and Timers

  • August 10, 2024
  • 2 replies
  • 909 views

Hi!

I am new to Microcontrollers so the question could be not really exciting but I think it could help me to understand how clock and timers work.

 

 I want to toggle the LD2 every 1 sec through a TIMER.

 

I have set up the SysClock at 2MHz and a TIMER running at 1KHz counting 1 sec, through pre-scaler(2000) and the Auto-reloded register (1000).

 

I have started the timer before the while(1) loop and I want to toggle the LED2 every 1 sec in the loop so I have used the following code lines. It seems to not working correctly. Why ? Maybe because the while condition is not performed at every clock tick, right ?

 

 

-------------------------- CODE------------------

HAL_TIM_Base_Start(&htim2);

while (1)

{

while(__HAL_TIM_GET_COUNTER(&htim2) == 0 ) HAL_GPIO_TogglePin(LD2_GPIO_Port, LD2_Pin);

/* USER CODE END WHILE */

/* USER CODE BEGIN 3 */

}

/* USER CODE END 3 */

}

-------------------------------------------------------

 

Every suggestion will be appreciated!

 

Thank a lot.

 

 

 

    This topic has been closed for replies.

    2 replies

    Super User
    August 10, 2024

    > while(__HAL_TIM_GET_COUNTER(&htim2) == 0 ) HAL_GPIO_TogglePin(LD2_GPIO_Port, LD2_Pin);

    As TIMx_PSC is set to 2000, it takes 2000 system clocks to increment TIMx_CNT by one. One iteration of the above cycle may take say around 10-100 cycles (depending on level of optimization you are using), so the processor will "see" TIMx_CNT == 0 during several iterations of that cycle, i.e. it will very rapidly toggle the pin 200..20 times.

    Instead of checking TIMx_CNT, should check the Update flag i.e. TIMx_SR.UIF, and if set, toggle the LED and clear that flag.

    JW

    Technical Moderator
    August 10, 2024

    Hello @Gatsby and welcome to the ST Community :smiling_face_with_smiling_eyes:.

    As a start, you may want to take a look at this example. With the details on the readme file, you will understand how it works to configure a Timer to toggle a Led each second. You can also take a look at the main.c file, the comments on the code should be really helpful.

    The example is for an STM32L010RB Nucleo but you can fund it for all our board and you can migrate it to other MCUs.

    Also, you can refer to this article to understand how it works.

    Ciao.

    STTwo-32