如果你还不知道单片机的心脏在怎么用,可以看看这 5 点! - LPC82X 系统时钟的配置使用

时钟对于单片机来说是非常重要的,它能为单片机提供一个稳定的机器周期从而使系统能够正常工作。它就像我们人类的心脏一样重要,一但有了问题那么系统就会崩溃。我们在使用单片机的时候,常常会使用默认的时钟频率,然而在一些特殊的场合(例如串口通讯或者实时时钟),则需要特殊的时钟频率,这时芯片自带的振荡器就无法满足我们的需求。这个时候,就可以选择外部晶振作为时钟源。

芯片除了默认的内部 RC 振荡器和外部晶振,还有看门狗振荡器和低功耗振荡器,分别用于不同的场合。学习芯片内部系统时钟的运作,有助于我们配置出合适的时钟频率。下面我们会以 LPC82X 系列为例,从:振荡器种类主时钟源的选择及使用锁相环原理及配置时钟输出(CLKOUT)功能说明及使用 时钟图形配置工具 这 5 点讲解系统时钟。

 

        LPC82x 时钟树框图如下:

         

一、LPC82x 振荡器种类

       首先我们来介绍一下 LPC82x 集成的 4 个独立的振荡器:

         

        1.
内部 RC 振荡器(IRC Oscillator)

        内部高速 RC 振荡器,IRC 作为芯片上电缺省时钟,也就是说,如果芯片上电后没有对任何时钟寄存器进行配置的话,就会以 IRC 作为系统主时钟。

        IRC 频率为 12 MHz,精度为 ,全温度范围从 -40℃ 到 105℃。


        2.
外部高速晶体振荡器(System Oscillator)

        内部高速 RC 振荡器的误差会随电压,温度,湿度等一些因素改变,当我们需要更加精准的时钟频率的时候,外部晶体振荡器可用作 CPU 的时钟源。SysOsc 工作频率范围为 1 MHz 至 25 MHz。此频率可通过系统 PLL 提高到更高的频率。

        外部晶振还可以满足我们对特殊频率的需求,比如进行通信的时候,一般选择 11.0592 MHz,12 M 频率进行串行通信不容易实现标准的波特率,比如 9600,4800,而 11.0592 M 计算时正好可以得到。然后在需要 RTC(实时时钟)的时候,晶振一般选用 32768 Hz,2 分频 15 次后为 1 Hz,周期为 1 秒。

        外接晶体又称为“振荡”模式,电路一般如下:

         

        此外 XTALIN 还能用于外部时钟输入,称为“从属”模式:

         

        另外,外部时钟源也可通过所选 CLKIN 引脚直接作为 PLL 的输入信号。两个时钟信号的最大频率均为 25 MHz。


        3.
内部看门狗晶振(Watchdog Oscillator)

        LPC824 还带有两款适用于低功耗应用的时钟源,分别是 内部看门狗晶振 和 内部低功耗晶振。

        内部看门狗频率范围为 9.3KHz–2.3MHz,精度为 。

        单片机系统在外界的干扰下会出现程序跑飞的现象导致出现死循环。看门狗的作用就是在一定时间内(通过计数器计数)没有收到系统的信号,便发送复位信号给芯片,实现自动复位重启。看门狗晶振一般专用于看门狗的计数,与主时钟分隔开,这样即使主时钟发生故障,它也仍然有效。

        看门狗频率计算公式为:Fclkana/(2x(1 + DIVSEL)),通过寄存器 WDTOSCCTRL 来设置得到需要的 Fclkana 和 DIVSEL 值,寄存器配置如下:

         

        4.
