嵌入式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 的晶振

c 复制代码
	/* 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 */

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=528 18/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

这些东西全在参考手册里面:

结语

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

相关推荐
食咗未1 天前
Linux USB HOST EXTERNAL STORAGE
linux·驱动开发
食咗未1 天前
Linux USB HOST HID
linux·驱动开发·人机交互
Xの哲學1 天前
Linux SLAB分配器深度解剖
linux·服务器·网络·算法·边缘计算
齐鲁大虾1 天前
UOS(统信操作系统)如何更新CUPS(通用Unix打印系统)
linux·服务器·chrome·unix
虾..1 天前
Linux 简单日志程序
linux·运维·算法
xingzhemengyou11 天前
STM32 Boot0 与 Boot1 [当 Flash 被误操作锁死或 SWD/JTAG 无法连接时,很有用]
stm32·单片机·嵌入式硬件
huoxingwen1 天前
Ubuntu 22.04 上 VMware Workstation 点击虚拟机窗口就消失的解决历程
linux·运维·ubuntu
姚青&1 天前
Linux 常用命令之基本命令
linux·运维·服务器
一路往蓝-Anbo1 天前
【第05期】数据的微观世界 (五) —— 浮点数 vs 定点数:MCU的数学课
linux·stm32·单片机·嵌入式硬件·物联网
G_H_S_3_1 天前
【网络运维】企业级监控平台Zabbix:部署与实践指南
linux·运维·网络·zabbix