小工具知识网

当前位置: 首页 > 行业知识 > I.MX6ULL主频和时钟配置实验

行业知识

I.MX6ULL主频和时钟配置实验

2026-11-11 17:12:09 来源:互联网转载

系列文章目录

I.MX6ULL主频和时钟配置实验


一、前言

在之前实验中我们都没有涉及到 I.MX6U 的时钟和主频配置操作,全部使用的默认配置,默认配置下 I.MX6U 工作频率为 396MHz。但是 I.MX6U 系列标准的工作频率为528MHz,有些型号甚至可以工作到 696MHz。

本节学习 I.MX6U 的时钟系统,学习如何配置 I.MX6U 的系统时钟和其他的外设时钟,使其工作频率为 528MHz,其他的外设时钟源都工作在 NXP 推荐的频率。


三、硬件原理

打开 I.MX6U-ALPHA 开发板原理图,开发板时钟原理图如图所示:

从图可以看出 I.MX6U-ALPHA 开发板的系统时钟来源于两部分:32.768KHz 和

24MHz 的晶振,其中 32.768KHz 晶振是 I.MX6U 的 RTC 时钟源,24MHz 晶振是 I.MX6U 内核和其它外设的时钟源。在6U的T16和T17这两个IO上接了一个24MHz的晶振。


五、时钟树简介

I.MX6U 的所有外设时钟源都是从这 7 路 PLL 和有些 PLL 的PFD 而来的,这些外设究竟是如何选择 PLL 或者 PFD 的?这个就要借助《IMX6ULL 参考手册》里面的时钟树了,在“Chapter 18 Clock Controller Module (CCM)”的 18.3 小节给出了 I.MX6U详细的时钟树图,如图所示:

在图中一共有三部分:CLOCK_SWITCHER、CLOCK ROOT GENERATOR 和

SYSTEM CLOCKS。其中左边的 CLOCK_SWITCHER 就是我们上一小节讲解的那 7 路 PLL 和

8 路 PFD,右边的 SYSTEM CLOCKS 就是芯片外设,中间的 CLOCK ROOT GENERATOR 是最

复杂的!这一部分,给左边的CLOCK_SWITCHER和右边的SYSTEM CLOCKS进行牵线搭桥。外设时钟源是有多路可以选择的,CLOCK ROOT GENERATOR 就负责从 7 路PLL 和 8 路 PFD 中选择合适的时钟源给外设使用。具体操作肯定是设置相应的寄存器,我们以ESAI 这个外设为例,ESAI 的时钟图如图所示:

在图中我们分为了 3 部分,这三部分如下:

①、此部分是时钟源选择器,ESAI 有 4 个可选的时钟源:PLL4、PLL5、PLL3_PFD2 和

pll3_sw_clk 。 具 体 选 择 哪 一 路 作 为 ESAI 的 时 钟 源 是 由 寄 存 器 CCM->CSCMR2 的

ESAI_CLK_SEL 位来决定的,用户可以自由配置,配置如图所示:

②、此部分是 ESAI 时钟的前级分频,分频值由寄存器 CCM_CS1CDR 的 ESAI_CLK_PRED

来确定的,可设置 1~8 分频,假如现在 PLL4=650MHz,我们选择 PLL4 作为 ESAI 时钟,前级

分频选择 2 分频,那么此时的时钟就是 650/2=325MHz。

③、此部分又是一个分频器,对②中输出的时钟进一步分频,分频值由寄存器

CCM_CS1CDR 的 ESAI_CLK_PODF 来决定,可设置 1~8 分频。假如我们设置为 8 分频的话,

经过此分频器以后的时钟就是 325/8=40.625MHz。因此最终进入到 ESAI 外设的时钟就是

40.625MHz。

上面我们以外设 ESAI 为例讲解了如何根据图来设置外设的时钟频率,其他的外设基本类似的,大家可以自行分析一下其他的外设。关于外设时钟配置相关内容全部都在《I.MX6ULL 参考手册》的第 18 章。

官方参考手册第18章外设时钟源推荐值:


七、PFD 时钟设置

设置好主频以后我们还需要设置好其他的 PLL 和 PFD 时钟,PLL1已经设置了,PLL2、PLL3 和 PLL7 固定为 528MHz、480MHz 和 480MHz,PLL4~PLL6 都是针对特殊外设的,用到的时候再设置。因此,接下来重点就是设置 PLL2 和 PLL3 的各自 4 路 PFD,NXP 推荐的这 8 路 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 的计算公式为 52818/PFD0_FRAC,此

为 可 设 置 的 范 围 为 12~35 。 如 果 PLL2_PFD0 的 频 率 要 设 置 为 352MHz 的 话

PFD0_FRAC=52818/352=27。

PFD0_STABLE: 此位为只读位,可以通过读取此位判断 PLL2_PFD0 是否稳定。

PFD0_CLKGATE: PLL2_PFD0 输出使能位,为 1 的时候关闭 PLL2_PFD0 的输出,为 0 的

时候使能输出。

如果我们要设置 PLL2_PFD0 的频率为 352MHz 的话就需要设置 PFD0_FRAC 为 27,

PFD0_CLKGATE 为 0 。 PLL2_PFD1~PLL2_PFD3 设置类似,频率计算公式都是

528*18/PFDX_FRAC(X=1~3) ,因此 PLL2_PFD1=594MHz 的话, PFD1_FRAC=16 ;

