610 字
3 分钟
STM32 时钟系统
2022-10-23

STM32 时钟树#

下图为 STM32F103C8T6 的时钟树:

img


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 总线时钟
}
STM32 时钟系统
https://fuwari.vercel.app/posts/嵌入式/stm32/stm32-时钟系统/
作者
Asuwee
发布于
2022-10-23
许可协议
CC BY-NC-SA 4.0