芯片要工作就需要读取指令,解析指令然后运行指令,需要在某种固定的周期性运动的设备驱动下有条不紊的进行,它就是频率。
默认情况下I.MX6ULL工作在默认频率下(396MHz),工作频率相对保守。为了更好发挥I.MX6ULL的性能,需要对它的时钟频率进行配置。I.MX6ULL开发手册标注的内核最高频率支持528MHz,实际上它还可以超频到696MHz。
I.MX6ULL支持24MHz与32.768kHz两个OSC,32.768为低频率,目前使用的所有时钟来源都是24MHz。
从上面这张图可以看出,pll1_sw_clk是进入到内核频率的,通过CCSR的pll1_sw_clk_sel来选择到底使用哪一路作为最终进入ARM内核频率。step_clk在这里通过CCSR的step_sel选择为与OSC相同频率24MHz,它主要是用于在配置pll1_main_clk时的备用频率使用。
CCSR的第2位值,如果是0表示当前选择的是pll1_main_clk,需要将它切换到step_clk,同时将step_clk选择成24MHz频率/// CCM->CCSR的第二位判断是否选择的是pll1_main_clk(值是0)
if (((CCM->CCSR >> 2) & 0x1) == 0)
{
/// 需要先切换时钟源到24MHz晶振
CCM->CCSR &= ~(1 << 8);
CCM->CCSR |= (1 << 2);
}
配置CCM_ANALOG_PLL_ARMn寄存器
/// bit 13: enable register
/// 配置(696MHz)
CCM_ANALOG->PLL_ARM = (1 << 13) | (58);
/// 分频器配置为1
CCM->CACRR = 0;
/// 将时钟源切换回CCSR的第二位判断是否选择的是pll1_main_clk
CCM->CCSR &= ~(1 << 2);
这里配置了一个超频数值696MHz
BYPASS_CLK_ SRC(15 - 14)配置成0x0,即选择使用24MHz作为时钟源ENABLE(13)配置成1即使能时钟频率输出DIV_SELECT按公式(PLL output frequency = Fref * DIV_SEL/2)配置CCM的CACRR的1-3位配置分频器的值pll1_main_clk到目前为止,会使用到的PLL除了内核以外还有PLL2与PLL3。PLL2与PLL3是固定的频率,但他们都各分出去了4路FPD是可以灵活配置的。
上面红色框里面看到的就是。分别有两个寄存器控制,PLL2是CCM_ANALOG_PFD_528n, PLL3是CCM_ANALOG_PFD_480n。配置的公式是 528(480) * 18 / 实际频率,具体配置代码如下:
/// 配置PPL2(528MHz)的PFD0 ~ FPD3
int reg = CCM_ANALOG->PFD_528;
/// PFD0: 352MHz
reg |= (27 << 0);
/// PFD1: 594MHz
reg |= (16 << 8);
/// PFD2: 396MHz
reg |= (24 << 16);
/// PFD3: 297MHz
reg |= (32 << 24);
CCM_ANALOG->PFD_528 = reg;
/// 配置PPL3(480MHz)的PFD0 ~ FPD3
reg = CCM_ANALOG->PFD_480;
/// PFD0: 720MHz
reg |= (12 << 0);
/// PFD1: 540MHz
reg |= (16 << 8);
/// PFD2: 508.2MHz
reg |= (17 << 16);
// PFD3: 454.7MHz
reg |= (19 << 24);
CCM_ANALOG->PFD_480 = reg;
配置完成后,烧写后可看到实验07中的LED0与BEEP闪灯与响声的频率更高了,这是由于内核工作在了更高的频率。
全部0条评论
快来发表一下你的评论吧 !