本文是 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 的时钟系统与定时器模块:
- 时钟系统:晶体振荡器 → PLL 倍频 → PFD 分数分频 → Prescaler 分频 → 各外设时钟
- ARM PLL 配置:注意切换时钟源的顺序,避免内核死机
- EPIT:适合周期性中断,如 1 秒定时翻转 LED
- GPT:功能更丰富,支持输入捕获、比较输出、自由运行模式
掌握时钟树和定时器是 i.MX6ULL 裸机开发的基础,后续的外设驱动(UART、SPI、I2C 等)都依赖于正确的时钟配置。
📝 参考资料:正点原子 i.MX6ULL 开发板教程、NXP i.MX6ULL 参考手册
💡 转载请注明出处,本文为个人学习笔记,如有错误欢迎指正!