Skip to main content
arnold_w
Senior II
January 19, 2018
Question

How do I get the frequency of a timer in STM32F769I?

  • January 19, 2018
  • 3 replies
  • 8609 views
Posted on January 19, 2018 at 13:38

I am working with the STM32F7691I-EVAL board and I would like to determine the frequency of any given timer:

GET_TIMER_FREQ(TIMx)

The macro/function should be able to determine the frequency regardless of which clock the microcontroller is running from. Of course it is fully acceptable to do it 2 steps, first determine the clock source and then determine the resulting frequency for a particular timer. I have gone through the HAL-files, but I am unable to find such macros/functions. Can someone please help me?

    This topic has been closed for replies.

    3 replies

    Tesla DeLorean
    Guru
    January 19, 2018
    Posted on January 19, 2018 at 14:24

    The macro (or function) would need to know which APB a particular timer is on, and then check the divisor. I all except the DIV1 case the TIMCLK is source one divider tap earlier (ie *2)

    printf('APB1=%d\n', HAL_RCC_GetPCLK1Freq());

    printf('APB2=%d\n', HAL_RCC_GetPCLK2Freq());

    Review code in these functions

    For systems you know the configuration the computation for TIMxCLK can use SystemCoreClock

    Tips, Buy me a coffee, or three.. PayPal VenmoUp vote any posts that you find helpful, it shows what's working..
    arnold_w
    arnold_wAuthor
    Senior II
    January 19, 2018
    Posted on January 19, 2018 at 14:45

    Where do I find out which timers are connected to which PCLKx? Is the same as STM32F4 (2: TIM1

    TIM8

    TIM9

    TIM10

    TIM11, and the rest are 1)?

    Tesla DeLorean
    Guru
    January 19, 2018
    Posted on January 19, 2018 at 16:56

    There is a bus diagram in the Data Sheet, APBxENR registers in the Reference Manual, and the ♯ include should associate the APB1 and APB2 clock enables for the various timers.

    Tips, Buy me a coffee, or three.. PayPal VenmoUp vote any posts that you find helpful, it shows what's working..
    Associate III
    October 27, 2023

    The address of the timer determines which Bus it is on. I created below code which does the trick:

     

    RCC_ClkInitTypeDef clkConfig;

    uint32_t latency;

    uint32_t clockHz;

     

    ::HAL_RCC_GetClockConfig(&clkConfig, &latency);

     

    //= The address of the timer register determines which bus it is located on

    if ((uint32_t)peripheralReg >= APB2PERIPH_BASE)

    {

    clockHz = ::HAL_RCC_GetPCLK2Freq();

     

    if (clkConfig.APB2CLKDivider != RCC_HCLK_DIV1)

    {

    clockHz *= 2;

    }

    }

    else if ((uint32_t)peripheralReg >= APB1PERIPH_BASE)

    {

    clockHz = ::HAL_RCC_GetPCLK1Freq();

     

    if (clkConfig.APB1CLKDivider != RCC_HCLK_DIV1)

    {

    clockHz *= 2;

    }

    }

    Associate III
    October 28, 2023

    Additional to my previous post. What I forget to mention is that (uint32_t)peripheralReg is part of my extensive C++ library built on top of the HAL layer.

    This code is a reference to the Timer instance (TIM_TypeDef* Instance) in TIM_HandleTypeDef