• 嵌入式Linux裸机开发(四)IMX6U主频和时钟配置


    系列文章目录



    介绍

    默认配置下 I.MX6U 工作频率为 396MHz,但该系列标准工作频率事528MHz,有些型号甚至可以工作到696MHz。

    默认情况下内部 boot rom 会将 I.MX6U 的主频设置为 396MHz,下面介绍如何配置为528MHz

    详细内容在参考手册的第十章和第十八章:

    在这里插入图片描述
    在这里插入图片描述

    时钟来源

    I.MX6U-ALPHA 开发板的系统时钟来源于两部分: 32.768KHz 和24MHz 的晶振
    32.768KHz 晶振是 I.MX6U 的 RTC 时钟源, 24MHz 晶振是 I.MX6U 内核和其它外设的时钟源(和STM32很像)
    在这里插入图片描述

    PLL时钟源

    外设时钟源分为7组,都是通过24MHz晶振的PLL得来的

    在这里插入图片描述
    这么复杂,黄色标注的都是寄存器,也就是需要配置的

    内核时钟

    在这里插入图片描述
    箭头所指的此处没有进行 2 分频

    配置:
    PLL1 可以设置为1056MHz,寄存器 CCM_CACRR 的 ARM_PODF 位设置为 2 分频,内核主频为 528MHz。
    PLL1 就可以设置为 696MHz, CCM_CACRR 的 ARM_PODF 设置为 1 分频,主频设为 696MHz。

    PLL1 的频率可以通过寄存器 CCM_ANALOG_PLL_ARMn 来设置:

    CCM_CACRR 的 ARM_PODF:
    在这里插入图片描述
    CCM_ANALOG_PLL_ARMn :
    在这里插入图片描述
    DIV_SELECT: 此位设置 PLL1 的输出频率,可设置范围为: 54~108, PLL1 CLK = Fin *div_seclec/2.0, Fin=24MHz。如果 PLL1 要输出 1056MHz 的话, div_select 就要设置为 88。

    但是在修改PLL1时钟频率的时候,需要将内核时钟切换到其他的时钟源:
    在这里插入图片描述
    用到的寄存器寄存器 CCM_CCSR,切换到 osc_clk,也就是 24MHz 的晶振

    	/* 1、设置ARM内核时钟为792MHz */
    	/* 1.1、判断当前ARM内核是使用的那个时钟源启动的,正常情况下ARM内核是由pll1_sw_clk驱动的,而
    	 *      pll1_sw_clk有两个来源:pll1_main_clk和tep_clk。
    	 *      如果我们要让ARM内核跑到792M的话那必须选择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 << 8);				/* 配置step_clk时钟源为24MH OSC */	
    		CCM->CCSR |= (1 << 2);				/* 配置pll1_sw_clk时钟源为step_clk */
    	}
    
    	/* 1.2、设置pll1_main_clk为792MHz
    	 *      因为pll1_sw_clk进ARM内核的时候会被二分频!
    	 *      配置CCM_ANLOG->PLL_ARM寄存器
    	 *      bit13: 1 使能时钟输出
    	 *      bit[6:0]: 66, 由公式:Fout = Fin * div_select / 2.0,792=24*div_select/2.0,
    	 *              		得出:div_select=    66 
    	 */
    	CCM_ANALOG->PLL_ARM = (1 << 13) | ((66 << 0) & 0X7F); 	/* 配置pll1_main_clk=792MHz */
    	CCM->CCSR &= ~(1 << 2);									/* 将pll_sw_clk时钟重新切换回pll1_main_clk */
    	CCM->CACRR = 0;											/* ARM内核时钟为pll1_sw_clk/1=792/1=792Mhz */
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    PFD时钟

    PLL2、 PLL3 和 PLL7 固定为 528MHz、 480MHz 和 480MHz, PLL4~PLL6 都是针对特殊外设的,用到的时候再设置。
    在这里插入图片描述
    以PLL2为例子,寄存器是 CCM_ANALOG_PFD_528n:
    在这里插入图片描述
    分为四组,分别对应PFD0~PFD3,每组 8 个 bit
    每组对应的寄存器为:
    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: 为 1 的时候关闭 PLL2_PFD0 的输出,为 0 的时候使能输出。

    其余同理

    AHB、 IPG 和 PERCLK 根时钟设置

    7 路 PLL 和 8 路 PFD 设置完成以后最后还需要设置 AHB_CLK_ROOT 和 IPG_CLK_ROOT的时钟

    在这里插入图片描述

    我们就将 AHB_CLK_ROOT、IPG_CLK_ROOT 和 PERCLK_CLK_ROOT 分 别 设 置 为 132MHz 、 66MHz 、 66MHz
    在这里插入图片描述
    这些东西全在参考手册里面:
    在这里插入图片描述

    结语

    暂时先这样,先不深入学习了,内容太多了

  • 相关阅读:
    《算法导论》15章-动态规划 15.1 钢条切割(含有C++代码)
    目标检测YOLO实战应用案例100讲-基于无人机的轻量化目标检测系统设计(续)
    作为“初学者”应该怎么上手力扣题
    字符串的简单介绍和字符串的大小比较
    如何选择最适合您需求的数据恢复工具?适用于 Windows 的 7 大数据恢复工具
    安装.net framework报错“...扩展属性不一致”
    阿里巴巴K8S集成seata
    【信号处理】非线性信号处理(Python代码实现)
    nvm管理多个版本的nodejs
    复杂的C++继承
  • 原文地址:https://blog.csdn.net/zerokingwang/article/details/133641727