嵌入式主流ARM芯片时钟系统分析

654 阅读8分钟

1 STM32 F1系列

  • STM32 主系统主要由四个驱动单元和四个被动单元构成,
  • 四个驱动单元是:
    • 内核 DCode 总线;
    • 系统总线;
    • 通用 DMA1;
    • 通用 DMA2;
  • 四被动单元是:
    • AHB 到 APB 的桥:连接所有的 APB 设备;
    • 内部 FlASH 闪存;
    • 内部 SRAM;
    • FSMC; image.png
  • ① ICode 总线:该总线将 M3 内核指令总线和闪存指令接口相连,指令的预取在该总线上面完成。
  • ② DCode 总线:该总线将 M3 内核的 DCode 总线与闪存存储器的数据接口相连接,常量加载和调试访问在该总线上面完成。
  • ③ 系统总线:该总线连接 M3 内核的系统总线到总线矩阵,总线矩阵协调内核和 DMA 间访问。
  • ④ DMA 总线:该总线将 DMA 的 AHB 主控接口与总线矩阵相连,总线矩阵协调 CPU 的DCode 和 DMA 到 SRAM,闪存和外设的访问。
  • ⑤ 总线矩阵:总线矩阵协调内核系统总线和 DMA 主控总线之间的访问仲裁,仲裁利用轮换算法。
  • ⑥ AHB/APB 桥:这两个桥在 AHB 和 2 个 APB 总线间提供同步连接,APB1 操作速度限于36MHz,APB2 操作 速度全速。 image.png
  • 在 STM32 103中,有五个时钟源,为 HSI、HSE、LSI、LSE、PLL。从时钟频率来分可以分为高速时钟源和低速时钟源,在这 5 个中 HIS,HSE 以及 PLL 是高速时钟,LSI 和 LSE 是低速时钟。从来源可分为外部时钟源和内部时钟源,外部时钟源就是从外部通过接晶振的方式获取时钟源,其中 HSE 和 LSE 是外部时钟源,其他的是内部时钟源。
  • APB1 上面连接的是低速外设,包括电源接口、备份接口、CAN、USB、I2C1、I2C2、UART2、UART3 等等,APB2 上面连接的是高速外设包括 UART1、SPI1、Timer1、ADC1、ADC2、所有普通 IO 口(PA~PE)、第二功能 IO 口等
  • MCO 是 STM32 的一个时钟输出 IO(PA8),它可以选择一个时钟信号输出,可以选择为 PLL 输出的 2 分频、HSI、HSE、或者系统时钟。这个时钟可以用来给外部其他系统提供时钟源。

1.1 复位功能

image.png image.png image.png image.png image.png

1.2 时钟开发

image.png image.png image.png

2 STM32 F4系列

2.1 STM32 F407系列

image.png image.png

2.2 STM32 F429系列

  • 在 STM32F429 中,有 5 个最重要的时钟源,为 HSI、HSE、LSI、LSE、PLL。其中 PLL实际是分为三个时钟源,分别为主 PLL 和 I2S 部分专用 PLLI2S 和 SAI 部分专用 PLLSAIimage.png

  • 例如我们的外部晶振选择 25MHz。同时我们设置相应的分频器 M=25,倍频器倍频系数 N=360,分频器分频系数 P=2,那么主 PLL 生成的第一个输出高速时钟 PLLP 为:

      PLL=25MHz * N/ (M*P)=25MHz* 360 /(25*2) = 180MHz
    
  • 如果我们选择HSE为PLL时钟源,同时SYSCLK时钟源为PLL,那么SYSCLK时钟为 180MHz

  • PLL 为锁相环倍频输出。STM32F4 有三个 PLL:

    • 1) 主 PLL(PLL)由 HSE 或者 HSI 提供时钟信号,并具有两个不同的输出时钟。第一个输出 PLLP 用于生成高速的系统时钟(最高 180MHz)第二个输出 PLLQ 为 48M 时钟,用于 USB OTG FS 时钟,随机数发生器的时钟和 SDIO时钟。

    • 2) 第一个专用 PLL(PLLI2S)用于生成精确时钟,在 I2S 和 SAI1 上实现高品质音频性能。其中,N 是用于 PLLI2S vco 的倍频系数,其取值范围是:192-432;R 是 I2S 时钟的分频系数,其取值范围是:2~7;Q 是 SAI 时钟分频系数,其取值范围是:2-15;P 没用到。

    • 3) 第二个专用 PLL(PLLSAI)同样用于生成精确时钟,用于 SAI1 输入时钟,同时还为 LCD_TFT接口提供精确时钟。其中,N 是用于 PLLSAI vco 的倍频系数,其取值范围是:192-432;Q 是 SAI 时钟分频系数,其取值范围是:2-15;R 是 LTDC 时钟的分频系数,其取值范围是:2-7;P 没用到。

