从寄存器层面重学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)

相关推荐
无敌最俊朗-5 小时前
【电感专题2:电感的感抗、电路的阻抗、电流的滞后】
单片机·嵌入式硬件·元器件·电感
wuyk55510 小时前
嵌入式故障诊断-Bug002-局部大数组压栈高温必死机
stm32·单片机·嵌入式硬件·mcu·物联网·51单片机·嵌入式实时数据库
Zwawa13 小时前
嵌入式OLED表驱动菜单:用一张表、一个栈和一个窗口重写表驱动菜单
c语言·单片机·嵌入式
Dev_XH13 小时前
【成品设计】基于沁恒单片机的电动汽车充电站智慧调度系统
stm32·单片机·嵌入式硬件·物联网
shimly12345614 小时前
(done) 嵌入式硬件电路图 (5) 重要的元器件特性之二极管三极管
嵌入式硬件
Zw-awa16 小时前
嵌入式OLED表驱动菜单:用一张表、一个栈和一个窗口重写表驱动菜单
stm32
minglie116 小时前
esp32c3+atshell测试ov7670
单片机·嵌入式硬件
橘为己有44116 小时前
51单片机:流水灯
单片机·51单片机
蜀黍@猿16 小时前
ARM 汇编入门(十):标量浮点与 VFP 指令全解析
汇编·arm开发·stm32·mcu
不脱发的程序猿17 小时前
STM32和VS1053制作电子琴
stm32·单片机·嵌入式硬件·midi·vs1053