一、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芯片都有不同的时钟配置和限制,因此在使用CubeMX配置工具之前需要先查阅手册,了解所选型号的限制和规范。
三、总结
确认APB时钟需要根据具体芯片型号的手册来查阅和确定。我们可以使用公式计算APB时钟,也可以通过HAL库提供的函数和CubeMX工具来获得APB时钟的频率。