quartus利用锁相环产生时钟_如果你还不知道单片机的时钟怎么用,一定要看看这 5 点!...

本文详细介绍了LPC82x系列单片机的时钟系统,包括内部RC振荡器、外部高速晶体振荡器、看门狗振荡器和低功耗振荡器的特性和用途。重点讲解了如何利用锁相环配置产生不同频率的时钟,以满足不同应用场景,如串口通讯和实时时钟。通过示例展示了如何设置PLL,以12MHz的外部晶振输入,生成60MHz的时钟输出,并分频得到30MHz的系统时钟。同时提到了时钟输出功能和时钟图形配置工具MCUXpresso Config Tools的使用,该工具简化了时钟配置过程。
摘要由CSDN通过智能技术生成

你不一定要点蓝字关注我的

0c463b863d92aba44e6f50c4274e5f83.png

前言

 

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

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

LPC82x 时钟树框图如下:

ddf5d4b00db430826cc67d808bb74905.png

一、LPC82x 振荡器种类  

首先我们来介绍一下 LPC82x 集成的 4 个独立的振荡器:内部 RC 振荡器(IRC Oscillator)、外部高速晶体振荡器(System Oscillator)、内部看门狗晶振(Watchdog Oscillator)、内部低功耗振荡器(LP OSC)。

46d6eca160da5e51e7d25eeb72e070bf.png

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 秒。

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

f9fafb5995e51826d1568d561d073c75.png

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

198012c9b7134d3427dfddbcd98bccc1.png

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

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

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

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

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

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

173323da184145cc3505efc8b67a2b1e.png

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

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

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

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

9a85452d23a1541f0c016be497d07857.png

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

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

47fed4fbb83ce477926a2a7086b998f7.png

内部高速 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 寄存器设置分频后输出时钟信号。

24edb5bcab6577a9371b3f85a9b3e32d.png

三、锁相环原理及配置  

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

787b37c4f2d7afa46273b071d73b0ba4.png

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

aca0921140ae267058b91786918e8f1b.png

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

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

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

PLL 原理框图:

1af72f31820661646fbdd2fbdfea3bf0.png

相应计算公式:

       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 控制:

986007ebf27f5c1bc1e30941188fdc15.png

34e26a42c24ec5aecaf7233dc0e2bbdc.png

在文件 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 管脚可以将需要观察的时钟输出,管脚使用开关矩阵进行设置。

6b1d75f0c0fe7b02bc3468bf546aa743.png

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

b139320b309a825a235e1595cf69de8a.png

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

cb736f57af0e95d2b168a1748b7e6afc.png

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

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

8b0335ddad092e518df52f9e47907001.png

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

dd098fe03ef7e305bd5f9291850d70ea.png

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

17428be31081d97e5e60e88a37002036.png

然后选择时钟配置:

fa28b8ddf73496fa14431971b1d18d4b.png

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

dca4e99790c4c9035bd1d318593f1c0e.png

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

6c84d186ebd7facb7b4d5f8f1dc2f8d3.png

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

e6fc2e689ededa7f71f0e0d456274e5d.png

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

92b9f11b1261574c390b675af827f1ca.png

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

5a81175c0a4fc3dadd74dd5af34ccbcb.png

e2d0447d184425a66dff3cd29c578694.png

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

0ff60af84e79764ed8fe4e7719abacb9.png

-- End --

往期推荐

精华丨太难了!芯片也要延年益寿 续集

教程丨LPC800 系列开发环境搭建那些事儿!

种草丨【干货】不看你就亏大了!LPC824 外部中断详解及实例应用

76246e7333273f5d8072744812bfc965.png 218d0e587cb11fc2fcb33d7086ebc88d.png 点击下方 查看更多呦~~~
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值