内部低功耗振荡器(LP OSC

         内部低功耗晶振可作为自唤醒定时器(WKT: Self-wake-up timer)的时钟源,用来将芯片从各种低功耗模式中唤醒。

         LP OSC 的频率为 10KHz,精度为 -40%~+40%

 

二、LPC82x 主时钟源的选择及使用

         

        主时钟(Main Clock)是 LPC824 中绝大部分部件工作的时钟源,包括系统时钟,UART 时钟等。

        主时钟的来源可以是以下四种选择(通过寄存器 MAINCLKSEL 选择):

         

        内部高速 RC 振荡器(IRC -Internal RC Oscillator): 12MHz

        锁相环前端时钟(PLL input): 10MHz –25MHz

        内部看门狗晶振(Watchdog Oscillator): 9.3 kHz –2.3 MHz (+/-40%)

        锁相环后端时钟(PLL output)

          

        主时钟可通过 SYSAHBCLKDIV 寄存器设置分频后获得系统时钟信号,用于内核时钟、存储和外设的时钟;

        可通过 UARTCLKDIV 寄存器设置分频后获得串口通讯时钟信号;

        可通过 IOCONCLKDIV 寄存器设置分频后获得 IO 口数字滤波器时钟信号;

        还可以通过 CLKOUTDIV 寄存器设置分频后输出时钟信号。

三、锁相环原理及配置

        由振荡器的内容可知,振荡器能产生的时钟频率最高为 25 MHz,那么 LPC82x 的系统时钟频率是怎么达到最大系统时钟频率(30MHz)的呢?锁相环(PLL)的作用就是将时钟升频,为芯片提供更高频率的时钟。

          

        锁相环前端时钟可以是以下三种选择(通过寄存器 SYSPLLCLKSEL 选择):
         

        内部高速 RC 振荡器(IRC):12MHz

        外部高速晶振(XTAL –System Oscillator):频率范围 1MHz ~ 25MHz,XTALIN 也可用作输入,电压限幅 1.8v

        外部时钟(CLKIN):频率范围 1MHz ~ 25MHz,由 CLKIN 管脚输入,电压 3.3V

 

        PLL 原理框图:
          

        相应计算公式:

                Fclkout = M x Fclkin= (FCCO) / (2 x P)

                FCCO = 2 x P x Fclkout

        要选择合适的 M 值和 P 值,建议执行以下步骤:

        1. 指定输入时钟频率 Fclkin。

        2. 计算 M 值以获得所需的输出频率 Fclkout,M = Fclkout / Fclkin。

        3. 找出一个 P 值,计算 FCCO = 2 × P × Fclkout,使得 156MHz  <  FCCO <  320MHz,

        4. 检查所有的频率和分频器值是否符合

 

        以我们要配置主时钟频率为 60 MHz 为例,选择 内部振荡器 12MHz 为 PLL 时钟输入 Fclkin,M 值设定为 5,则 PLL 时钟输出为 M x Fclkin = 60 MHz(通过 SYSAHBCLKDIV 寄存器设置 2 分频可得到系统时钟 30 MHz)。接着确定 P 值,应满足156 MHz  <  2 × P × Fclkout  <  320 MHz,即 1.3 < P < 2.67, 所以选择 P = 2。

        P 值和 M 值的设置通过寄存器 SYSPLLCTRL 控制:

          

        

        在文件 fsl_clock.c 中,有 CLOCK_InitSystemPll 函数,我们只需选择 PLL 时钟输入源和 所需的输出频率,函数便自动计算出 M 值和 P 值,对 PLL 进行配置。

        举个例子,配置 PLL 选择 IRC 振荡器作为时钟源,输出 24 MHz 。

 

                 clock_sys_pll_t config;                                 // 创建 PLL 配置变量

                 config.src = kCLOCK_SysPllSrcIrc;                    // 选择 PLL 时钟输入源为 IRC 振荡器

                 config.targetFreq = 24000000U;                 // 选择 PLL 输出时钟为 24 MHz

                 CLOCK_InitSystemPll(&config);                         // 使用函数对 PLL 进行配置

 

        注意:LPC82X 的主时钟频率被限定在 100 MHz

 

四、时钟输出(CLKOUT)功能说明及使用

        通过 CLKOUT 管脚可以将需要观察的时钟输出,管脚使用开关矩阵进行设置。


         

        被观察时钟的来源可以是以下四种选择(通过寄存器 CLKOUTCLKSEL 选择)
         

        内部高速 RC 振荡器(IRC)

        外部高速晶振(XTAL)

        内部看门狗晶振(Watchdog Oscillator)

        主时钟(Main Clock)

 

        实现 CLKOUT 功能的配置如下(本例为配置 PIO0_6 引脚作为 CLKOUT 功能):

 

                 CLOCK_EnableClock(kCLOCK_Swm);                                                                  //打开开关矩阵时钟源

                SWM_SetMovablePinSelect(SWM0, kSWM_CLKOUT, kSWM_PortPin_P0_6);        //为引脚配置 CLKOUT 功能

                CLOCK_DisableClock(kCLOCK_Swm);                                                                  //关闭开关矩阵时钟源

                CLOCK_Select(kCLKOUT_From_MainClk);                                                           //选择输出的时钟源为主时钟

                CLOCK_SetClkDivider(kCLOCK_DivClkOut, 1U);                                                    //选择输出的时钟源为 1 分频

                CLOCK_SetClkDivider(kCLOCK_DivClkOut, 1U);                                                    //选择输出的时钟源为 1 分频

                CLOCK_UpdateClkOUTsrc();                                                                                 //更新 CLKOUT 的时钟源

 

五、时钟图形配置工具

       了解了 LPC82X 的时钟树之后,除了手动配置以外,我们配置时钟可以借助图形配置工具 MCUXpresso Config Tools 生成代码,非常的简单快捷。

         MCUXpresso Config Tools 是 NXP 官方推出的软件开发工具,支持 Windows,Linux 和 Mac,通过以下链接下载
        https://www.nxp.com/design/software/development-software/mcuxpresso-software-and-tools/mcuxpresso-config-tools-pins-clocks-peripherals:MCUXpresso-Config-Tools?&tab=Design_Tools_Tab

         

        举个例子,我们要配置 LPC824 的系统时钟为 30 MHz,此时选择主时钟为 PLL 输出,PLL 的输入为外部晶振 12 MHz,通过 PLL 倍频后获得 60 MHz 的时钟信号,再分频给到系统时钟,从而获得 30 MHz 的系统时钟信号。

        首先 MCUXpresso Config Tools 打开软件,新建配置,选择创建一个新的独立的配置:

         

        然后选择我们的芯片信号,这里选择 LPC824。

         

        然后可以选择自己需要生成的文件:
          

        然后选择时钟配置:
         

        接着就会出现我们所熟悉的时钟树:
         

        双击各个时钟信号,可以对其进行配置,这里将外部晶振使能,PLL 输入选择外部晶振:

         

        接着 PLL 更改 M 值,使其输出为 60Mhz,系统时钟通过 2 分频获得 30 MHz 的时钟信号。

        

        接着我们由于使用了外部晶振作为时钟源,需要为 PIO0_8 和 PIO0_9 分别配置 XTALIN 和 XTALOUT 功能

         

        我们还可以配置自己想要的管脚配置成 CLKOUT 功能,这里选择 PIO0_6 作为 CLKOUT 引脚。
         
         

        此时系统时钟配置完毕,我们点击右上角的代码预览,便可以观察到生成的代码,点击导出按钮可以将代码导出,我们将其加入 SDK 里的工程中即可使用。

         

   

        -- End --

 

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

评论