跳转到主要内容

浅谈i.MX RT10xx系列MCU外接24MHz晶振的作用

之前写过一篇关于时钟引脚的文章 <a href="http://mcu.eetrend.com/content/2022/100561905.html"&gt;《i.MX RT1xxx系列MCU时钟相关功能引脚的作用》</a>,里面简单提及了外部晶振相关引脚的作用,但是并没有详细展开。

最近在客户支持中,有客户咨询项目板级设计上能否将外部24MHz晶振完全去掉。

今天就这个话题,使用芯片内部集成的RC24M做初始时钟源,详细展开,好好地聊聊。

注:本文中图片代码均以i.MX RT1050为例,但内容基本也适用其它i.MX RT10xx系列。

<strong><font color="#4e5e9e">1、外部24MHz晶振的作用</font> </strong>

i.MXRT 系列共有两组外接晶振专用引脚,XTALI/O用于外部连接24MHz晶振,RTC_XTALI/O用于连接32.768kHz晶振。其中低频的32.768kHz晶振主要用于低功耗场景(SNVS 域),而高频24MHz晶振(即本文主角)主要是给内部PLL提供时钟源,它是高性能应用的保证。

注: i.MX RT1011/102x的PLL时钟源仅能是OSC 24MHz,而 i.MX RT105x/106x的PLL时钟源除了OSC 24MHz外,还可以是专门时钟输入引脚(CLK1_P/N)。

<center><img src="https://mcu.eetrend.com/files/2022-10/wen_zhang_/100564671-273939-1.png…; alt=“浅谈i.MX RT10xx系列MCU外接24MHz晶振的作用" /></center>

外部24MHz晶振(XTAL24M)并不是直接连到PLL模块的,中间会经过芯片内部OSC 24MHz模块,而OSC 24MHz模块本身还包含了一个RC24M震荡电路,这是为了确保在没有外部XTAL24M的情况下,PLL也能正常工作。

<ul>
<li>
<p><em>注1: OSC 24MHz模块的源</em><em>可来自外部XTAL24M也可以是内部RC24M,但这种切换不是自动的,需要在代码里主动切换。</em></p>
</li>
<li>
<p><em>注2: RC24M主要用于低速应用场合,并</em><em>且以RC24M为源的功耗比以XTAL24M为源的功耗小很多。</em></p>
</li>
</ul>

<center><img src="https://mcu.eetrend.com/files/2022-10/wen_zhang_/100564671-273940-2.png…; alt=“浅谈i.MX RT10xx系列MCU外接24MHz晶振的作用" /></center>

<strong><font color="#4e5e9e">2、内部RC24M振荡器能否替代外部24MHz晶振?</font> </strong>

我们知道内部RC24M精度较差,最差的情况甚至有20%的精度误差,这种情况下一些对精度要求高的外设(比如USB、ENET)是无法使用RC24M为源的PLL输出作为时钟源的。

如果你的应用里不涉及USB、ENET等外设,就使用了一些简单的LPUART/LPSPI等外设,那么是完全可以禁掉外部XTAL24M的使用的,切换代码如下。

其中需要注意的是如果当前内核时钟源来自PLL,那么必须先将内核时钟切到OSC24M,否则OSC24M时钟源切换操作会直接导致代码跑飞(一旦PLL时钟源发生变化,输出会不稳,此时内核运行会出现异常):

<pre style="overflow-x:auto; background-color:#e9e9e9;">void ClockSelectRcOsc(void)
{
// 将内核时钟源从 PLL 切换到 OSC 24M
CLOCK_SetMux(kCLOCK_PeriphClk2Mux, 1);
CLOCK_SetMux(kCLOCK_PeriphMux, 1);

// 将 OSC 24M 时钟源从外部 XTAL24 切换到内部 RC24M
CLOCK_InitRcOsc24M();
CLOCK_SwitchOsc(kCLOCK_RcOsc);
CLOCK_DeinitExternalClk();

// 恢复内核时钟源(这里的 m、n 为切换之前的配置)
CLOCK_SetMux(kCLOCK_PeriphClk2Mux, m);
CLOCK_SetMux(kCLOCK_PeriphMux, n);
}</pre>

更多RC24M的应用详见 \SDK_2_12_0_EVKB-IMXRT1050\boards\evkbimxrt1050\demo_apps\power_mode_switch\bm 例程。

<strong><font color="#4e5e9e">3、能否完全去掉外部24MHz晶振?</font> </strong>

既然在低速或者低功耗应用场合,RC24M可以替代XTAL24M,那么我们能不能直接把XTAL24M完全去掉呢?答案很遗憾,不能!因为芯片系统(内核、PLL)默认就是以 XTAL24M为初始时钟源:

<pre style="overflow-x:auto; background-color:#e9e9e9;">XTALOSC24M->LOWPWR_CTRL[OSC_SEL] = 1'b0 // 24MHz clock from XTAL OSC
CCM_ANALOG->PLL_ARM[BYPASS_CLK_SRC] = 2'b00 // clock from REF_CLK_24M
CCM->CBCMR[PRE_PERIPH_CLK_SEL] = 2'b11 // clock from divided PLL1 (PLL_ARM)
CCM->CBCDR[PERIPH_CLK_SEL] = 1'b0 // clock from pre_periph_clk_sel</pre>

<center><img src="https://mcu.eetrend.com/files/2022-10/wen_zhang_/100564671-273941-3.png…; alt=“浅谈i.MX RT10xx系列MCU外接24MHz晶振的作用" /></center>

如果没有外部XTAL24M,芯片系统上电后,内核没有正确的时钟源,BootROM代码无法正常执行,这时候甚至仿真器也没法找到内核,所有后续设计也就没有任何意义。

看到这里,你可能会明白,i.MX RT毕竟是跨界处理器,它是为高性能场景而生的,运行起来后切换到内部RC24M来降功耗只是它的附带功能而已。

来源:<a href="https://mp.weixin.qq.com/s/avusZuuikQylxe0Hv-YC8w">恩智浦MCU加油站</a&gt;
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。