第一:时钟系统分析
每款芯片都有自己的主频,有的时候需要把主频设置到合适的值,才能发挥它的最大性能.
可以看出,开发板的系统时钟来源于两个部分:32.768KHz和24MHz的晶振,其中32.768KHz晶振是RTC的时钟源,24MHz晶振是内核和其他外设的时钟源。
第二:7路PLL时钟源分析
芯片的外设有很多,不同的外设时钟源不同, 先对这些外设的时钟源进行分组,一共有7组,这7组时钟源都是从24MHz晶振PLL而来的。每款芯片都有自己的时钟树,详细的时钟图如下:
一共有三部分:CLOCK_SWITCHER、CLOCK ROOT GENERATOR 和 SYSTEM CLOCKS。左边的CLOCK_SWITCHER就是7路PLL和8路PFD,右边的是SYSTEM CLOCKS 就是芯片外设,中间的CLOCK ROOT GENERATOR 是最 复杂的!这一部分就像“月老”一样。芯片的时钟系统还是很复杂的,大家学习的时候要结合芯片的参考手册的结构图来学习,这里主要进行主频、PLL和一些总线时钟的设置。
第三:实验程序编写
配置系统的时钟,可以自己设定相应的系统时钟,修改内容如下:
#include "bsp_clk.h" //使能所有的外设时钟 void clk_enable(void) { CCM->CCGR0 = 0XFFFFFFFF; CCM->CCGR1 = 0XFFFFFFFF; CCM->CCGR2 = 0XFFFFFFFF; CCM->CCGR3 = 0XFFFFFFFF; CCM->CCGR4 = 0XFFFFFFFF; CCM->CCGR5 = 0XFFFFFFFF; CCM->CCGR6 = 0XFFFFFFFF; } //初始化系统时钟,按照手册推荐 void imx6u_clkinit(void) { unsigned int reg = 0; if((((CCM->CCSR) >> 2) & 0x1 ) == 0) /* pll1_main_clk */ { CCM->CCSR &= ~(1 << 8); /* 配置 step_clk 时钟源为 24MHz OSC */ CCM->CCSR |= (1 << 2); /* 配置 pll1_sw_clk 时钟源为 step_clk */ } CCM_ANALOG->PLL_ARM = (1 << 13) | ((88 << 0) & 0X7F); CCM->CCSR &= ~(1 << 2);/* 将 pll_sw_clk 时钟切换回 pll1_main_clk */ CCM->CACRR = 1; /* ARM 内核时钟为 pll1_sw_clk/2=1056/2=528Mhz */ /* 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 */ 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 */ }
最终在main函数里面调用imx6u_clkinit来初始化时钟。
int main(void) { int i = 0; int keyvalue = 0; unsigned char led_state = OFF; unsigned char beep_state = OFF; imx6u_clkinit(); /* 初始化系统时钟 */ clk_enable(); /* 使能所有的时钟 */ led_init(); /* 初始化 led */ beep_init(); /* 初始化 beep */ key_init(); /* 初始化 key */ /* 省略掉其它代码 */ }
总结:将代码烧录板子之后,明显的可以看到代码的执行速度加快。时钟树的底层控制,在芯片控制方面是非常重要的,熟悉它很有必要。