2.1 时钟开发

  • 系统时钟来自外部晶振 image.png
  • 系统时钟来自PLL image.png

3 STM32H7系列

3.1 STM32H7 时钟系统图

  • 上图主要列出了 STM32H743 时钟的组成和走向,并没有给出具体外设时钟的设置方法,外设时钟通过 SCGU(System Clock Generation Unit)、SCEU(System Clock Eable Unit)、PKSU(Peripheral Kernelclock Selection Unit)和 PKEU(Peripheral Kernel clock Enable Unit)等部分设置。 image.png
  • ① 低速时钟源,包括 LSI 和 LSE 两个,LSI 属于 STM32H7 内部低速时钟源,频率约为 32Khz。LSE 则是外部低速时钟源,为 32.768Khz(使用 32.768Khz 外部晶振)。这两个时钟源一般用于看门狗和 RTC。
  • ② 高速时钟源,包括:HSE、HIS、CSI 和 HSI48。HSE 是外部高速时钟,我们使用 25M的外部晶振,所以 HSE 频率为 25Mhz;HSI 是内部高速时钟,频率为 64Mhz;CSI 是低功耗内部时钟,频率为 4Mhz;HSI48 是内部高精度时钟源,频率为 48Mhz,配合 CRS 可以直接作为 USB的时钟源使用。
  • ③ PLL1~3 的时钟源选择器,我们一般选择 PLL 时钟源来自 hse_ck,一般为 25Mhz。
    • ① PLL1 时钟源预分频器,用于对第③步选择的时钟源进行分频,取值范围是:2~63,根据实际需要设置。DIVM2 和 DIVM3 分别用于 PLL2 和 PLL3 的预分频器。
    • PLL1 锁相环,该 PLL 主要用到两路输出:pll1_p_ck 和 pll1_q_ck,其中:pll1_p_ck一般用于 sys_ck 的时钟源,最终作为 CPU、SysTick、AXI、AHB1-4 和 APB1~4 等的时钟源;而 pll1_q_ck 则可以通过 PKSU 选择作为部分外设的内核时钟(perx_ker_ck),如 FMC、QSPI、SDMMC1/2 等,详见《STM32H7xx 参考手册》335 页,Table 51。至于图中的 pll1_r_ck,并没有用到。
    • ③ sys_ck 时钟选择器,可以选择 sys_ck 的时钟来自:hsi_ck、csi_ck、hse_ck 或 pll1_p_ck等,在 PLL1 还没设置好的时候,系统默认是选择 hsi_ck(64Mhz)作为时钟源的,当 PLL1 配置好以后,则系统时钟可以切换为 plll1_q_ck(400Mhz),以得到最高性能。
  • ④ SCGU(System Clock Generation Unit,系统时钟生成单元),用于将 sys_ck 分成各种时钟频率,比如:CPU 频率、SysTick、AXI、AHB1-4 和 APB1-4 等,待会详细介绍。
  • ⑤ SCEU(System Clock Eable Unit,系统时钟使能单元),用于使能各个外设、总线等的时钟,是一个时钟开关。待会详细介绍。
  • ⑥ PKSU(Peripheral Kernel clock Selection Unit,外设内核时钟选择单元),用于选择部分外设的内核时钟源,STM32H7 内部,很多外设都可以自由选择内核时钟来源,从而提高使用的灵活性,具体的选择关系,详见《STM32H7xx 参考手册》335 页,Table 51。待会详细介绍。
  • ⑦ PKEU(Peripheral Kernel clock Enable Unit,外设内核时钟使能单元),用于使能部分外设的内核时钟,从而控制外设内核时钟的开/关。

