三、系统频率

目录

一、系统时钟来源

二、时钟系统

三、系统主频修改

3.1 PLL1系统主频

3.2另一路频率设置

3.3 总结

4、代码


一、系统时钟来源

之前的实验中都是采用默认的时钟配置,IMX6ULL默认时钟是396MHz,本节就来配置IMX6ULL使其工作在推荐的528MHz,先看芯片的时钟来源,打开芯片核心板原理图

可以看到,芯片已经接了一个32.768KHz的晶振,这个晶振的频率很小,它是用来为系统的实时时钟RTC提供时钟的,一般的,XTALI和XTALO就是系统的时钟引脚,可以查看这两个引脚接到哪里去了?

可以看到系统外接了一个24MHz的晶振,这个晶振就是系统的时钟来源

二、时钟系统

打开芯片手册,找到系统时钟的章节,在这里更加直观的看到系统有两个时钟来源,分别是32.768KHz和24MHz,下面是IMX6ULL的时钟系统,

从图中可以看到,主要是对24MHz进行倍频或者是分频,得到系统的时钟树,主要分为7个大的时钟,下面根据数据手册的说明对7个时钟进行简单说明

PLL1:ARM_PLL,这个PLL是为ARM Core提供时钟来源
PLL2: 系统PLL,为528MHz,也叫做528_PLL,此路PLL又分出4路PFD,分别为PLL2_PFD0~PFD3
PLL3: USB1_PLL,从名字可以看出主要为USB1提供时钟,当然不止为USB提供时钟,480MHz 480_PLL,此路        PLL分出了4路PFD,分别为PLL3_PFD0~PFD3
PLL4: Audio,主要为音频相关提供时钟
PLL5: Video,主要为视频相关提供时钟
PLL6: ENET_PLL 主要为网络接口提供时钟
PLL7: USB2,为USB2接口提供时钟

更加详细的信息可以查看芯片手册,这7路PLL更加详细的划分就构成了芯片的时钟树

时钟树要从后面往前面看,首先找到需要配置的外设,再往前看这个外设的时钟由哪里得到,比如这里的ESAI接口的时钟

ESAI接口的时钟最后是由ESAI_CLK_ROOT来的,ESAI_CLK_ROOT经过2分频或者8分频得到,分频的配置从图上可以看到,是CS1CDR寄存器,寄存器的具体内容就不贴出来,非常简单,就是时钟的分频系数的选择,再往后是一个选择器,可以有4路时钟来源,来源都在图上标注了,根据具体的寄存器即可完成配置

手册中有详细的每一个外设的时钟来源,以及属于哪个时钟模块的介绍,和每个模块的时钟的频率范围

对于DDR来说,这里给出的最大时钟是396MHz,也就是默认的配置,但是我们要把它改为528MHz

三、系统主频修改

简单分析了系统的时钟树就可以根据寄存器来修改系统主频,先来看系统主频的配置,时钟树的最上面是PLL1,也就是系统主频的时钟

ARM_CLK_ROOT为最终进入芯片的频率,它由PLL1,经过分频系数(不一定是2分频)得到。如果PLL1是996MHz,分频系数是2的话,系统主频=996/2 = 498MHz

先来看CACRR寄存器,看都有那些分频系数,如下,最低3为表示分频系数,一共有8个选择

如果我们按照2分频来设置,那么,PLL1的频率就是=2*528Mhz = 1056Mhz,接下来,再来查看PLL1的频率来源

从图中可以看到

1、流入芯片PLL1由pll1_sw_clk得到,再往前经过一个选择器CCSR: pll1_sw_clk_sel,如果选择器是0的话,有PLL1提供芯片主频
2、如果选择器为1的话,由另一路时钟(step_clk)提供系统主频,step_clk再往前又是一个选择器,如果选择器为0,直接由osc_clk(24MHz)提供系统主频
3、如果选择器为1的话,就是另一路时钟,这个一般不参考。

3.1 PLL1系统主频

到这里,就已经看到了系统主频的来源,接下来看寄存器的具体配置,先找CCSR寄存器

