STM32 时钟 第七课学习笔记嵌入式学习笔记 · 第 七 课今天学习了时钟和时钟树的概念、分频器/锁相环/复用器、四种时钟源树根、总线分频树干/树枝以及时钟树的编程配置整理成文方便复习。文章目录STM32 时钟 第七课学习笔记一、时钟和时钟树的概念1. 为什么需要时钟2. 什么是时钟树3. 本课学习脉络课程目录二、分频器、锁相环和复用器三、树根四种时钟源四、树干系统时钟 SYSCLK 与 PLL经典 72MHz 配置8MHz HSE × 9五、树枝外设时钟总线AHB/APB六、时钟树编程1. 时钟树的初始状态2. 标准库的启动代码3. 时钟树的编程接口标准库4. 配置时钟树经典 72MHz 流程5. 配置 Flash 指令预取高主频必备6. 片上外设开关和复位七、时钟速查表与口诀一、时钟和时钟树的概念1. 为什么需要时钟数字电路的一切动作都靠时钟节拍驱动寄存器在每个时钟沿采样数据CPU 每条指令都要若干时钟周期。没有时钟芯片就是静止的。频率越高运行越快但功耗越大不同外设对频率要求不同APB1 外设只能跑 36MHzUSB 需要 48MHzADC 最大 14MHz…。2. 什么是时钟树时钟树从时钟源开始经过分频、倍频、选择复用器后把不同频率的时钟分发给 CPU 和各外设的整个分配网络。因为形似一棵树根 → 树干 → 树枝所以叫时钟树。3. 本课学习脉络课程目录模块主题概念篇时钟和时钟树的概念器件篇分频器、锁相环和复用器树根时钟源HSE/HSI/LSE/LSI树干系统时钟 SYSCLK 生成路径树枝外设时钟总线AHB/APB1/APB2编程篇时钟树的初始状态、标准库启动代码、编程接口、配置时钟树、配置 Flash 指令预取、片上外设开关和复位二、分频器、锁相环和复用器时钟树上三种基本器件器件英文作用例子分频器Divider / Prescaler把频率降低72MHz /2 36MHzAPB1锁相环PLLPhase-Locked Loop把频率提高倍频8MHz ×9 72MHz复用器MUXMultiplexer从多路输入中选一路系统时钟选 HSI / HSE / PLLCLK记忆分频降、PLL 升、MUX 选。三、树根四种时钟源时钟源名称频率精度主要用途HSE高速外部晶振4~16 MHz常用 8M高PLL 倍频源、系统时钟HSI高速内部 RC8 MHz低温漂大上电默认时钟、低成本方案LSE低速外部晶振32.768 kHz高RTC 实时时钟LSI低速内部 RC40 kHz低独立看门狗 IWDG要点上电默认用 HSI8MHz等 HSE 稳定后再切换需要高精度如串口波特率、USB时用 HSELSE 专给 RTC 走秒用LSI 专给 IWDG 用。记忆树根有 4 个外高HSE、内高HSI、外低LSE、内低LSI。四、树干系统时钟 SYSCLK 与 PLLSTM32F103 完整时钟树来自 STM32F10xxx 参考手册图 8图解析主干路径从左往右时钟源左8MHz HSI RC、4-16MHz HSE OSCOSC_IN/OSC_OUT、32.768kHz LSEOSC32_IN/OSC32_OUT、40kHz LSIPLL 锁相环PLLSRC 选择 PLL 输入源HSI/2 或 HSE 或 HSE/2PLLMUL 倍频×2~×16得 PLLCLKSW 系统时钟选择器在 HSI / HSE / PLLCLK 三者中选一个作为SYSCLK最大 72MHzAHB 预分频器SYSCLK 分频得HCLK至 AHB 总线、核心、存储器、DMA最大 72MHzHCLK /8 得 Cortex 系统时钟SysTickAPB1 预分频器得 PCLK1最大 36MHz至 APB1 外设APB1 分频≠1 时定时器时钟 ×2TIM2~7APB2 预分频器得 PCLK2最大 72MHz至 APB2 外设APB2 分频≠1 时定时器时钟 ×2TIM1、TIM8ADC 预分频器PCLK2 /2,4,6,8 得 ADCCLK最大 14MHz→ ADC1/2/3USB 预分频器PLLCLK /1 或 /1.5 得 48MHz → USBRTC 时钟LSE/LSI/HSE/128 经 RTCSEL[1:0] 选择 → RTCCLK → RTCLSI 同时送独立看门狗MCO 主时钟输出可把 PLLCLK/HSI/HSE/SYSCLK/2 后输出到引脚供外部使用。经典 72MHz 配置8MHz HSE × 9HSE 8MHz → PLLSRC(选HSE) → PLLMUL(×9) → PLLCLK 72MHz → SW → SYSCLK 72MHz SYSCLK 72MHz → AHB /1 → HCLK 72MHz HCLK → APB1 /2 → PCLK1 36MHz定时器 ×2 → 72MHz HCLK → APB2 /1 → PCLK2 72MHz定时器 ×2 → 72MHz PCLK2 → ADC /6 → ADCCLK 12MHz≤14MHz ✓ PLLCLK → USB /1.5 → 48MHz ✓注意手册注明HSI 作为 PLL 输入时系统时钟最大只能到 64MHz。五、树枝外设时钟总线AHB/APBSTM32 内部总线架构用户整理示意图图解析Cortex-M3 内核CPU通过 I-Bus取指和 D-Bus数据连接总线矩阵总线矩阵连接 Flash、RAM、DMA1、DMA2 及AHB 总线最大 72MHzAHB 经桥接单元分出两条总线APB2最大 72MHz挂 EXTI、GPIOA~GPIOD、TIM1、SPI1、USART1、ADC1、ADC2APB1最大 36MHz挂 TIM2~4、USART2/3、SPI2、I2C1/I2C2、bxCAN、USB2.0 FS。总线与频率限制速查总线最大频率典型分频72M 方案挂载外设举例AHBHCLK72 MHz/1 72MHz核心、Flash、RAM、DMA、SDIOAPB2PCLK272 MHz/1 72MHzGPIO、USART1、SPI1、TIM1、ADCAPB1PCLK136 MHz/2 36MHzUSART2/3、SPI2、I2C、TIM2~4、CAN、USBADC14 MHz/6 12MHzADC1/2/3USB48 MHz/1.5USB2.0 FS记忆APB2 快72MAPB1 慢36M外设挂哪条总线最大频率就受谁限制。六、时钟树编程1. 时钟树的初始状态芯片上电复位后默认使用 HSI8MHz作为系统时钟所有外设时钟默认关闭省电需要时再逐个打开。2. 标准库的启动代码启动文件startup_stm32f10x_hd.s在 main() 之前会调用SystemInit()在 system_stm32f10x.c 中它负责把时钟树配置成宏定义的频率默认SYSCLK_FREQ_72MHz。3. 时钟树的编程接口标准库功能函数配置 PLLRCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9)配置系统时钟源RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK)AHB 分频RCC_HCLKConfig(RCC_SYSCLK_Div1)APB1 分频RCC_PCLK1Config(RCC_HCLK_Div2)APB2 分频RCC_PCLK2Config(RCC_HCLK_Div1)外设时钟使能RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE)外设复位RCC_APB2PeriphResetCmd(…)4. 配置时钟树经典 72MHz 流程/* system_stm32f10x.c 中 SetSysClock() 的核心流程标准库 */// 1. 打开 HSE 并等待就绪RCC_HSEConfig(RCC_HSE_ON);while(RCC_GetFlagStatus(RCC_FLAG_HSERDY)RESET);// 2. 配置 PLLHSE 8MHz 不分频×9 72MHzRCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);// 3. 配置总线分频AHB/1、APB1/2、APB2/1RCC_HCLKConfig(RCC_SYSCLK_Div1);RCC_PCLK1Config(RCC_HCLK_Div2);RCC_PCLK2Config(RCC_HCLK_Div1);// 4. 使能 PLL等待就绪后选作系统时钟RCC_PLLCmd(ENABLE);while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)RESET);RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);5. 配置 Flash 指令预取高主频必备SYSCLK 高于 24MHz 时必须给 Flash 设置等待周期并开启预取缓冲否则 CPU 取指跟不上FLASH_SetLatency(FLASH_Latency_2);// 72MHz 需要 2 个等待周期FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);// 开启指令预取6. 片上外设开关和复位每个外设使用前都要使能它的时钟挂在哪条总线就使能哪个 RCCRCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1,ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);复位外设回到默认状态RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C1,ENABLE);// 复位RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C1,DISABLE);// 释放HAL 库对应HAL_RCC_OscConfig()配置 HSE/HSI/PLLHAL_RCC_ClockConfig()配置 SYSCLK/AHB/APB1/APB2__HAL_RCC_GPIOA_CLK_ENABLE()。七、时钟速查表与口诀项目内容时钟源HSE 4-16M / HSI 8M / LSE 32.768K / LSI 40K上电默认HSI 8MHz外设时钟全关系统时钟SYSCLK 最大 72MHzHSI 作 PLL 输入时最大 64MHzAHBHCLK 最大 72MHzAPB2PCLK2 最大 72MHzGPIO、USART1、SPI1、TIM1、ADCAPB1PCLK1 最大 36MHzUSART2/3、SPI2、I2C、TIM2~4、CAN、USB定时器APB 分频1 时同 APB 频率否则 ×2ADCADCCLK 最大 14MHzPCLK2 /2,4,6,8USB48MHzPLL /1 或 /1.5SysTickHCLK /8Flash72MHz 需 2 等待周期 预取使能经典配置8M×972MAHB/1、APB1/2、APB2/1、ADC/6记忆口诀分频降、PLL 升、MUX 选。树根 4 个外高 HSE、内高 HSI、外低 LSE、内低 LSI。SYSCLK 最大 72MAPB1 只有一半36M。APB2 快、APB1 慢外设挂哪条就受哪条限制。定时器爱翻倍APB 分了频定时器就 ×2。外设要先给电开时钟用前记得 RCC 使能。本文为第七课学习笔记时钟树图为 STM32F10xxx 参考手册图 8如有错误欢迎评论区指正。