I.MX6U 的系统主频为 528MHz,但是默认情况下内部 boot rom 会将 I.MX6U 的主频设置为396MHz
I.MX6U-ALPHA 开发板的系统时钟来源于两部分: 32.768KHz 和24MHz 的晶振,其中 32.768KHz 晶振是 I.MX6U 的 RTC 时钟源, 24MHz 晶振是 I.MX6U 内核和其它外设的时钟源
时钟树:
时钟树一共有三部分: CLOCK_SWITCHER、 CLOCK ROOT GENERATOR 和SYSTEM CLOCKS。CLOCK_SWITCHER 是 7 路 PLL 和8 路 PFD,SYSTEM CLOCKS 是芯片外设时钟,CLOCK ROOT GENERATOR 从 7 路PLL 和 8 路 PFD 中选择合适的时钟源经过分频给外设使用。
注:中间的每一条不同颜色的线表示来自不同的时钟源,结合左边图标注释分析,比如,黄色的标志表示选择时钟源寄存器的位设置,红色的标志表示时钟源分频系数寄存器位的设置。
为了方便生成时钟,阿尔法从24MHz晶振生出来7路PLL。PLL2和PLL3又生成4路的PDF0-3。
ARM_PLL(PLL1):供 ARM 内核使用的, ARM 内核时钟就是由此 PLL生成的,此 PLL 通过编程的方式最高可倍频到 1.3GHz
528_PLL(PLL2):也叫做 System_PLL,PLL2 是固定的 22 倍频,PLL2 =24MHz * 22 = 528MHz,PLL2又分为4路PFD: PLL2_PFD0~PLL2_PFD3。这 4 路 PFD 和 528_PLL共同作为内部系统总线的时钟源和其它很多外设的根时钟源
USB1_PLL(PLL3):主要用于 USBPHY,PLL3是固定的20倍分频,USB1_PLL=24MHz *20=480MHz
AUDIO_PLL(PLL4):用于音频相关的外设
VIDEO_PLL(PLL5):用于显示相关的外设
ENET_PLL(PLL6):用于生成网络所需的时钟,PLL6固定为20+5/6倍频, ENET_PLL=24MHz * (20+5/6)= 500MHz
USB2_PLL(PLL7):用于USB2PHY,PLL7固定为20倍频,因此PLL7=480MHz
时钟树配置外设时钟:(ESAI外设为例)
(1)这是时钟源选择器,有4个可选的时钟源: PLL4、 PLL5、 PLL3_PFD2 和 pll3_sw_clk 。 具 体 选 择 哪 一 路 作 为 ESAI 的 时 钟 源 是 由 寄 存 器 CCM->CSCMR2 的ESAI_CLK_SEL 位来决定的(正上方黄色标志部分)
(2)时钟分频器,分频值由寄存器 CCM_CS1CDR 的 ESAI_CLK_PRED来确定的,可设置 1~8 分频(浅蓝色是3bit分配器, 图标)
(3)和2一样的作用,经过两次分频得到ESAI_CLK_ROOT外设时钟源
2.内核时钟目的:将ARM 内核时钟设置为528Mhz
(1)内核时钟源来自于 PLL1,然后经过一次2分频得到系统时钟(后面的灰色的分频器是static divider,不进行分频),所以要设置系统时钟为528MHz, 需要修改PLL1的值为528 * 2 = 1056MHz < 1.3GHz,PLL1 的频率通过寄存器 CCM_ANALOG_PLL_ARMn 来设置
CCM_CACRR 寄存器(分频)
ARM_PODF只用了第3位,设置为2分频,寄存器写入1即可
CCM_ANALOG_PLL_ARMn(频率)
13位:时钟输出使能,1:使能PLL1输出;0:关闭PLL1输出 DIV_SELECT: 设置 PLL1 的输出频率,PLL1 CLK = Fin *div_seclec/2.0, Fin=24MHz 可写入范围:54~108,所以PLL1 要输出 1056MHz , div_select 要设置为 88
(2)但是在修改 PLL1 时钟频率的时候需要先将内核时钟源改为其他的时钟源,因为一般默认选择PLL1提供时基并且修改时必须要有时钟给系统提供时基。
pll1_sw_clk 是 PLL1的输出频率,时钟来源:pll1_main_clk 和 step_clk,由寄存器 CCM_CCSR 的PLL1_SW_CLK_SEL 位决定
而step_clk 的时钟源可以来自osc_clk和secondary_clk,一般选择 osc_clk(24MHz 的晶振),由寄存器 CCM_CCSR的STEP_SEL位决定
/* 1.1、判断当前ARM内核是使用的那个时钟源启动的,正常情况下ARM内核是由pll1_sw_clk驱动的,而
* pll1_sw_clk有两个来源:pll1_main_clk和tep_clk。
* 如果我们要让ARM内核跑到528M的话那必须选择pll1_main_clk作为pll1的时钟源。
* 如果我们要修改pll1_main_clk时钟的话就必须先将pll1_sw_clk从pll1_main_clk切换到step_clk,
* 当修改完pll1_main_clk以后在将pll1_sw_clk切换回pll1_main_clk。而step_clk的时钟源可以选择
* 板子上的24MHz晶振。
*/
if((((CCM->CCSR) >> 2) & 0x1 ) == 0) /* 当前pll1_sw_clk使用的pll1_main_clk*/
{
CCM->CCSR &= ~(1 CCSR |= (1 PLL_ARM寄存器
* bit13: 1 使能时钟输出
* bit[6:0]: 88, 由公式:Fout = Fin * div_select / 2.0,528=24*div_select/2.0,
* 得出:div_select= 88
*/
CCM_ANALOG->PLL_ARM = (1 PFD_528;
reg &= ~(0X3F3F3F3F); /* 清除原来的设置 */
reg |= 32
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?