从寄存器层面重学STM32(2)——RCC和时钟树

一、前言

RCC 全称:Reset and Clock Control 复位和时钟控制器

时钟是所有外设和STM32运行的心跳,没有时钟给出一个一个精准的脉搏,各个外设就无法和CPU或者其他外设通信。这一节就重点理解时钟树相关知识。

二、时钟树结构

下面是在数据手册找到的一张时钟树的结构图,但是我还是更习惯看cubemx时钟树界面的结构图

这个是更方便理解的时钟树结构图。

三、时钟源

  1. HSI:高速内部 RC,8MHz 内部自带,不用外部元件;精度差;复位默认时钟源
  2. HSE:高速外部晶振,常用 8MHz 外部晶振,精度高;用来倍频出 72M 系统时钟(常用)
  3. LSE:低速外部,32.768K 晶振 专门给 RTC 实时时钟
  4. LSI:低速内部 RC,约 40K 给独立看门狗 IWDG,也可以给 RTC

PLL 锁相环:倍频器!把 HSE/HSI 放大,F1 最高倍频到 72MHz

四、三条总线

外设挂载在 AHB/APB1/APB2 不同总线上,用对应 ENR 寄存器打开时钟;例如GPIO 挂载 APB2 总线,时钟由 APB2ENR 控制。

时钟传递链路

复制代码
SYSCLK(系统总时钟) → HPRE分频 → HCLK(AHB总线时钟)
        HCLK → PPRE2分频 → PCLK2(APB2总线时钟)
        HCLK → PPRE1分频 → PCLK1(APB1总线时钟)

SYSCLK 可以理解成系统的总心跳,经过HPRE分频后传给AHB,AHB经过分频后传给自己的外设

然后 AHB 再把心跳经过PPRE1和PPRE2分频后分别传递给 APB1 和 APB2,这 2 条总线再把时钟分频之后,传给挂载在自己身上的外设,给他们当作心跳

AHB 总线(Advanced High-performance Bus 高级高性能总线)

SYSCLK (系统心跳)先送到 AHB,AHB 再分出 APB2、APB1;不同外设挂在不同总线上,总线最大时钟上限不一样

AHB 是高速主干总线,用来跑大批量数据搬运、存储器,带宽高; AHB 外设很少,我们初学最常碰到的就是 DMA。

挂载的设备有:

  • DMA1、DMA2
  • FLASH(闪存)、SRAM
  • FSMC(外部存储,比如 LCD、SRAM)
  • CRC 校验模块
  • 内核的 SysTick 滴答定时器、NVIC 内核外设时钟也来自 HCLK

APB2 总线(Advanced Peripheral Bus 2,高速外设总线)

APB2 是高速外设口,放需要高速的外设:GPIO、ADC、SPI1、USART1。

时钟由AHB分频之后获得,挂载的设备有:

  • GPIOA/GPIOB/GPIOC/GPIOD/GPIOE
  • USART1
  • SPI1
  • ADC1、ADC2、ADC3
  • AFIO(引脚重映射)

APB1 总线(低速外设总线)

时钟由AHB分频获得,最高不能超过36MHz(STM32F1 手册规定),包含的外设有:

  • USART2、USART3、UART4、UART5
  • SPI2、SPI3
  • I2C1、I2C2
  • 通用定时器 TIM2~TIM7
  • 看门狗、CAN、USB

五、使用每一个外设的第一步:初始化时钟,给它心跳

所有的外设,启动的第一步永远是开启时钟:先开时钟,再配置寄存器!

  • AHBENR:DMA
  • APB2ENR:GPIO、USART1、SPI1、ADC、AFIO
  • APB1ENR:USART2/3、I2C、TIM2~TIM7、CAN

RTC、看门狗:走低速时钟 LSE/LSI,不是 AHB/APB

例 1:GPIOB(APB2):

cs 复制代码
// 第一步:开GPIOB时钟
RCC->APB2ENR |= (1UL << 3);
// 第二步:再配置GPIO寄存器(CRH、ODR)
GPIOB->CRH &= ~(0xFUL << 20);
GPIOB->CRH |=  (0x8UL << 20);
GPIOB->ODR |=  (1UL << 13);

例 2:USART1(串口 1,APB2):

cs 复制代码
//第一步:开USART1时钟
RCC->APB2ENR |= (1UL << 14);
// 之后才配置波特率、控制寄存器等

例 3:DMA1(AHB 总线!注意是 AHBENR):

cs 复制代码
//第一步:DMA1时钟,AHB总线,不是APB!
RCC->AHBENR |= (1UL << 0);

六、内核(CPU、NVIC 中断控制器、SCB 系统控制块)的时钟

内核(Cortex‑M3)的时钟就是 SYSCLK,不需要你手动去 "开时钟",上电启动后由 RCC 负责给它送时钟。

内核心跳 SYSCLK 是【经过 RCC 多路选择器选出来之后的信号】

原始源头是 HSI / HSE / PLLCLK 这三个候选信号,送到一个多路选择开关(MUX)

相关推荐
玄芯散人1 小时前
【元婴·103】GPIO深度:复用、上下拉、翻转速度
单片机·嵌入式硬件
xiangw@GZ3 小时前
四线开尔文(Kelvin)测量原理
单片机·嵌入式硬件
优信电子3 小时前
HC05蓝牙模块主机与从机进行连接通信
单片机·物联网·嵌入式
深圳老胡4 小时前
STM32CubeMX 2 与 STM32CubeMX 的主要区别
笔记·stm32·单片机·代码规范
BSD_CGQ5 小时前
FSR 压力传感器 I2C 接口实战:地址规划与 MCU 软件滤波的工程取舍
嵌入式硬件·机器人·压力传感器·柔性薄膜压力传感器
゛凌乱的记忆づ6 小时前
50元从零到成品:一套AI辅助的嵌入式实战入门教程——IIC篇
人工智能·stm32·单片机·嵌入式硬件
创界工坊工作室7 小时前
54-基于STC89C52控制的智能运输小车设计
stm32·单片机·嵌入式硬件·51单片机·proteus
iCxhust7 小时前
NTC温度测量计算
单片机·嵌入式硬件·51单片机·热力计算
沐欣工作室_lvyiyi7 小时前
基于单片机的汽车智能座舱控制系统的设计与实现(论文+源码)
单片机·嵌入式硬件·汽车·智能座舱