五、IMX6ULL主频和时钟配置 您所在的位置:网站首页 时钟频率和主频的区别 五、IMX6ULL主频和时钟配置

五、IMX6ULL主频和时钟配置

2024-06-17 08:06| 来源: 网络整理| 查看: 265

系列文章目录

一、IMX6LL裸机点亮一颗LED 二、移植IMX6ULL_SDK点亮LED 三、IMX6ULL BSP工程管理 四、IMX6ULL按键输入

文章目录 系列文章目录前言一、工作频率二、系统时钟来源三、7路PLL时钟源四、时钟树简介五、内核时钟配置六、PDF时钟设置七、AHB、IPG、PERCLK根时钟设置八、代码

前言

本章学习IMX6U时钟和主频配置

一、工作频率

我们没有配置过时钟和主频,默认情况下IMX6UL内部的boot rom 会将工作频率设置为396Mhz,但I.MX6U标准的工作频率为528Mhz

二、系统时钟来源

在这里插入图片描述 其中32.768Khz是RTC时钟源 24Mhz是内核和其他外设的时钟源

三、7路PLL时钟源

不同外设时钟源不同,NXP将这些外设分为7组,这7组时钟源都来自24Mhz的倍频或分频。 在这里插入图片描述 1、ARM_PLL(PLL1):提供ARM内核使用 2、528_PLL(PLL2):System PLL 固定22倍频,不可编程 PLL=2422 = 528Mhz 分出4路PFD PLL2_PDF0-PLL2_PDF3 3、USB1_PLL(PLL3):用于USBPHY 固定20倍频 PLL=2420 = 480Mhz 分出4路PFD PLL3_PDF0-PLL3_PDF3 4、USB2_PLL(PLL7):用于USBPHY2 固定20倍频 PLL=2420 = 480Mhz 5、ENET_PLL(PLL6):用于生成网络时钟 固定20+5/6倍频 PLL = 24(20+5/6)=500Mhz 6、VIDEO_PLL(PLL5):用于显示相关的外设 PLL倍频可调整 输出范围650Mhz~1300Mhz 还可分频 1/2/4/8/16 7、AUDIO_PLL(PLL4):用于音频相关外设 PLL倍频可调整 输出范围650Mhz~1300Mhz 还可分频 1/2/4

四、时钟树简介

在这里插入图片描述 图中一共分为三部分 1、CLOCK SWITCHER:时钟切换器 7路PLL 8路PFD 2、CLOCK ROOT GENERATOR:时钟根发生器 给外设选择合适的时钟源 3、SYSTEM CLOCKS:系统时钟 外设时钟

五、内核时钟配置

1、我们先将I.MX6U主频设置为528Mhz 在这里插入图片描述 从图中可以看到,内核时钟由PLL1提供,通过CACRR的ARM_PODF位设置分频 在这里插入图片描述

查找手册,PLL1时钟频率,通过设置CCM_ANALOG_PLL_ARM的DIV_SELECT位,用24Mhz倍频得到 例:我想让PLL1输出1056Mhz 那么根据图中公式 1056 = 24 * DIV_SEL/2 DIV_SEL=88 DIV_SELECT位设置为88

在这里插入图片描述 图中pll_sw_clk就是PLL1最终输出的频率,CCSR:pll1_sw_clk_sel位为选择器,选择PLL1时钟源为pll1_main_clk还是step_clk,ps:当我们需要修改PLL1频率时,需要先切换到step_clk,修改完成后,在切换回pll1_main_clk才能生效。

六、PDF时钟设置

主频设置完成还需要设置其他PLL和PFD时钟,这里使用NXP官方推荐值 NXP推荐 这里先设置PLL2的4路PFD,查找手册。 在这里插入图片描述 图中可以看出,PLL2和PLL3的4路PFD是通过设置CCM_ANALOG_PFD_480n和CCM_ANALOG_PFD_528n这两个寄存器的

在这里插入图片描述 在这里插入图片描述 我们现在设置PLL2_PFD0这一路的频率 PFD0_FRAC:分频数 范围12~35 假如我们要设置这一路频率为352Mhz,根据上面公式,352=528*18/PFD0_FRAC , PFD0_FRAC= 27 ,这个位就要设置为27,那么这一路频率就为352Mhz PFD0_STABLE:此位为只读位,可以通过读取此位判断PLL2_PFD0是否稳定 PFD0_CLKGATE: PLL2_PFD0 输出使能位,为 1 的时候关闭 PLL2_PFD0 的输出,为 0 的 时候使能输出。 PLL3_PFD4路时钟配置类似,这里不再总结

七、AHB、IPG、PERCLK根时钟设置

配置范围如下 配置 可以将这三个根时钟配置为最大,具体步骤不在总结,跟上面类似,参考参考手册中的时钟树,配置寄存器即可。 在这里插入图片描述 在这里插入图片描述

八、代码 void imx6u_clkinit(void) { unsigned int reg = 0; // ARM if ((((CCM->CCSR) >> 2) & 0x1 ) == 0) { /* code */ CCM->CCSR &= ~(1


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有