i.MX6ul时钟分析

news/2025/3/15 4:55:41/

引入

I.MX6U 的系统主频为 528MHz,但是默认情况下内部 bootrom 会将 I.MX6U 的主频设置为 396MHz因此需要时钟配置

截图:时钟管理系统图

这两幅图主要介绍CCM的作用。

CCM:时钟控制模块可以产生7路PLL,其中两路每路还可以产生4路PFD

PFD是具有没有模拟组件或反馈回路。 频率开关时间比PLL快得
•PLL1也称为ARM PLL
•PLL2也称为系统PLL
•PLL3也称为USB1 PLL
•PLL4也称为音频PLL
•PLL5也称为视频PLL
•PLL6也称为ENET PLL
•PLL7也称为USB2 PLL(此PLL仅由USB UTM使用通过直接连接的接口。)

①、 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_PFD,这 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 分频。
⑦、AUDIO_PLL(PLL4),此路 PLL 用于音频相关的外设,此路 PLL 的倍频可以调整,PLL
的输出范围同样也是 650MHz~1300MHz,此路 PLL 在最终输出的时候也可以进行分频,可选
1/2/4 分频。

 

这幅图一共有三部分:CLOCK_SWITCHER、CLOCK ROOT GENERATOR 和SYSTEM CLOCKS。其中左边的 CLOCK_SWITCHER 就是我们上一小节讲解的那 7 路 PLL 和8 路 PFD,右边的 SYSTEM CLOCKS 就是芯片外设,中间的 CLOCK ROOT GENERATOR 负责从 7 路PLL 和 8 路 PFD 中选择合适的时钟源给外设使用。

如:倒数第三个SAI1 就需要配置CSCMR1寄存器的SAI1_CLK_SEL位

如果此位配置为10 则选择PLL4 在通过Cs1CDR的SAI1_CLK_PRED和SAI1_CLK_PODF位继续分频即可获得最终频率

SAI1_CLK_PODF = 0 SAI1_CLK_PODF = 1则

SAI1的最终频率为:SAI1=PLL4/1/2

系统时钟配置

有此图可以看出我们需要使能PLL并为其配置频率,然后设置分频系数即可的到系统时钟

 

ARM_PLL由7位寄存器字段CCM_ANALOG_PLL_ARM [DIV_SELECT]选择。PLL输出频率= Fref * DIV_SEL / 2

Fin=24MHZ 如果PLL1 要输出 1056MHz 的话,div_select 就要设置为 88。

通过CACRR的ARM_PODF位设置分频

将分频设置为2即可得到 1056MHz/2=568MHZ的主频

在修改 PLL1 时钟频率的时候我们需要先将内核时钟源改为其他的时钟源

如果我们要改变PLL1我们需要先将 pll1_sw_clk 切换到 step_clk 上。等 pll1_main_clk 调整完成以后在切换回来。

这时就要配置CCSR寄存器的STEP_SEL位和PLL1_SW_CLK_SEL位

到这里,修改 I.MX6U 主频的步骤就很清晰了,修改步骤如下:
①、 设置寄存器 CCSR 的 STEP_SEL 位,设置 step_clk 的时钟源为 24M 的晶振。
②、设置寄存器 CCSR 的 PLL1_SW_CLK_SEL 位,设置 pll1_sw_clk 的时钟源为
step_clk=24MHz,通过这一步我们就将 I.MX6U 的主频先设置为 24MHz,直接来自于外部的
24M 晶振。
③、设置寄存器 CCM_ANALOG_PLL_ARMn,将 pll1_main_clk(PLL1)设置为 1056MHz。
④、设置寄存器 CCSR 的 PLL1_SW_CLK_SEL 位,重新将 pll1_sw_clk 的时钟源切换回
pll1_main_clk,切换回来以后的 pll1_sw_clk 就等于 1056MHz。
⑤、最后设置寄存器 CCM_CACRR 的 ARM_PODF 为 2 分频,I.MX6U 的内核主频就为
1056/2=528MHz。 

