你不一定要点蓝字关注我的
前言
时钟对于单片机来说是非常重要的,它能为单片机提供一个稳定的机器周期从而使系统能够正常工作。它就像我们人类的心脏一样重要,一但有了问题那么系统就会崩溃。我们在使用单片机的时候,常常会使用默认的时钟频率,然而在一些特殊的场合(例如串口通讯或者实时时钟),则需要特殊的时钟频率,这时芯片自带的振荡器就无法满足我们的需求。这个时候,就可以选择外部晶振作为时钟源。
芯片除了默认的内部 RC 振荡器和外部晶振,还有看门狗振荡器和低功耗振荡器,分别用于不同的场合。学习芯片内部系统时钟的运作,有助于我们配置出合适的时钟频率。下面我们会以 LPC82X 系列为例,从:振荡器种类、主时钟源的选择及使用、锁相环原理及配置、时钟输出(CLKOUT)功能说明及使用 和 时钟图形配置工具 这 5 点讲解系统时钟。
LPC82x 时钟树框图如下:
一、LPC82x 振荡器种类
首先我们来介绍一下 LPC82x 集成的 4 个独立的振荡器:内部 RC 振荡器(IRC Oscillator)、外部高速晶体振荡器(System Oscillator)、内部看门狗晶振(Watchdog Oscillator)、内部低功耗振荡器(LP OSC)。
1. 内部 RC 振荡器(IRC Oscillator)
内部高速 RC 振荡器,IRC 作为芯片上电缺省时钟,也就是说,如果芯片上电后没有对任何时钟寄存器进行配置的话,就会以 IRC 作为系统主时钟。
IRC 频率为 12 MHz,精度为正负 1.5% ,全温度范围从 -40℃ 到 105℃。
2. 外部高速晶体振荡器(System Oscillator)
内部高速 RC 振荡器的误差会随电压,温度,湿度等一些因素改变,当我们需要更加精准的时钟频率的时候,外部晶体振荡器可用作 CPU 的时钟源。SysOsc 工作频率范围为 1 MHz 至 25 MHz。此频率可通过系统 PLL 提高到更高的频率。
外部晶振还可以满足我们对特殊频率的需求,比如进行通信的时候,一般选择 11.0592MHz,12M 频率进行串行通信不容易实现标准的波特率,比如 9600,4800,而 11.0592M 计算时正好可以得到。然后在需要 RTC(实时时钟)的时候,晶振一般选用 32768 Hz,2 分频 15 次后为 1 Hz,周期为 1 秒。
外接晶体又称为“振荡”模式,电路一般如下:
此外 XTALIN 还能用于外部时钟输入,称为“从属”模式:
另外,外部时钟源也可通过所选 CLKIN 引脚直接作为 PLL 的输入信号。两个时钟信号的最大频率均为 25 MHz。
3. 内部看门狗晶振(Watchdog Oscillator)
LPC824 还带有两款适用于低功耗应用的时钟源,分别是 内部看门狗晶振 和 内部低功耗晶振。
内部看门狗频率范围为 9.3KHz–2.3MHz,精度为正负 40%。
单片机系统在外界的干扰下会出现程序跑飞的现象导致出现死循环。看门狗的作用就是在一定时间内(通过计数器计数)没有收到系统的信号,便发送复位信号给芯片,实现自动复位重启。看门狗晶振一般专用于看门狗的计数,与主时钟分隔开,这样即使主时钟发生故障,它也仍然有效。
看门狗频率计算公式为: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 选择):
A. 内部高速 RC 振荡器(IRC):12MHz
B. 外部高速晶振(XTAL –System Oscillator):频率范围 1MHz ~ 25MHz,XTALIN 也可用作输入,电压限幅 1.8v
C. 外部时钟(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 MHzCLOCK_InitSystemPll(&config); // 使用函数对 PLL 进行配置
注意:LPC82x 的主时钟频率被限定在 100 MHz。
四、时钟输出(CLKOUT)功能说明及使用
通过 CLKOUT 管脚可以将需要观察的时钟输出,管脚使用开关矩阵进行设置。
被观察时钟的来源可以是以下四种选择(通过寄存器 CLKOUTCLKSEL 选择)
A. 内部高速 RC 振荡器(IRC)
B. 外部高速晶振(XTAL)
C. 内部看门狗晶振(Watchdog Oscillator)
D. 主时钟(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 --
往期推荐
精华丨太难了!芯片也要延年益寿 续集
教程丨LPC800 系列开发环境搭建那些事儿!
种草丨【干货】不看你就亏大了!LPC824 外部中断详解及实例应用
点击下方 查看更多呦~~~