第一:时钟系统分析
每款芯片都有自己的主频,有的时候需要把主频设置到合适的值,才能发挥它的最大性能。
可以看出,开发板的系统时钟来源于两个部分: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 */
/* 省略掉其它代码 */
}
总结:将代码烧录板子之后,明显的可以看到代码的执行速度加快。时钟树的底层控制,在芯片控制方面是非常重要的,熟悉它很有必要。
标签:芯片,系统,CCM,0XFFFFFFFF,Linux,PLL,reg,时钟 From: https://www.cnblogs.com/liuchaobaidu/p/16998609.html