痞子衡嵌入式:浅谈i.MXRT10xx系列MCU外接24MHz晶振的作用
大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是i.MXRT10xx系列MCU外接24MHz晶振的作用。
痞子衡之前写过一篇关于时钟引脚的文章 《i.MXRT1xxx系列MCU时钟相关功能引脚的作用》,里面简单提及了外部晶振相关引脚的作用,但是并没有详细展开。最近在客户支持中,有客户咨询项目板级设计上能否将外部 24MHz 晶振完全去掉,就使用芯片内部集成的 RC24M 做初始时钟源。今天痞子衡就详细展开这个话题:
- Note: 本文中图片代码均以 i.MXRT1050 为例,但内容基本也适用其他 i.MXRT10xx 系列。
一、外部24MHz晶振作用
i.MXRT 系列共有两组外接晶振专用引脚,XTALI/O 用于连接 24MHz 晶振,RTC_XTALI/O 用于连接 32.768KHz 晶振。其中低频 32.768KHz 晶振主要用于低功耗场景(SNVS 域),而高频 24MHz 晶振(即本文主角)主要是给内部 PLL 提供时钟源,它是高性能应用的保证。
- Note: i.MXRT1011/102x 的 PLL 时钟源仅能是 OSC 24MHz,而 i.MXRT105x/106x 的 PLL 时钟源除了 OSC 24MHz 外,还可以是专门时钟输入引脚(CLK1_P/N)。
外部 24MHz 晶振(XTAL24M)并不是直接连到 PLL 模块的,中间会经过芯片内部 OSC 24MHz 模块,而 OSC 24MHz 模块本身还包含了一个 RC24M 震荡电路,这是为了确保在没有外部 XTAL24M 的情况下,PLL 也能正常工作。
- Note1: OSC 24MHz 模块的源可来自外部 XTAL24M 也可以是内部 RC24M,但这种切换不是自动的,需要在代码里主动切换。
- Note2: RC24M 主要用于低速应用场合,并且以 RC24M 为源的功耗比以 XTAL24M 为源的功耗小很多。
二、内部RC24M振荡器能否替代外部24MHz晶振?
我们知道内部 RC24M 精度较差,最差的情况甚至有 20% 的精度误差,这种情况下一些对精度要求高的外设(比如 USB、ENET)是无法使用 RC24M 为源的 PLL 输出作为时钟源的。
如果你的应用里不涉及 USB、ENET 等外设,就使用了一些简单的 LPUART/LPSPI 等外设,那么是完全可以禁掉外部 XTAL24M 的使用的,切换代码如下。其中需要注意的是如果当前内核时钟源来自 PLL,那么必须先将内核时钟切到 OSC24M,否则 OSC24M 时钟源切换操作会直接导致代码跑飞(一旦 PLL 时钟源发生变化,输出会不稳,此时内核运行会出现异常):
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);
}
更多 RC24M 的应用详见 \SDK_2_12_0_EVKB-IMXRT1050\boards\evkbimxrt1050\demo_apps\power_mode_switch\bm 例程。
三、能否完全去掉外部24MHz晶振?
既然在低速或者低功耗应用场合,RC24M 可以替代 XTAL24M,那么我们能不能直接把 XTAL24M 完全去掉呢?答案很遗憾,不能!因为芯片系统(内核、PLL)默认就是以 XTAL24M 为初始时钟源:
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
如果没有外部 XTAL24M,芯片系统上电后,内核没有正确的时钟源,BootROM 代码无法正常执行,这时候甚至仿真器也没法找到内核,那后续设计也就没有任何意义。看到这里,你可能会明白,i.MXRT毕竟是跨界处理器,它是为高性能场景而生的,运行起来后切换到内部 RC24M 来降功耗只是它的附带功能而已。
至此,i.MXRT10xx系列MCU外接24MHz晶振的作用便介绍完毕了,掌声在哪里~~~
欢迎订阅
文章会同时发布到我的 博客园主页、CSDN主页、知乎主页、微信公众号 平台上。
微信搜索"痞子衡嵌入式"或者扫描下面二维码,就可以在手机上第一时间看了哦。