3.2 STM32H743 系统时钟生成图

image.png

  • 上图主要列出了 STM32H743 系统时钟的生成原理,包括 CPU 时钟、SysTick 时钟、AXI时钟、AHB1-4 和 APB1-4 等。D1、D2 和 D3 域是 ST 为了支持动态能效管理,所设计的 3 个独立的电源域,每个域都能独立开启/关闭。系统时钟由 SCGU 产生,然后经过 SCEU 做开关,最终输出到各个时钟域(D1、D2 和 D3),从而能够控制和访问各类外设,保证系统的正常运行。

4 ARM A7 IMX6ULL

  • .MX6U 的外设有很多,不同的外设时钟源不同,NXP 将这些外设的时钟源进行了分组,一共有 7 组,这 7 组时钟源都是从 24MHz 晶振 PLL 而来的,因此也叫做 7 组 PLL, image.png
  • ①、 ARM_PLL(PLL1),此路 PLL 是供 ARM 内核使用的,ARM 内核时钟就是由此 PLL生成的,此 PLL 通过编程的方式最高可倍频到 1.3GHz。
  • ②、528_PLL(PLL2),此路 PLL 也叫做 System_PLL,此路 PLL 是固定的 22 倍频,不可编程修改。因此,此路 PLL 时钟=24MHz * 22 = 528MHz,这也是为什么此 PLL 叫做 528_PLL 的原因。此 PLL 分出了 4 路 PFD,分别为:PLL2_PFD0~PLL2_PFD3,这 4 路 PFD 和 528_PLL共同作为其它很多外设的根时钟源。通常 528_PLL 和这 4 路 PFD 是 I.MX6U 内部系统总线的时钟源,比如内处理逻辑单元、DDR 接口、NAND/NOR 接口等等。
  • ③、USB1_PLL(PLL3),此路 PLL 主要用于 USBPHY,此 PLL 也有四路 PFD,为:PLL3_PFD0~PLL3_PFD3,USB1_PLL 是固定的 20 倍频,因此 USB1_PLL=24MHz *20=480MHz。USB1_PLL虽然主要用于USB1PHY,但是其和四路PFD同样也可以作为其他外设的根时钟源。
  • ④、USB2_PLL(PLL7,没有写错!就是 PLL7,虽然序号标为 4,但是实际是 PLL7),看名字就知道此路PLL是给USB2PHY使用的。同样的,此路PLL固定为20倍频,因此也是480MHz。
  • ⑤、ENET_PLL(PLL6),此路 PLL 固定为 20+5/6 倍频,因此 ENET_PLL=24MHz * (20+5/6)= 500MHz。此路 PLL 用于生成网络所需的时钟,可以在此 PLL 的基础上生成 25/50/100/125MHz的网络时钟。
  • ⑥、VIDEO_PLL(PLL5),此路 PLL 用于显示相关的外设,比如 LCD,此路 PLL 的倍频可以调整,PLL 的输出范围在 650MHz~1300MHz。此路 PLL 在最终输出的时候还可以进行分频,可选 1/2/4/8/16 分频。
  • ⑦、AUDIO_PLL(PLL4),此路 PLL 用于音频相关的外设,此路 PLL 的倍频可以调整,PLL的输出范围同样也是 650MHz~1300MHz,此路 PLL 在最终输出的时候也可以进行分频,可选1/2/4 分频。 image.png