610 字
3 分钟
STM32 时钟系统
STM32 时钟树
下图为 STM32F103C8T6 的时钟树:
STM32 时钟源
目前 STM32 中常见的时钟源有 5 种,分别是 HSI、HSE、LSI、LSE、PLL :
- HSI(High Speed Internal Clock Signal | 高速内部时钟):RC 振荡器,频率为 8MHz,精度略差
- LSI(Low Speed Internal Clock Signal | 低速内部时钟):RC 振荡器,频率为 40KHz
- HSE(High Speed External Clock Signal | 高速外部时钟):可接 4~16MHz 的晶振,精度比较高,比较稳定
- LSE(Low Speed External Clock Signal | 低速外部时钟):可接 1~1000KHz 的晶振
- PLL(Phase Locked Loop | 锁相环):可对其他时钟源进行 倍频、分频、相位偏移 和 可编程占空比 等操作
其他还有比较少见或具备特殊性的时钟源,分别是 MSI、CSI :
- MSI :多速率内部振荡器,可由软件配置产生不同频率的时钟
- CSI :内部低功耗内部振荡器
在 STM32 HAL 的开发中,默认是使用内部时钟(HSI 和 LSI),如果需要使用外部时钟需要在 RCC(Reset and Clock Control | 复位与时钟控制)中进行设置,设置选项有 3 种:
- Disable:不使用外部晶振
- Crystal/Ceramic Resontor:无源外部晶振
- BYPASS Clock Source:有源外部晶振 或 其他直接时钟输入源
STM32 时钟
STM32 中有 3 种时钟,分别是 FCLK、HCL、PCLK :
- FCLK | SYSCLK (Free Running Clock):又被称为 CPU 的主频或系统时钟,为 CPU 提供时钟信号
- HCLK (Hight-Speed Clock):为 AHB(Advanced High-Performance Bus) 总线提供时钟信号;HCLK 是高速外设时钟,一般为显示屏、外部 FLASH 等提供时钟信号;HCLK 一般是通过 SYSCLK 分频得到
- PCLK(Peripheral Clock):为 APB(Advanced Peripherals Bus)总线提供时钟信号;PCLK 是低速外设时钟,一般给 USB、SPI、IIC、USART 等提供时钟信号;PCLK 一般是通过 HCLK 分频得到
STM32 时钟设置
void SystemClock_Config(void){ //定义句柄结构体 RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
//对时钟源进行配置 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; //设置 HSI 为 RCC 振荡器 RCC_OscInitStruct.HSIState = RCC_HSI_ON; //设置 HSI 为开启状态 RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; //设置 HSI 校准值 HAL_RCC_OscConfig(&RCC_OscInitStruct); //HAL 初始化 RCC 振荡器
//对 CPU、AHB、APB 时钟信号进行配置 RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; //设置时钟类型 RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI; //设置 HSI 为系统时钟来源 RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; //设置 SYSCLK 为 AHB 总线的时钟信号,不分频 RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; //设置 HCLK 为 AHP 总线的时钟信号,不分频 RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0); //初始化 CPU、AHB 和 APB 总线时钟}