PFD  时钟设置
设置好主频以后我们还需要设置好其他的 PLL 和 PFD 时钟

PLL2、PLL3 和 PLL7 固定为 528MHz、480MHz 和 480MHz,PLL4~PLL6 都是针对特殊外设
的,用到的时候再设置。因此,接下来重点就是设置 PLL2 和 PLL3 的各自 4 路 PFD

PFD的推荐时钟频率为

先设置 PLL2 的 4 路 PFD 频率,用到寄存器是 CCM_ANALOG_PFD_528n

可以看出,寄存器 CCM_ANALOG_PFD_528n 其实分为四组,分别对应
PFD0~PFD3,每组 8 个 bit,我们就以 PFD0 为例,看一下如何设置 PLL2_PFD0 的频率。PFD0对应的寄存器位如下:
PFD0_FRAC: PLL2_PFD0 的分频数,PLL2_PFD0 的计算公式为 528*18/PFD0_FRAC,此
为 可 设 置 的 范 围 为 12~35 。 如 果 PLL2_PFD0 的 频 率 要 设 置 为 352MHz 的 话
PFD0_FRAC=528*18/352=27。
PFD0_STABLE: 此位为只读位,可以通过读取此位判断 PLL2_PFD0 是否稳定。
PFD0_CLKGATE: PLL2_PFD0 输出使能位,为 1 的时候关闭 PLL2_PFD0 的输出,为 0 的
时候使能输出。 

 

AHB 、IPG 和 和 PERCLK  根时钟设置
7 路 PLL 和 8 路 PFD 设置完成以后最后还需要设置 AHB_CLK_ROOT 和 IPG_CLK_ROOT
的时钟,I.MX6U 外设根时钟可设置范围如图

 AHB_CLK_ROOT 最高可以设置 132MHz,IPG_CLK_ROOT和PERCLK_CLK_ROOT最高可以设置66MHz。那我们就将AHB_CLK_ROOT、IPG_CLK_ROOT 和 PERCLK_CLK_ROTO 分 别 设 置 为 132MHz 、 66MHz 、 66MHz 。AHB_CLK_ROOT 和 IPG_CLK_ROOT 的涉及如图

 

 要生成AHB_CLK_ROOT就要

1.配置CBCMR寄存器的pre_periph_clk_sel位

 可以选择 PLL2、PLL2_PFD2、PLL2_PFD0和 PLL2_PFD2/2。

 默认选择 PLL2_PFD2,因此 pre_periph_clk=PLL2_PFD2=396MHz。

2.配置 CCM_CBCDR寄存器的PERIPH_CLK_SEL位

当 CCM_CBCDR 的 PERIPH_CLK_SEL 位为 0 的时候periph_clk=pr_periph_clk=396MHz。

3.通过 CBCDR 的 AHB_PODF 位来设置 AHB_CLK_ROOT 的分频值,可以设置 1~8 分频,如果想要 AHB_CLK_ROOT=132MHz 的话就应该设置为 3 分频:396/3=132MHz。

4.通过 CBCDR 的 IPG_PODF 位来设置 IPG_CLK_ROOT 的分频值,可以设置 1~4 分频,IPG_CLK_ROOT 时钟源是 AHB_CLK_ROOT,要想 IPG_CLK_ROOT=66MHz 的话就应该设置2 分频:132/2=66MHz。

5.设置PERCLK_CLK_ROOT 时钟频率

 可 以 看 出 , PERCLK_CLK_ROOT 来 源 有 两 种 : OSC(24MHz) 和IPG_CLK_ROOT,由寄存器 CCM_CSCMR1 的 PERCLK_CLK_SEL 位来决定,如果为 0 的话PERCLK_CLK_ROOT 的 时 钟 源 就 是 IPG_CLK_ROOT=66MHz 。 可 以 通 过 寄 存 器CCM_CSCMR1 的 PERCLK_PODF 位来设置分频,如果要设置 PERCLK_CLK_ROOT 为 66MHz
的话就要设置为 1 分频。

