I.MX6ULL时钟讲解

时钟组成

1、晶振

  • 32.768khz的晶振,共给RTC使用。
  • 在6U的T16和T17这两个IO上接了一个24MHz的晶振。

2、24MHz晶振衍生出7路PLL
为了方便生成时钟,又从24MHz晶振生出来7路PLL。这7路PLL中有的又生出来PFD。

  • PLL1:ARM PLL供给ARM内核。
  • PLL2:sysytem PLL,528MHz,528_PLL,此路PLL分出了4路PFD,分别为PLL2_PFD0~PFD3
  • PLL3: USB1 PLL,480MHz 480_PLL,此路PLL分出了4路PFD,分别为PLL3_PFD0~PFD3。
  • PLL4: Audio PLL,主供音频使用。
  • PLL5: Video PLL,主供视频外设,比如RGB LCD接口,和图像处理有关的外设。
  • PLL6:ENET PLL,主供网络外设。
  • PLL7: USB2_PLL ,480MHz,无PFD。
    在这里插入图片描述

系统主频配置

设置ARM内核主频为528MHz

要设置ARM内核主频为528MHz,设置CACRR寄存器的ARM_PODF位为2分频,然后设置PLL1=1056MHz即可。

  • CACRR的bit3-0为ARM_PODF位,可设置0-7,分别对应1~8分频。这里设置CACRR寄存器的ARM_PODF=1,二分频。
    在这里插入图片描述
    在这里插入图片描述
  • 设置PLL1=1056MHz。PLL1=pll1_sw_clk。pll1_sw_clk有两路可以选择,分别为pll1_main_clk,和step_clk,通过CCSR寄存器的pll1_sw_clk_sel位(bit2)来选择。为0的时候选择pll1_main_clk(正常使用我们就用这个),为1的时候选额step_clk(修改时钟的时候临时用下)。
  • 在修改PLL1的时候,也就是设置系统时钟的时候需要给6ULL一个临时的时钟,也就是step_clk。在修改PLL1的时候需要将pll1_sw_clk切换到step_clk上。
  • 设置step_clk。Step_clk也有两路来源,由CCSR的step_sel位(bit8)来设置,为0的时候设置step_clk为osc=24MHz。为1的时候不重要,不用。
  • 时钟切换成功以后就可以修改PLL1的值。
    在这里插入图片描述
    在这里插入图片描述
  • 通过CCM_ANALOG_PLL_ARM寄存器的DIV_SELECT位(bit6~0)来设置PLL1的频率,公式位:
    Output = frefDIV_SEL/2 1056=24DIV_SEL/2=>DIEV_SEL=88。设置CCM_ANALOG_PLL_ARM寄存器的DIV_SELECT位 =88即可 。这时PLL1=1056MHz还要设置CCM_ANALOG_PLL_ARM寄存器的ENABLE位(bit13)为1,也就是使能输出。
  • 在切换回PLL1之前,设置置CACRR寄存器的ARM_PODF=1!!切记。
    在这里插入图片描述
    在这里插入图片描述
	/* 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.0792=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;	

各个PLL时钟的配置

PLL2和PLL3。PLL2固定为528MHz,PLL3固定为480MHz。
在这里插入图片描述

初始化PLL2_PFD0~PFD3

初始化PLL2_PFD0~PFD3。寄存器CCM_ANALOG_PFD_528用于设置4路PFD的时钟。比如PFD0= 52818/PFD0_FRAC。设置PFD0_FRAC位即可。比如PLL2_PFD0=352M=52818/PFD0_FRAC,因此FPD0_FRAC=27。
在这里插入图片描述
在这里插入图片描述

	unsigned int reg = 0;

	/* 2、设置PLL2(SYS PLL)各个PFD */
	reg = CCM_ANALOG->PFD_528;
	reg &= ~(0X3F3F3F3F);		/* 清除原来的设置 						*/
	reg |= 32<<24;				/* PLL2_PFD3=528*18/32=297Mhz 	*/
	reg |= 24<<16;				/* PLL2_PFD2=528*18/24=396Mhz(DDR使用的时钟,最大400Mhz) */
	reg |= 16<<8;				/* PLL2_PFD1=528*18/16=594Mhz 	*/
	reg |= 27<<0;				/* PLL2_PFD0=528*18/27=352Mhz  	*/
	CCM_ANALOG->PFD_528=reg;	/* 设置PLL2_PFD0~3 		 		*/

初始化PLL3_PFD0~PFD3

配置的目标见上,也就是时钟树中标出来的那几个
在这里插入图片描述

	unsigned int reg = 0;
	
	/* 3、设置PLL3(USB1)各个PFD */
	reg = 0;					/* 清零   */
	reg = CCM_ANALOG->PFD_480;
	reg &= ~(0X3F3F3F3F);		/* 清除原来的设置 							*/
	reg |= 19<<24;				/* PLL3_PFD3=480*18/19=454.74Mhz 	*/
	reg |= 17<<16;				/* PLL3_PFD2=480*18/17=508.24Mhz 	*/
	reg |= 16<<8;				/* PLL3_PFD1=480*18/16=540Mhz		*/
	reg |= 12<<0;				/* PLL3_PFD0=480*18/12=720Mhz	 	*/
	CCM_ANALOG->PFD_480=reg;	/* 设置PLL3_PFD0~3 					*/	