寄存器的bit2就是时钟来源选择为PLL1_SW_CLK_SEL,如果是0,系统主频是pll1_main_clk,就是来自PLL1,如果配置为1,系统主频来自step_clk,

那么当选择来源是PLL1的时候,PLL1的值要怎么设置呢?

可以看到,PLL1的频率是由CCM_ANALOG_PLL_ARM[DIV_SELECT]来决定的,计算公式,PLL1 = 24MHz * DIV_SEL / 2

查看寄存器CCM_ANALOG_PLL_ARM

该寄存器的bit0-bit6就是DIV_SELECT的值,在前面知道,要将系统的主频设置为528MHz,PLL1的值是1056Mhz,那么,1056 = 24 * DIV_SEL / 2,DIV_SEL = 88,到这里选择PLL1作为系统主频的设置就已经结束了,接下来看一下使用另一路的系统主频设置

3.2另一路频率设置

CCSR寄存器的pll1_sw_clk_sel位为1的话,选择step_clk作为系统主频,再往前是一个选择器,通过寄存器CCSR:的step_sel位来选择

如果是0的话,选择24M时钟来源,是1的话选择另一路提供系统主频,这一路很简单,就已经配置结束了

3.3 总结

1、系统主频由pll1_sw_clk流入,要配置系统主频为528MHz,选择分频系数为2分频的话,pll1_sw_clk就要设置为1056MHz
2、pll1_sw_clk由一个选择器来提供,选择器由寄存器CCSR的pll1_sw_clk_sel位来配置,如果该位配置为    0的话,选择器选择pll1_main_clk为时钟来源
3、pll1_main_clk的前驱是PLL1,PLL1的频率由CCM_ANALOG_PLL_ARM[DIV_SELECT]来配置,计算公式是
    PLL1 = 24MHz * DIV_SEL / 2,经过计算,DIV_SEL = 88满足我们的需求
4、当选择器的CCSR的pll1_sw_clk_sel位配置为1的话,系统主频由step_clk提供,step_clk还是由一个 选择器来选择(CCSR: step_sel)
5、当CCSR的step_sel位为0的话,就选择24MHz作为系统时钟,另一路不考虑

4、代码

void imx6_clk_init(void)
{
    /* 
        判断系统的主频,如果此时是由PLL1提供,在修改系统主频之前先把时钟来源修改为24MHz
    */
   if((((CCM->CCSR) >> 2) & 0x1 ) == 0) { //说明此时时钟来源为pll1_main_clk,需要修改时钟来源
        /*
            1、先把CCSR: step_sel(bit8)设置为0,选择24MHz
            2、再把CCSR: PLL1_SW_CLK_SEL(bit2)设置为1,选择step_clk,
            注意是从源头的寄存器先开始设置,避免来不及设置时钟
        */
       CCM->CCSR &= ~(1 << 8);
       CCM->CCSR |= (1 << 2);
   }

   /*
        接下来修改PLL1的时钟
        1、先设置好时钟2分频,CACRR寄存器的ARM_PODF(bit0-2)设置为1
        2、根据计算公式,PLL1 = 24MHz * DIV_SEL / 2,得到DIV_SEL需要设置为88
        3、CCM_ANALOG_PLL_ARM[DIV_SELECT]寄存器的bit0-bit6设置DIV_SEL
        4、重新打开选择器,把pll1_main_clk的时钟来源设置为PLL1
   */
	CCM_ANALOG->PLL_ARM = (1 << 13) | ((88 << 0) & 0X7F); 	/* 配置pll1_main_clk=1056MHz */
	CCM->CCSR &= ~(1 << 2);									/* 将pll_sw_clk时钟重新切换回pll1_main_clk */
	CCM->CACRR = 1;											/* ARM内核时钟为pll1_sw_clk/2=1056/2=528Mhz */

}

在mian函数中添加调用,将编译生成的bin文件烧入系统中,对比之前的时钟,可以看出led闪烁的更快了。

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值