STM32MP135裸机编程:定时器内核时钟频率计算方法

0 工具准备

STM32MP13xx参考手册

1 定时器内核时钟频率计算方法

1.1 定时器分组

STM32MP135的定时器按照时钟源不同分成了三组,如下:
APB1:
在这里插入图片描述
APB2:
在这里插入图片描述
APB6:
在这里插入图片描述

1.2 定时器内核时钟频率计算方法

在这里插入图片描述
APB1DIV是APB1的分频系数,APB2DIV、APB6DIV同理。TIMG1PRE是第1组定时器的预分频选择,TIMG2PRE、TIMG3PRE同理。相关寄存器如下:
第1组定时器预分频选择寄存器:
在这里插入图片描述
在这里插入图片描述
第2组定时器预分频选择寄存器:
在这里插入图片描述
第3组定时器预分频选择寄存器:
在这里插入图片描述
在这里插入图片描述
APB1分频系数寄存器:
在这里插入图片描述
APB2分频系数寄存器:
在这里插入图片描述
APB6分频系数寄存器:
在这里插入图片描述

2 定时器内核时钟频率计算操作

以下代码打印stm32MP135所有定时器的内核时钟频率等信息:

/**
 * @brief 获取定时器内核时钟频率
 *
 * @param clock_source_freq 时钟源频率
 * @param bus_div 总线分频值
 * @param timer_pre 定时器预分频值
 * @return float 定时器内核时钟频率
 */
float get_timer_kernel_clock_freq(u32 clock_source_freq, u32 bus_div, u32 timer_pre)
{
    float timer_kernel_clock_freq = 0.0f;
    switch (bus_div)
    {
    case 0:
        timer_kernel_clock_freq = clock_source_freq;
        break;
    case 1:
        timer_kernel_clock_freq = clock_source_freq * 2;
        break;
    case 2:
    case 3:
    case 4:
        if (timer_pre == 0)
        {
            timer_kernel_clock_freq = clock_source_freq * 2;
        }
        else if (timer_pre == 1)
        {
            timer_kernel_clock_freq = clock_source_freq * 4;
        }
    default:
        break;
    }
    return timer_kernel_clock_freq;
}


int clk(void)
{
    float timer_kernel_clock_freq;
    RCC_PeriphCLKInitTypeDef PeriphClkInit;
    HAL_RCCEx_GetPeriphCLKConfig(&PeriphClkInit);

    printf("> Group 1 timer [Clock source : APB1]\r\n");
    printf("  APB1 clock : %0.3f MHz\r\n", (float)HAL_RCC_GetPCLK1Freq() / 1000000.0f);
    printf("  APB1 clock divider : %lu\r\n", RCC->APB1DIVR & 0x7);
    printf("  Group 1 prescaler  : %lu\r\n", RCC->TIMG1PRER & 0x1);
    timer_kernel_clock_freq = get_timer_kernel_clock_freq(HAL_RCC_GetPCLK1Freq(), RCC->APB1DIVR & 0x7, RCC->TIMG1PRER & 0x1) / 1000000.0f;
    printf("  TIM2 TIM3 TIM4 TIM5 TIM6 TIM7 kernel clock freq : %0.3f MHz\r\n", timer_kernel_clock_freq);

    printf("> Group 2 timer [Clock source : APB2]\r\n");
    printf("  APB2 clock : %0.3f MHz\r\n", (float)HAL_RCC_GetPCLK2Freq() / 1000000.0f);
    printf("  APB2 clock divider : %lu\r\n", RCC->APB2DIVR & 0x7);
    printf("  Group 3 prescaler  : %lu\r\n", RCC->TIMG2PRER & 0x1);
    timer_kernel_clock_freq = get_timer_kernel_clock_freq(HAL_RCC_GetPCLK2Freq(), RCC->APB2DIVR & 0x7, RCC->TIMG2PRER & 0x1) / 1000000.0f;
    printf("  TIM1 TIM8 clock freq : %0.3f MHz\r\n", timer_kernel_clock_freq);

    printf("> Group 3 timer [Clock source : APB6]\r\n");
    printf("  APB6 clock : %0.3f MHz\r\n", (float)HAL_RCC_GetPCLK6Freq() / 1000000.0f);
    printf("  APB6 clock divider : %lu\r\n", RCC->APB6DIVR & 0x7);
    printf("  Group 3 prescaler  : %lu\r\n", RCC->TIMG3PRER & 0x1);
    timer_kernel_clock_freq = get_timer_kernel_clock_freq(HAL_RCC_GetPCLK6Freq(), RCC->APB6DIVR & 0x7, RCC->TIMG3PRER & 0x1) / 1000000.0f;
    printf("  TIM12 TIM13 TIM14 TIM15 TIM16 TIM17 kernel clock freq : %0.3f MHz\r\n", timer_kernel_clock_freq);

    return 0;
}

打印结果如下:
在这里插入图片描述

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-16 04:22:02       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-16 04:22:02       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-16 04:22:02       58 阅读
  4. Python语言-面向对象

    2024-07-16 04:22:02       69 阅读

热门阅读

  1. Integrated Gradients (Pytorch)refs

    2024-07-16 04:22:02       25 阅读
  2. ICPC铜牌算法

    2024-07-16 04:22:02       21 阅读
  3. centos7中MySQL的卸载

    2024-07-16 04:22:02       23 阅读
  4. Go语言入门之流程控制简述

    2024-07-16 04:22:02       29 阅读
  5. 【ant design of vue】a-range-picker设置月份星期中文

    2024-07-16 04:22:02       24 阅读
  6. 论文分享|RAG理论-第四篇-生成

    2024-07-16 04:22:02       26 阅读
  7. 【filebeat】filebeat字段新增ip地址

    2024-07-16 04:22:02       22 阅读
  8. Linux C++ 052-设计模式之享元模式

    2024-07-16 04:22:02       22 阅读
  9. centos7安装mysql-8.0.38-1.el7.x86_64.rpm-bundle.tar

    2024-07-16 04:22:02       27 阅读