芯片要工作就需要读取指令,解析指令然后运行指令,需要在某种固定的周期性运动的设备驱动下有条不紊的进行,它就是频率
。
默认情况下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条评论
快来发表一下你的评论吧 !