在修改如下时钟选择器或者分频器的时候会引起与 MMDC 的握手发生:
①、mmdc_podf
②、periph_clk_sel
③、periph2_clk_sel
④、arm_podf
⑤、ahb_podf
发生握手信号以后需要等待握手完成,寄存器 CCM_CDHIPR 中保存着握手信号是否完成,如果相应的位为 1 的话就表示握手没有完成,如果为 0 的话就表示握手完成

 

注意:

PLL禁用和启用是通过模拟模块完成的。在使用模拟寄存器禁用PLL之前,软件应首先移动所有从该特定PLL生成的时钟到另一个源。 这个替代来源可能是另一个PLL或另一个PLL驱动的PFD。 或者,软件可以绕过PLL,并使用PLL参考时钟(通常为24MHz)作为输出时钟。 绕过PLL通过将控制寄存器中的模拟BYPASS位置1来完成

对于无法停止的时钟(核心时钟和总线时钟),应通过无故障的多路复用器。 更改PLL设置之前,请先将其关闭。 上电后给PLL上电

 

 

 


http://www.ppmy.cn/news/808145.html

相关文章

别再说被八股文害惨了!GitHub阿里Java面试题库标星145K不无道理

最近接二连三收到一些朋友的喜讯,求职和跳槽都有很不错的结果。虽然总说今年情况不太好,但还是有一部分成功上岸的,和大家分享一个典型例子:学弟工作一年半,薪资9K出头,最开始目标是跳槽到货拉拉、唯品会这…

金九银十互联网大厂Java面试1000问,覆盖一线大厂各种面试痛点

不知不觉马上要到金九银十的跳槽黄金月,跳槽结果有人欢喜有人愁,找到好的下家固然可喜,跳槽结果不理想的朋友也不必丧气,只要扎实提升自己的技术,弄明白大厂面试官的出题逻辑,进大厂必是水到渠成。 之前有…

IoT开发者为王,涂鸦智能硬核“靠边站”

文 | 智能相对论 作者 | 沈浪 6月底,全球化IoT开发平台服务商涂鸦智能开了个TUYA开发者大会,面向行业传达了两个关键的信息点: 1. 当前IoT领域的行业竞争不再局限于技术、渠道的单一纬度,开始演化为整体的生态之争。 2. 紧随行…

是什么?为什么?怎么做?

作为一个制造行业的质量人,曾经学过的质量工具就有5w2h ( when,why ,who ,what ,which,how ,how much),可用于调查事情的发生的经过及前因后果(也有用此作为开发新项目结构);还有5why ,通过5个为什么,挖掘潜…

[解决Github 克隆错误] unable to access ‘xxx‘: Recv failure: Connect

1.错误描述: 从GitHub上克隆仓库到本地,出现错误: unable to access https://github.com/xxxx: Recv failure: Connection was reset。 克隆失败。 2.第一次解决此问题:从终端输入: git config --global http.sslVer…

【转载】我心目中的android机器档次

发信人: Jdy (king|小金|抬头看天), 信区: Android 标 题: 【转载】我心目中的android机器档次(转载) 发信站: 武汉白云黄鹤站 (2011年04月14日12:36:22 星期四), 站内信件 【 以下文字转载自 MobileDigit 讨论区 】 【 原文由 Jdy 所发表 】 发信人: alexlaugb (我晕), 信区:…

U盘启动

如何设置U盘启动 http://jingyan.baidu.com/article/ab0b5630d340f6c15afa7d32.html http://jingyan.baidu.com/article/72ee561a9d330fe16138dfe3.html U大师U盘启动盘 教你如何修改Windows登录密码 http://jingyan.baidu.com/article/b87fe19ea352c052183568f6.html 启动…

C++面试100问

include双引号与尖括号的区别 #include <stdio.h>代表文件是一个工程或标准头文件。过程会检查预定义目录&#xff0c;我们可以根据设置路径来修改搜索目录。 #include "xxx.h"&#xff0c;用户提供的头文件。 常量指针和指针常量 常量的指针&#xff1a;指…