ARM汇编学习笔记(六):【i.MX6ULL】时钟系统与定时器(EPIT & GPT)

本文是 i.MX6ULL 裸机开发学习笔记,涵盖**时钟系统(Clock)定时器(EPIT & GPT)**两大部分,包含硬件原理、寄存器配置流程及作业解答,适合嵌入式初学者参考。


一、时钟系统基础概念

1.1 什么是时钟?

在电子系统中,时钟(Clock) 是一个产生稳定、周期性振荡信号的电路或组件。这个信号像节拍器或心跳一样,为数字电路中的各种操作提供同步时序基准

1.2 相关概念对比

概念 说明
定时器(EPIT/GPT) 通过对已知频率的时钟信号进行计数,实现定时、延时或事件计数功能的硬件模块
时钟(Clock) 产生稳定周期性振荡信号的电路,为数字电路提供同步时序基准
实时时钟(RTC) 微处理器中的功能模块,在主电源关闭时仍能提供精确的日历和时间信息(通常靠纽扣电池供电)

二、时钟硬件概念

2.1 时钟源:晶体振荡器

工作原理:将石英晶体切割成音叉形状,施加电压后会产生稳定的机械振荡,从而输出稳定的时钟频率。

i.MX6ULL 常用的外部晶振为 24MHz

2.2 PLL(Phase Locked Loop)锁相环

作用:倍频

锁相环电路可以将输入的参考时钟频率进行倍频,输出更高频率的时钟。例如:

  • 输入 24MHz → 通过 PLL 倍频 → 输出 528MHz、480MHz、1056MHz 等

2.3 Prescaler 分频器

作用:分频

将高频时钟按整数比例降低频率,得到所需的较低频率时钟。

2.4 PFD(Phase Fractional Divider)相位分数分频器

作用:输出频率可升可降

PFD 是 PLL 后级的分频器,可以对 PLL 输出进行分数分频,得到更灵活的时钟频率。i.MX6ULL 中 PLL2(528MHz)和 PLL3(480MHz)各带有 4 个 PFD。


三、i.MX6ULL 时钟树配置代码流程

3.1 ARM PLL 配置(CCM_ANALOG_PLL_ARMn)

ARM PLL 为 ARM 内核提供时钟,配置流程如下:

复制代码
(1) 先选择 osc_clk,让 step_clk 为 24MHz
(2) 再将 PLL1 的输出改成 step_clk,让 ARM 暂时工作在 24MHz
(3) 配置 PLL 为 1056MHz
    ⚠️ 注意:设置倍频因子之前,先把 PLL 之后的二分频设置好,避免 ARM 内核故障!
(4) 最后改回 pll1_main_clk

关键寄存器CCM_ANALOG_PLL_ARMn

3.2 528 PLL 配置(CCM_ANALOG_PFD_528n)

PLL2 输出 528MHz,通过 4 个 PFD 分频得到:

  • PFD0 → 352MHz
  • PFD1 → 594MHz
  • PFD2 → 396MHz(常用于 PERIPH_CLK)
  • PFD3 → 297MHz

关键寄存器CCM_ANALOG_PFD_528n

3.3 480 PLL 配置(CCM_ANALOG_PFD_480n)

PLL3 输出 480MHz,通过 4 个 PFD 分频得到:

  • PFD0 → 720MHz(常用于 AHB_CLK)
  • PFD1 → 540MHz
  • PFD2 → 508.2MHz(常用于 UART)
  • PFD3 → 454.7MHz

关键寄存器CCM_ANALOG_PFD_480n

3.4 AHB_CLK_ROOT(132MHz)

复制代码
CBCMR[PRE_PERIPH_CLK_SEL]   // 选择 pre_periph_clk 的时钟源
CBCDR[PERIPH_CLK_SEL]       // 选择 periph_clk 的时钟源
CBCDR[AHB_PODF]             // AHB 分频系数

3.5 IPG_CLK_ROOT(66MHz)

复制代码
CBCDR[IPG_PODF]             // IPG 分频系数

3.6 PERCLK_CLK_ROOT(66MHz)

复制代码
CSCMR1[PERCLK_CLK_SEL]      // PERCLK 时钟源选择
CSCMR1[PERCLK_PODF]         // PERCLK 分频系数

四、定时器(EPIT & GPT)

4.1 51单片机定时器回顾

  • Timer0、Timer1 两个定时器
  • 8位自动重装模式:溢出后硬件自动重装初值
  • 16位模式:需要在中断服务程序中手动重装初值

4.2 EPIT(Enhanced Periodic Interrupt Timer)

增强型周期中断定时器

工作原理

  • 基于一个向下计数的计数器
  • 计数器从加载值递减到 0 时产生中断
  • 支持自动重装,适合周期性中断

实验:1秒中断,中断服务函数中翻转 LED 灯

频率计算要点:

复制代码
频率计算:1000 × 1000 = 1MHz  (1M = 10^6)
存储计算:1024 × 1024 = 1MByte(1M = 2^20)

⚠️ 注意区分:频率计算用 1000 进制,存储容量计算用 1024 进制。

4.3 GPT(General Purpose Timer)

通用目的定时器

特点

  • 支持输入捕获(Input Capture)
  • 支持比较输出(Output Compare)
  • 支持自由运行模式(Free-Run Mode)

实验:利用自由运行模式编写精准延时函数

在自由运行模式下,计数器不断循环计数,通过读取计数器的当前值来计算时间差,实现微秒级精准延时。


本文梳理了 i.MX6ULL 的时钟系统与定时器模块:

  1. 时钟系统:晶体振荡器 → PLL 倍频 → PFD 分数分频 → Prescaler 分频 → 各外设时钟
  2. ARM PLL 配置:注意切换时钟源的顺序,避免内核死机
  3. EPIT:适合周期性中断,如 1 秒定时翻转 LED
  4. GPT:功能更丰富,支持输入捕获、比较输出、自由运行模式

掌握时钟树和定时器是 i.MX6ULL 裸机开发的基础,后续的外设驱动(UART、SPI、I2C 等)都依赖于正确的时钟配置。


📝 参考资料:正点原子 i.MX6ULL 开发板教程、NXP i.MX6ULL 参考手册

💡 转载请注明出处,本文为个人学习笔记,如有错误欢迎指正!

相关推荐
明德扬1 小时前
机器人多摄像头如何做FPGA多路视频聚合?
学习·fpga开发·fpga
Navigator_Z1 小时前
LeetCode //C - 1255. Maximum Score Words Formed by Letters
c语言·算法·leetcode
曼巴UE52 小时前
UE5 客户端 需要的网络同步概念总结(3 )-事件同步 RPC 以及三种调用方式
网络·c++·网络协议·学习·rpc·ue5
昌原的儿子LEO2 小时前
IMX6ULL 时钟系统与 EPIT/GPT 定时器原理与配置
arm开发·学习
乌暮2 小时前
Java 抽象类与接口详解:半成品图纸 vs 能力合同
java·开发语言·后端·学习
AAA代码批发商2 小时前
Days 47 IMX6ULL 裸机开发:按键轮询实验 + 外部中断原理剖析(上)
笔记·学习·imx6ull·裸机开发·#arm中断
一条破秋裤2 小时前
Hi3516CV610 20S V4 开发板启动与调试流程
学习
牵猫散步的鱼儿2 小时前
stride 图像步长
c语言
sunoo-2292 小时前
【ARM嵌入式学习笔记Day6】一文打通i.MX6ULL时钟体系:PLL/PFD/预分频+滞回比较器全解析
arm开发·笔记·vscode·单片机·imx6ull·汇编语言