其他外设时钟源配置

AHB_CLK_ROOT、PERCLK_CLK_ROOT以及IPG_CLK_ROOT。
因为PERCLK_CLK_ROOT和IPG_CLK_ROOT要用到AHB_CLK_ROOT,所以我们要初始化AHB_CLK_ROOT。
①、AHB_CLK_ROOT的初始化。
AHB_CLK_ROOT=132MHz。
设置CBCDR寄存器的PRE_PERIPH_CLK_SEL位,设置CBCDR寄存器的PERIPH_CLK_SEL位0。设置CBCDR寄存器的AHB_PODF位为2,也就是3分频,因此396/3=132MHz。

②、IPG_CLK_ROOT初始化
设置CBCDR寄存器IPG_PODF=1,也就是2分频。

③、PERCLK_CLK_ROOT初始化
设置CSCMR1寄存器的PERCLK_CLK_SEL位为0,表示PERCLK的时钟源为IPG。

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

	/* 4、设置AHB时钟 最小6Mhz, 最大132Mhz (boot rom自动设置好了可以不用设置)*/
	CCM->CBCMR &= ~(3 << 18); 	/* 清除设置*/ 
	CCM->CBCMR |= (1 << 18);	/* pre_periph_clk=PLL2_PFD2=396MHz */
	CCM->CBCDR &= ~(1 << 25);	/* periph_clk=pre_periph_clk=396MHz */
	while(CCM->CDHIPR & (1 << 5));/* 等待握手完成 */
		
	/* 修改AHB_PODF位的时候需要先禁止AHB_CLK_ROOT的输出,但是
	 * 我没有找到关闭AHB_CLK_ROOT输出的的寄存器,所以就没法设置。
	 * 下面设置AHB_PODF的代码仅供学习参考不能直接拿来使用!!
	 * 内部boot rom将AHB_PODF设置为了3分频,即使我们不设置AHB_PODF,
	 * AHB_ROOT_CLK也依旧等于396/3=132Mhz。
	 */
#if 0
	/* 要先关闭AHB_ROOT_CLK输出,否则时钟设置会出错 */
	CCM->CBCDR &= ~(7 << 10);	/* CBCDR的AHB_PODF清零 */
	CCM->CBCDR |= 2 << 10;		/* AHB_PODF 3分频,AHB_CLK_ROOT=132MHz */
	while(CCM->CDHIPR & (1 << 1));/
* 等待握手完成 */
#endif
	
	/* 5、设置IPG_CLK_ROOT最小3Mhz,最大66Mhz (boot rom自动设置好了可以不用设置)*/
	CCM->CBCDR &= ~(3 << 8);	/* CBCDR的IPG_PODF清零 */
	CCM->CBCDR |= 1 << 8;		/* IPG_PODF 2分频,IPG_CLK_ROOT=66MHz */
	
	/* 6、设置PERCLK_CLK_ROOT时钟 */
	CCM->CSCMR1 &= ~(1 << 6);	/* PERCLK_CLK_ROOT时钟源为IPG */
	CCM->CSCMR1 &= ~(7 << 0);	/* PERCLK_PODF位清零,即1分频 */
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
i.MX6ULL是NXP半导体推出的一款低功耗、高集成度的应用处理器,适用于嵌入式系统和物联网设备。在使用i.MX6ULL处理器运行Linux操作系统时,安全性是一个重要的考虑因素。 i.MX6ULL Linux系统的安全性可以从多个方面来考虑。首先,Linux操作系统本身具有良好的安全性,具备权限管理、访问控制、安全隔离等功能。通过合理的配置和管理,可以保护系统免受外部攻击。 其次,i.MX6ULL芯片本身也提供了一些安全特性,如硬件加密引擎和安全启动功能。硬件加密引擎可以加密数据传输,确保数据的机密性;安全启动功能则提供了验证和保护引导加载程序的机制,防止恶意软件的篡改。 此外,i.MX6ULL还支持TrustZone技术,通过硬件隔离将系统分成安全世界和非安全世界。在安全世界中,可以运行关键的安全任务,而非安全世界则可以运行一般的应用程序。这种硬件隔离可以提供额外的保护,防止恶意程序对关键数据和系统功能的攻击。 最后,开发者在使用i.MX6ULL时还可以采取一些安全措施,如定期更新操作系统和软件包、使用强密码、限制外部设备的访问等。同时,定期进行安全漏洞扫描和风险评估,及时修复发现的漏洞和弱点,也是提高系统安全性的重要手段。 综上所述,i.MX6ULL在运行Linux操作系统时可以通过合理配置、硬件特性和开发者的安全措施来提高系统的安全性,保障系统和数据的保密性、完整性和可用性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

成草

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值