痞子衡嵌入式:浅谈i.MXRT10xx系列MCU外接24MHz晶振的作用的更多相关文章
- 痞子衡嵌入式:浅谈i.MXRT1xxx系列MCU时钟相关功能引脚的作用
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT1xxx系列MCU时钟相关功能引脚作用. 如果我们从一颗 MCU 芯片的引脚分类来看芯片功能,大概可以分为三大类:电源.时钟 ...
- 痞子衡嵌入式:飞思卡尔Kinetis系列MCU启动那些事(1)- KBOOT架构
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔Kinetis系列MCU的KBOOT架构. Bootloader是嵌入式MCU开发里很常见的一种专用的应用程序,在一个没有Boo ...
- 痞子衡嵌入式:飞思卡尔Kinetis系列MCU启动那些事(2)- KBOOT形态(ROM/Bootloader/Flashloader)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔Kinetis系列MCU的KBOOT形态. 痞子衡在前一篇文章里简介了 KBOOT架构,我们知道KBOOT是一个完善的Bootl ...
- 痞子衡嵌入式:飞思卡尔Kinetis系列MCU启动那些事(3)- KBOOT配置(FOPT/BOOT Pin/BCA)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔Kinetis系列MCU的KBOOT配置. KBOOT是支持配置功能的,配置功能可分为两方面:一.芯片系统的启动配置:二.KBO ...
- 痞子衡嵌入式:飞思卡尔Kinetis系列MCU启动那些事(9)- KBOOT特性(IntegrityCheck)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔Kinetis系列MCU的KBOOT之完整性检测(Integrity Check)特性. Application完整性检测是非常 ...
- 痞子衡嵌入式:飞思卡尔Kinetis系列MCU启动那些事(11)- KBOOT特性(ROM API)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔Kinetis系列MCU的KBOOT之ROM API特性. KBOOT的ROM API特性主要存在于ROM Bootloader ...
- 痞子衡嵌入式:飞思卡尔Kinetis系列MCU启动那些事(10)- KBOOT特性(可靠升级)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔Kinetis系列MCU的KBOOT之可靠升级(Reliable Update)特性. 所谓可靠升级机制,即在更新Applica ...
- 痞子衡嵌入式:飞思卡尔Kinetis系列MCU开发那些事 - 索引
大家好,我是痞子衡,是正经搞技术的痞子.本系列痞子衡给大家介绍的是飞思卡尔Kinetis系列微控制器相关知识. 飞思卡尔半导体(现恩智浦半导体)于2010年开始推出的Kinetis系列昭示着ARM C ...
- 痞子衡嵌入式:利用i.MXRT1xxx系列内部DCP引擎计算Hash值时需特别处理L1 D-Cache
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是利用i.MXRT1xxx系列内部DCP引擎计算Hash值时需特别处理L1 D-Cache. 关于i.MXRT1xxx系列内部通用数据协处 ...
随机推荐
- logstash在windows系统下的安装与使用
前言: Logstash 是开源的服务器端数据处理管道,能够同时从多个来源采集数据,转换数据,然后将数据发送到 Elasticsearch. ES官网:https://www.elastic.co/p ...
- treap(小根堆)模板
总结教训 对于treap使用小根堆性质,一定要特判左右子树是否存在,因为空节点的优先级为0,是最高的,不特判会出错我就这么错了,so 一定要特判!一定要特判!一定要特判!重要的事情说三遍 本文代码根据 ...
- python shutil相关操作
python shutil模块常用操作 高级的 文件.文件夹.压缩包 处理模块 1.将文件内容拷贝至另一个文件中 shutil.copyfileobj(src, dist, length=16*102 ...
- C#里如何简单的校验时间格式
前言: 晚上打算睡觉的时候,群里反馈订单接收失败,开工排查问题,日志显示验签失败,发现一个蛮有意思的BUG,总算有了一个写作的素材 场景描述 本次的场景属于比较常见的收单API,对第三方的订单进行签名 ...
- SpringBoot 如何集成 MyBatisPlus - SpringBoot 2.7.2实战基础
SpringBoot 2.7.2 学习系列,本节通过实战内容讲解如何集成 MyBatisPlus 本文在前文的基础上集成 MyBatisPlus,并创建数据库表,实现一个实体简单的 CRUD 接口. ...
- 6.18 NOI 模拟
发现 \(Typro\) 没保存的草稿也是可以找回的,\(tql\) \(T1\ bs\) 考虑选的必然是开头的连续一段,那么直接二分\(+\)判定即可 由于数据范围是\(5\times 10^7\) ...
- Oracle-DDL,DML理解以及应用
SQL语句:虽然SQL语句不区分大小写,但是字符串的值时区分大小写的.SQL是结构化查询语句,操作数据库需要向数据库发送SQL语句,数据库会理解SQL语句中含义并执行SQL语句分为:DDL(数据定义语 ...
- True 和 False 分别代表数字中的几?形象地记忆
True 和 False 作为布尔值分别代表的意思是真和假. 灯泡亮起就是 1,灯泡熄灭就是 0.0 就是无状态,所以可以代表灯泡熄灭的状态,而 1 就是有状态的,所以可以代表灯泡亮起的状态. 那么, ...
- QQ高级功能
本篇文章为微信公众号:酿俗 教学内容请跟着小编一起探索吧! 第一步解锁微信豆影藏内容 随后下载需要的材料,注意!手机可能会提示有病毒!这里使用这些功能报病毒很正常 其实并没有病毒只是手机厂商的安全系统 ...
- Windows平台Unity3d播放多路RTMP或RTSP流
好多开发者在做AR.VR或者教育类产品时,苦于如何在windows平台构建一个稳定且低延迟的RTSP或者RTMP播放器,如果基于Unity3d完全重新开发一个播放器,代价大.而且周期长,不适合快速出产 ...