STM32F407单片机时钟系统详解与配置指南
STM32F407单片机时钟系统详解与配置指南
STM32F407单片机的时钟系统是其硬件架构中的重要组成部分,决定了整个系统的运行速度和性能。本文将详细介绍STM32F407的时钟系统结构及其配置方法,帮助开发者更好地理解和使用这一关键组件。
一、时钟树
STM32F407的时钟系统可以分为以下几个主要部分:
A:输入时钟源,可分为外部时钟源和内部时钟源,具体包括:
HSI(高速内部振荡器)
HSE(高速外部振荡器)
LSI(低速内部振荡器)
LSE(低速外部振荡器)
B:锁相环(PLL)
C:系统时钟源选择器,决定MCU的系统主时钟(SYSCLK)的大小
D:Cortex-M内核系统的时钟和使能单元
E:定时器及其他外设的时钟源APB1/APB2
F:STM32的MCO时钟输出功能
1. 时钟源
输入时钟源主要包括HSI、HSE、LSI、LSE。外部时钟源通过接晶振的方式获取,内部时钟源则由内部RC振荡器产生。芯片上电时默认使用内部HSI时钟启动。
2. 锁相环(PLL)
锁相环(PLL)是一种电子电路,通过反馈控制机制实现输出信号的频率和相位与输入参考信号的同步。在STM32中,PLL的主要作用是输入时钟净化和倍频。
下图展示了使用PLL作为系统时钟源时的配置:
- 标号①:PLL时钟源的选择器,可选HSI或HSE信号
- 标号②:主PLL输入时钟的分频系数,可选0~63
- 标号③:配置锁相环倍频系数,包括PPL_N、PPL_N、PPL_Q三个参数
3. 系统时钟
STM32的系统时钟可配置为HSI、PLLCLK、HSE中的一个,通过CFGR的位SW[1:0]设置。AHB、APB1、APB2等时钟通过系统时钟分频得到。
下图展示了系统时钟配置:
- 标号④:系统时钟输入源选择,可选HSI、PLLCLK、HSE
- 标号⑤:AHB预分频器,可选择分频系数:1,2,4,8,16,32,64,128,256,512
- 标号⑥:APB1预分频器,分频因子可选1,2,4,8,16
- 标号⑦:APB2预分频器,分频因子可选1,2,4,8,16
- 标号⑧:定时器时钟频率决定器
- 标号⑨:RTC时钟,时钟源可选HSE/x(x = 2~31)、LSE或LSI
二、时钟系统配置
STM32F407默认使用内部8M的HSI作为时钟源,最高推荐稳定时钟频率为168MHz。时钟系统配置主要包括以下步骤:
第 1 步:配置 HSE_VALUE
通过宏定义选择HSE_VALUE的值,例如:
#if !defined (HSE_VALUE)
#define HSE_VALUE 8000000U /*!< Value of the External oscillator in Hz */
#endif
第 2 步:调用 SystemInit 函数
SystemInit函数主要进行外部存储器配置和中断向量表地址配置。HAL库的SystemInit函数不涉及时钟配置,因此需要用户自定义时钟配置函数。
第 3 步:在 main 函数里调用用户编写的时钟设置函数
用户时钟配置函数示例:
uint8_t sys_stm32_clock_init(uint32_t plln, uint32_t pllm, uint32_t pllp, uint32_t pllq)
使用HAL库配置STM32F4时钟系统的一般步骤:
- 配置时钟源相关参数:调用HAL_RCC_OscConfig()
- 配置系统时钟源及分频系数:调用HAL_RCC_ClockConfig()
步骤 1:配置时钟源相关参数
HAL_RCC_OscConfig()函数用于配置时钟源,结构体RCC_OscInitTypeDef定义如下:
typedef struct
{
uint32_t OscillatorType; /* 需要选择配置的振荡器类型 */
uint32_t HSEState; /* HSE 状态 */
uint32_t LSEState; /* LSE 状态 */
uint32_t HSIState; /* HSI 状态 */
uint32_t HSICalibrationValue; /* HSI 校准值 */
uint32_t LSIState; /* LSI 状态 */
RCC_PLLInitTypeDef PLL; /* PLL 配置 */
}RCC_OscInitTypeDef;
PLL配置结构体RCC_PLLInitTypeDef定义如下:
typedef struct
{
uint32_t PLLState; /* PLL 状态 */
uint32_t PLLSource; /* PLL 时钟源 */
uint32_t PLLM; /* PLL 倍频系数 M */
uint32_t PLLN; /* PLL 倍频系数 N */
uint32_t PLLP; /* PLL 倍频系数 P */
uint32_t PLLQ; /* PLL 倍频系数 Q */
}RCC_PLLInitTypeDef;
步骤 2:配置系统时钟源及相关参数
HAL_RCC_ClockConfig()函数用于配置系统时钟源及分频系数,结构体RCC_ClkInitTypeDef定义如下:
typedef struct
{
uint32_t ClockType; /* 要配置的时钟 */
uint32_t SYSCLKSource; /* 系统时钟源 */
uint32_t AHBCLKDivider; /* AHB 分频系数 */
uint32_t APB1CLKDivider; /* APB1 分频系数 */
uint32_t APB2CLKDivider; /* APB2 分频系数 */
}RCC_ClkInitTypeDef;
总结
STM32F407的时钟系统配置主要包括以下步骤:
- 宏定义HSE_VALUE
- 调用HAL_RCC_OscConfig()配置输入时钟源
- 调用HAL_RCC_ClockConfig()配置系统时钟源及相关参数
- 在main函数中调用用户自定义的时钟配置函数
通过合理配置时钟系统,可以确保STM32F407在不同应用场景下的性能和功耗需求得到满足。