PLL2_PFD2=400MHz 的话 PFD2_FRAC 不能整除,因此取最近的整数值,即 PFD2_FRAC=24,

这样 PLL2_PFD2 实际为 396MHz;PLL2_PFD3=297MHz 的话,PFD3_FRAC=32。

接 下 来 设 置 PLL3_PFD0~PLL3_PFD3 这 4 路 PFD 的 频 率 , 使 用 到 的 寄 存 器 是

CCM_ANALOG_PFD_480n,此寄存器结构如图所示:

从图可以看出,寄存器 CCM_ANALOG_PFD_480n 和 CCM_ANALOG_PFD_528n

的结构是一模一样的,只是一个是 PLL2 的,一个是 PLL3 的。寄存器位的含义也是一样的,只

是 频 率 计 算 公 式 不 同 , 比 如 PLL3_PFDX=480*18/PFDX_FRAC(X=0~3) 。如果

PLL3_PFD0=720MHz 的话,PFD0_FRAC=12;如果 PLL3_PFD1=540MHz 的话,PFD1_FRAC=16;

如果 PLL3_PFD2=508.2MHz 的话,PFD2_FRAC=17;如果 PLL3_PFD3=454.7MHz 的话,

PFD3_FRAC=19。


九、实验程序编写

本试验在链接的试验的基础上完成,因为本试验是配置 I.MX6U 的系统时钟,因

此我们直接在文件“bsp_clk.c”上做修改,修改 bsp_clk.c 的内容如下:

#include "bsp_clk.h"/** @description : 使能 I.MX6U 所有外设时钟* @param : 无* @return : 无*/void clk_enable(void){CCM->CCGR0 = 0XFFFFFFFF;CCM->CCGR1 = 0XFFFFFFFF;CCM->CCGR2 = 0XFFFFFFFF;CCM->CCGR3 = 0XFFFFFFFF;CCM->CCGR4 = 0XFFFFFFFF;CCM->CCGR5 = 0XFFFFFFFF;CCM->CCGR6 = 0XFFFFFFFF;}/** @description : 初始化系统时钟 528Mhz,并且设置 PLL2 和 PLL3 各个PFD 时钟,所有的时钟频率均按照 I.MX6U 官方手册推荐的值.* @param : 无* @return : 无*/void imx6u_clkinit(void){unsigned int reg = 0;/* 1、设置 ARM 内核时钟为 528MHz *//* 1.1、判断当使用哪个时钟源启动的,正常情况下是由 pll1_sw_clk 驱动的,而* pll1_sw_clk 有两个来源:pll1_main_clk 和 step_clk,如果要* 让 I.MX6ULL 跑到 528M,那必须选择 pll1_main_clk 作为 pll1 的时钟* 源。如果我们要修改 pll1_main_clk 时钟的话就必须先将 pll1_sw_clk 从* pll1_main_clk 切换到 step_clk,当修改完以后再将 pll1_sw_clk 切换* 回 pll1_main_cl,step_clk 等于 24MHz。*/if((((CCM->CCSR) >> 2) & 0x1 ) == 0) /* pll1_main_clk */{ CCM->CCSR &= ~(1 CCSR |= (1 PLL_ARM 寄存器* bit13: 1 使能时钟输出* bit[6:0]: 88, 由公式:Fout = Fin * p_select / 2.0,* 1056=24*p_select/2.0, 得出:p_select=88。 */CCM_ANALOG->PLL_ARM = (1 PFD_528;reg &= ~(0X3F3F3F3F); /* 清除原来的设置 */reg |= 323 int i = 0;4 int keyvalue = 0;5 unsigned char led_state = OFF;6 unsigned char beep_state = OFF;7 8 imx6u_clkinit(); /* 初始化系统时钟 */9 clk_enable(); /* 使能所有的时钟 */10 led_init(); /* 初始化 led */11 beep_init(); /* 初始化 beep */12 key_init(); /* 初始化 key */1314 /* 省略掉其它代码 */15 }
p上述代码的第 8 行就是时钟初始化函数,时钟初始化函数最好放到最开始的地方调用。/p hr color="#000000" size="1"" / h2十、编译下载/h2 h310.1编写 Makefile 和链接脚本/h3 p本试验在链接的试验的基础上完成,而且本章试验没有添加任何新的文件,因此只需/pp要修改 Makefile 的变量 TARGET 为“clk”即可,如下所示:/p pre TARGET ?= clk/pre p链接脚本保持不变。/p h310.2编译下载/h3 p使用 Make 命令编译代码,编译成功以后使用软件 imxdownload 将编译完成的 clk.bin 文件/pp下载到 SD 卡中,命令如下:/p pre chmod 777 imxdownload //给予 imxdownload 可执行权限,一次即可./imxdownload clk.bin /dev/sdd //烧写到 SD 卡中,不能烧写到/dev/sda 或 sda1 设备里面!/pre p烧写成功以后将 SD 卡插到开发板的 SD 卡槽中,然后复位开发板。本试验效果其实和试验本试验在链接的试验的基础上完成一样,但是 LED 灯的闪烁频率相比之前试验要快一点。因为试验之前实验的主频是 396MHz,而本试验的主频被配置成了 528MHz,因此代码执行速度会变快,所以延时函数的运行就会加快。/p hr color="#000000" size="1"" />

END

上一篇:mc怎么去别人的服务器?

下一篇:云服务器cvm怎么使用?