一、时钟管理
在片上系统(SOC)中,不同的模块通常需要工作在不同的时钟频率。为了满足这些需求,芯片将时钟源信号进行稳定、倍频、分频、分发以及屏蔽(gate)等操作,产生不同频率的时钟信号。这些时钟信号和它们的管理电路构成了芯片的时钟体系,驱动着各种各样的功能模块协同工作。
首先我们来看一下时钟管理系统: IMX6ULL有7个锁相环电路,它们的输入时钟信号称为源时钟信号,可通过寄存器选择,通常为XTALOSC24M产生的24MHZ时钟信号。它们的输出经过进一步选择和分频,形成不同的根时钟信号,分发到各个模块使用。imx6ull 7路PLL具体产生方式如下: 时钟生成部分包含七个PLL。 其中两个PLL每个都配备了四个相位分数分配器(PFDs),以产生额外的频率。每个PFD通过插值其连接的PLL的VCO独立工作。它有效地利用PLLVCO频率,并在N从12到35的输出处产生18/NxFvco。PFD是一种完全数字化的设计,没有模拟元件或反馈回路。频率开关时间比锁相环快得多,因为保持基本锁相环锁定和改变整数N只会改变VCO插值输出的逻辑组合。请注意,PFD不仅允许比PLL更快的频率变化,而且允许在不经历输出时钟禁用/禁用过程的情况下安全地“动态”更改配置。 以下列出了七个PLL: 1.PLL1(ARM_PLL) 用来驱动ARM核心工作 ,最大可编程至1.3GHZ,比芯片最大可支持的频率1.0GHZ要高。 2.PLL2(System_PLL or 528_PLL),在24M外部晶振条件下,以固定22倍频输出528MHZ频率,除了主输出,该PLL还驱动四路PFD(PLL2_PFD0 … PLL2_PFD3).主锁相环输出及其PFD输出作为许多时钟根的输入.这些不需要精确/恒定的频率,可以作为动态频率缩放过程的一部分进行更改.通常,该PLL或其PFD是内部系统总线、内部处理逻辑、DDR接口、NAND/NOR接口模块等的时钟源 3.PLL3(USB1_PLL), PLL3被应用于与USB PHY第一个示例相结合,该锁相环驱动四个PFD (PLL3_PFD0… PLL3_PFD3),并以20的固定倍频输出480MHZ。 4.PLL4(Audio PLL) 这是一个分数乘法器锁相环,用于产生低抖动和高精度的音频时钟与标准化的音频频率。锁相环振荡器频率范围从650MHz到1300MHz,频率分辨率优于1Hz。该时钟主要用作串行音频接口的时钟和外部音频编解码器的参考时钟。它的输出上装有一个分频器,可以从PLLVCO频率产生除以1、2或4 5.PLL5(Video PLL)这是一个分数乘法器锁相环,用于产生低抖动和高精度的视频时钟与标准化的视频频率,锁相环振荡器频率范围从650MHz到1300MHz,频率分辨率优于1Hz。 该时钟主要用作显示和视频接口的时钟。它在其输出上配备了分配器,可以从PLLVCO频率产生时钟除以1、2、4、8或16 6.PLL6(ENET_PLL)这个PLL实现了一个固定的20(5/6)乘数。 具有24MHz的输入,其VCO频率为500MHz。 此PLL用于生成: ①外部以太网接口的50或25MHz ②125MHz用于简化的千兆以太网接口 ③通用100MHz 7.PLL7(USB2_PLL) 这个PLL专门为USB2PHY(USBPHY2,也称为OTGPHY)提供时钟)。 它以20的固定乘数运行,导致VCO频率为480MHz。
Reference input clock for any of the PLLs could be selected individually by the BYPASS_CLK_SRC field of the PLL control register. See CCM Analog Memory Map/Register Definition for more information. 每个PLL配置和控制功能都可以通过其PFD和全局配置和状态寄存器单独访问。任何PLL的参考输入时钟都可以由PLL控制寄存器的BYPASS_CLK_SRC字段单独选择。每个PLL可以单独配置为“旁路”、“输出禁用”和“断电”模式。 ①Bypass模式:PLL输入的参考时钟直接传递到输出,由BYPASS位控制; ② 输出禁止模式:无论bypass时钟还是PLL生成的时钟均被禁止,无输出时钟信号,由ENABLE位控制; ③ 断电模式:PLL中大部分电路断电,无输出时钟信号,由POWERDOWN位控制。 以ARM_PLL为例,单独截取出来说明,见下图。PLL正常工作时,时钟信号通过路径1传输作为信号ref_armpll_clk输出;处于Bypass模式时,源时钟信号不经过PLL放大,由路径2直接输出;处于输出禁止模式时,时钟信号在armpll_enable处被屏蔽,ref_armpll_clk无输出;处于断电模式时,ARM_PLL大部分电路断电,电路不工作,ref_armpll_clk无输出信号。
二、CCM 内部时钟产生
7路PLL并不能直接提供给其他模块直接使用,他们需要经过选择、分频后形成根时钟信号,然后分发给各个模块使用(结合时钟管理的图理解更深刻)。根时钟信号电路分为两部分,时钟切换电路和根时钟生成电路。The Clock Switcher (CCM_CLK_SWITCHER) sub-module receives the PLL output clocks and the PLL bypass clocks.时钟切换电路主要对PLL1和PLL3的输出进行选择,被选中的信号形成pll1_sw_clk和pll3_sw_clk信号。另外,它还对PLL4和PLL5进行额外的分频操作,形成pll4_main_clk和pll5_main_clk信号。其框图如下: 后续电路不直接使用上述PLL的输出,而是使用switcher形成的这些输出信号。例如,如果我们想改变CPU的工作频率,可以先修改CCSR[pll1_sw_clk_sel]将pll1_sw_clk切换到step_clk,然后修改PLL1的参数,等待其输出时钟信号稳定到新的频率上,再切换回PLL1的输出信号pll1_main_clk。因为使用了无抖动的多路选择器(glitchless multiplexer),在切换过程中CPU仍正常运行,我们将在第一个编程示例中演示上述过程。 The Clock Root Generator (CCM_CLK_ROOT_GEN) sub-module generates the root clocks to be delivered to LPCG. 如下图所示: 具体的时钟配置可以参考下面的时钟树:
三、时钟设置设置
3.1 PLL设置
首先我们设置PLL1,也就是cpu主频,我们先设置为–648M(举例随机选的)。
根据上述,我们知道主频主要涉及到PLL1设置以及CCM_CACRR 分频系数设定。正常工作时,CPU使用锁相环电路ARM_PLL的输出信号作为时钟源。在改变CPU频率之前,我们首先切换到其它时钟信号(示例中选择晶体振荡电路XTALOSC24M的输出),修改ARM_PLL设置并稳定在新的频率之后,再切换回ARM_PLL的输出时钟信号。具体步骤如下:
- step_clk选择使用OSC的输出,bit8 清0
- 选择step_clk ,bit 2置1
3.设置ARM_PLL的倍频参数并等待其进入锁定状态。
设置DIV_SELECT为108,范围是54-108,然后读取寄存器 直到bit31为1 4.设置分频系数cacrr寄存器为1,系数/2. 5.将ARM_ROOT切换回ARM_PLL,选择pll1_main_clk , 清除ccsr bit2 PLL2、PLL3 和 PLL7 固定为 528MHz、480MHz 和 480MHz,PLL4~PLL6 都是针对特殊外设的,用到的时候再设置。
3.2 PFD频率设定
nxp 推荐的PFD频率如下: PLL2的4路PFD频率使用寄存器 CCM_ANALOG_PFD_528n配置 寄存器 CCM_ANALOG_PFD_528n 其实分为四组,分别对应PFD0~PFD3,每组 8 个 bit,我们就以 PFD0 为例,看一下如何设置 PLL2_PFD0 的频率。PFD0对应的寄存器位如下:PFD0_FRAC: PLL2_PFD0 的分频数,PLL2_PFD0 的计算公式为 528x18/PFD0_FRAC,此为可设置的范围为 12~35 。 如 果 PLL2_PFD0 的频率要设置为 352MHz 的 话 PFD0_FRAC=528*18/352=27。 PFD0_STABLE: 此位为只读位,可以通过读取此位判断 PLL2_PFD0 是否稳定。 PFD0_CLKGATE: PLL2_PFD0 输出使能位,为 1 的时候关闭 PLL2_PFD0 的输出,为 0 的时候使能输出。 PLL3的4路pfd频率设置是类似的,只不过寄存器改为CCM_ANALOG_PFD_480n, 公式为 480x18/PFDx_FRAC
3.3 AHB、IPG 和PERCLK 根时钟设置
imx6u设置时钟可设置范围如下: 具体设置参考第二章时钟路线设置相应寄存器就很容易实现。
|