您的位置:

STM32确认APB时钟

一、APB时钟概述

STM32是一种基于ARM Cortex-M架构的微控制器,APB(Advanced Peripheral Bus)是在该架构中应用的总线,用于连接芯片内部的外设模块,如定时器、UART、SPI等。APB总线可以分为APB1和APB2,其中APB1最大频率为36MHz,APB2最大频率为72MHz。

APB总线时钟来源于系统时钟和PLL(Phase Locked Loop)倍频器的输出,因此APB总线时钟的频率是与系统时钟和PLL倍频器的设置有关的。对于不同型号的STM32,其系统时钟和PLL倍频器的设置也不尽相同,因此确认APB时钟需要根据具体芯片型号的手册来查阅和确定。

二、确定APB时钟的方法

1. 查阅芯片手册

STM32各型号的芯片手册都会详尽地介绍系统时钟和PLL倍频器的设置方法以及APB时钟的计算公式。一般来说,在系统时钟和PLL倍频器确定的情况下,APB时钟的频率可以通过如下公式计算:

APB_FREQ = SYSCLK_FREQ / APB_DIV

其中,APB_DIV是APB总线分频系数,其值与每个具体的外设模块有关。例如,对于TIM3定时器模块来说,其所在的APB1总线分频系数为2,因此APB1时钟频率为APB_FREQ/2。需要注意的是,对于一些特定的外设模块,比如USB和Ethernet,其时钟频率是不能超过48MHz的,因此需要根据情况进行相应的限制。

2. 通过代码计算确定

除了查阅手册来确认APB时钟之外,我们还可以通过代码计算来获得APB时钟的频率。为此我们需要调用HAL库提供的一些函数来获取系统时钟和PLL倍频器的相关信息,然后根据上述公式来计算APB时钟。

以下是一个示例代码:

#include "stm32f4xx_hal.h"

int main()
{
    HAL_Init();
    SystemClock_Config(); // 获取系统时钟和PLL倍频器的设置

    uint32_t sysclk_freq = HAL_RCC_GetSysClockFreq(); // 获取系统时钟频率
    RCC_PeriphCLKInitTypeDef periph_clk_init;
    HAL_RCCEx_GetPeriphCLKConfig(&periph_clk_init); // 获取PLL倍频器的设置
    uint32_t pll_freq = 0;
    if (periph_clk_init.PLL.PLLSource == RCC_PLLSOURCE_HSE)
    {
        if (periph_clk_init.PLL.PLLM == 25 && periph_clk_init.PLL.PLLN == 336 && 
            periph_clk_init.PLL.PLLP == RCC_PLLP_DIV2 && periph_clk_init.PLL.PLLQ == 7)
        {
            pll_freq = 84000000;
        }
    }
    uint32_t apb1_freq = sysclk_freq / periph_clk_init.APB1CLKDivider; // 计算APB1时钟频率
    uint32_t apb2_freq = sysclk_freq / periph_clk_init.APB2CLKDivider; // 计算APB2时钟频率

    return 0;
}

以上示例代码中,通过调用HAL_RCC_GetSysClockFreq函数获取系统时钟频率,再通过HAL_RCCEx_GetPeriphCLKConfig函数获取PLL倍频器的设置。在这个例子中,我们假设PLL倍频器的设置是25MHz的外部时钟源,倍频器参数为PLL倍频因子为336,输出给系统时钟为84MHz。

最后通过除以APB总线分频系数,就能得到APB1和APB2时钟的频率了。

3. 使用CubeMX配置工具确定

使用STM32CubeMX配置工具可以方便地配置系统时钟和PLL倍频器,然后由工具自动计算出APB时钟的频率。这个方法不需要我们手动计算,同时可以在线生成相应的初始化代码。只需要打开CubeMX工具,在Clock Configuration页面中进行设置即可。

以下是一个示例截图:

STM32确认APB时钟

由于不同型号的STM32芯片都有不同的时钟配置和限制,因此在使用CubeMX配置工具之前需要先查阅手册,了解所选型号的限制和规范。

三、总结

确认APB时钟需要根据具体芯片型号的手册来查阅和确定。我们可以使用公式计算APB时钟,也可以通过HAL库提供的函数和CubeMX工具来获得APB时钟的频率。