MPC5744P (三)时钟

发布时间:2026/7/6 8:16:40
MPC5744P (三)时钟 寄存器配置开发离不开手册现在把手册地址放这里大家自取。通过网盘分享的文件MPC5744PRM.pdf链接: https://pan.baidu.com/s/19ElHBR_n0DavakfWA-uGVw 提取码: nz86一时钟简介本章介绍了系统级时钟的架构涵盖以下内容系统时钟特性时钟架构时钟源1系统时钟特性内核、存储器和调试逻辑所用的时钟系统时钟与外设时钟相互独立。这种独立性让系统时钟可以采用频率调制模式运行在降低电磁辐射的同时为外设定时器和通信功能保留精准的时钟信号也让系统时钟可以在计算负载较低的时段降低频率而不影响定时器和通信链路的正常工作。MPC5744P 芯片从 16 MHz 内部 RC 振荡器IRCOSC启动当锁相环PLL或外部振荡器故障时它还可作为备用时钟需提前启用备份功能维持运行。芯片的时钟源有三种可选方式外部振荡器外部晶振16 MHz 内部 RC 振荡器从这些输入时钟源中内部时钟由两个锁相环PLL之一生成分别为 PLL0 和 PLL1输出为 PLL0_PHI 和 PLL1_PHI。这两路时钟连同外部晶振振荡器XOSC和内部 RC 振荡器IRCOSC可根据辅助时钟选择器Auxiliary Clock Selectors的配置驱动系统外设。PLL0 的 PHI1 输出也可用作 PLL1 的时钟源。芯片共设有 7 个时钟选择器供开发者选择 PLL 参考时钟、用独立时钟源驱动各类系统外设以及选择时钟源驱动 CLKOUT 信号供片外使用。此外还有一个额外的时钟选择器专门用于系统时钟。模块时钟选择器的每个输出最多可配置三个分频器这能为特定外设组提供更精细的时钟频率调节分频系数最高可达 64。部分时钟分频器的输出端连接有时钟监控单元CMU用于检测时钟的完整性确保其频率保持在必要的工作范围内。若五个 CMU 中的任何一个检测到被监控的时钟信号异常可根据 CMU 的配置触发中断或系统复位。2系统时钟从哪里来到哪里去——时钟架构顶层时钟生成架构如下图所示。这个图很重要你甚至可以保存下来放在你常用的地方各种外设的时钟架构依赖MOTC_CLK和PBRIDGEx_CLK这俩是在上面配置出来的。这个图很重要你甚至可以保存下来放在你常用的地方下面举个例子我们要一站式的配好系统时钟和SPI的时钟。我们先说目标时钟源用外部的XOSC 40MHz的振荡器打算给系统配置个160MHz的系统时钟给SPI配置40MHz的外设时钟这个是芯片SPI模块的时钟不是SPI的时钟线时钟哈1辅助时钟选择寄存器3选择XOSC即MC_CGM_AC3_SC的SELECT位配置为1。各种辅助时钟选择寄存器、辅助时钟分频器、辅助时钟状态寄存器、系统时钟状态寄存器等可以参考手册27章2配置PLL0分频器40MHz的频率输入进去经过分频后得到160MHz。PLL0和PLL1控制、分频、状态、频率调制寄存器参考手册25章3辅助时钟选择寄存器4选择PLL0_PHI1即MC_CGM_AC4_SC的SELECT位配置为0b11。4配置PLL1分频器160MHz的频率输入进去经过分频后得到160MHz。配置一下分频系数为1就行了5系统时钟选择MC_ME_DRUN_MC的SYSCLK配置为secondary PLL就是选择的PLL1 PHI。在手册第59章涉及到系统运行模式的配置系统的时钟选择是在系统的运行模式的寄存器里配置的6配置系统时钟分频器0可以配置为4分频进来是160MHz出来就是40MHz啦。7PBRIDGEx_CLK直连部分外设模块这样SPI模块的时钟就直接配置成40MHz了。3系统时钟的最大频率各个模块是有最大频率限制的如下表4默认系统时钟配置在上电之初系统的时钟默认的是IRCOSC也就是16MHz。所有的时钟分频器在系统复位时会被设置为2分频。程序运行到我们的时钟初始化配置之后才变成我们想要的时钟频率。5时钟源下列几个是时钟源PLL0和PLL1是经过辅助时钟选择寄存器配置和PLLDIG配置得到的内部的时钟源。时钟源核心特点与用途PLL0主锁相环是系统和大部分外设的核心时钟源输出高稳定性、高频时钟支持双路输出PHI/PHI1PLL1 (FMPLL)次锁相环支持频率调制Frequency Modulation可用于降低 EMI硬件上被路由到 AUX Clock Selector 0需注意使用限制XOSC外部晶振 / 振荡器提供高精度、稳定的参考时钟支持 8~40MHz 输入是系统的主要外部时钟源EXTAL Bypass外部时钟旁路模式可直接通过 EXTAL 引脚输入外部时钟信号绕过内部晶振电路IRCOSC16MHz 内部 RC 振荡器无需外部元件是芯片默认启动时钟也可作为故障时的备份时钟tips频率调制Frequency Modulation简称 FM在 MCU 里核心目的就是降低电磁干扰EMI同时它也会带来一些副作用和限制。PLL1 的频率调制功能会导致时钟抖动因此当它作为 AUX Clock Selector 0 的时钟源时不建议开启该功能避免影响 ADC、电机控制等对时钟稳定性要求高的外设。锁相环Phase-Locked Loop简称 PLL你可以把它理解成一个 “时钟倍频 整形 净化” 的魔法盒子 它是 MCU 实现高频、稳定时钟的核心部件。二PLLDIG双锁相环数字接口这一部分会详细介绍PLLDIG 模块的所有寄存器控制 / 状态 / 分频 / 倍频PLL0 和 PLL1 的配置方法、锁定流程频率计算公式、小数分频PLL1、频率调制的配置限制故障处理如失锁检测、中断的相关寄存器说明你或许有疑问在上文中我举例的配置路线中为何要大费周章的弯弯绕绕为何要存在两个PLL为何要两个PLL模块采用级联架构似乎一个PLL也能完成时钟配置其实也有道理但是双PLL架构也有一定优势可以由 PLL0 的 PHI 输出为外设提供时钟该时钟无频率调制且与内核时钟频率相互独立。内核与平台时钟则由 PLL1 驱动。1特性双 PLL 数字接口PLLDIG具备以下特性支持双 PLL 级联工作模式可将 PLL0 的时钟输出作为 PLL1 的参考时钟参考时钟预分频器可提供更高的频率合成分辨率降频分频器可在不导致 PLL 失锁的情况下降低 PLL0/PLL1 的输出时钟频率PLL1 支持可编程频率调制功能内置锁定检测电路可报告 PLL 何时完成频率锁定并持续监控锁定状态报告失锁情况失锁指示信号可通过系统胶合逻辑发送至故障收集与控制单元FCCUtipsPLL 失锁Loss of LockLOL是锁相环PLL的一种故障状态简单说就是PLL 无法再维持输出时钟与参考时钟的相位 / 频率同步导致输出时钟频率、相位发生异常变化。PLL 的核心是一个闭环控制系统它会不断对比 “输入参考时钟” 和 “输出反馈时钟” 的相位差调整输出频率直到两者完全同步也就是 “锁定” 状态。2PLL的使能PLL 的工作模式可以通过PLLnCR[CLKCFG]寄存器的值指示。PLLDIG 在启用参考时钟和 PLL 的情况下以正常模式运行。说明PLL的使能是通过配置 MC_ME 模式配置寄存器MC_ME__MC来控制。这里有个误区很容易踩坑请大家移步到手册第25章的PLLDIG_PLL0CR寄存器详细介绍部分看我下面的标注1和标注2R代表只读W代表只写后续看寄存器的时候都要注意这个问题在PLLDIG_PLL0CR中CLKCFG位是只读的只能反映PLL0的工作状态0b00时是PLL off0b11是PLL运行在Normal模式其他数字无实际意义(PLL1也是同样的道理)那么我要使能PLL0在哪里请翻到手册第59章模式进入模块部分看到MC_ME_DRUN_MC寄存器。在MC_ME_DRUN_MC寄存器中PLL1ON和PLL0ON就是控制两个PLL使能的开关。除了PLL在MC_ME_DRUN_MC寄存器里还能给XOSCON使能、读取IRCON使能状态、选择系统时钟源这些东西在系统时钟初始化的时候都是要配置的。3地址和寄存器定义主要关注PLLDIG_PLL0DV和PLLDIG_PLL1DV时钟源输入到PLL后内部的分频计算就是靠这两个寄存器配置的。4PLL计算公式还是用前面举的例子我们要一站式的配好系统时钟和SPI的时钟。我们先说目标时钟源用外部的XOSC 40MHz的振荡器打算给系统配置个160MHz的系统时钟。现在我演示一下怎么计算。走到步骤2时PLL0的输入来源于XOSC为40MHz配置PLLDIG_PLL0DV如下图所示计算一下完全符合。同样的走到步骤4时PLL1的输入来源于PLL0_PHI1为160MHz配置PLLDIG_PLL1DV如下图所示计算一下完全符合。再在MC_ME_DRUN_MC寄存器里选择一下系统时钟路径再使能一下各个模块系统时钟就配置成功了。当然还没完得计算下vco频率检查一下就行了VCO是内部压控振荡器的输出频率同样必须在芯片规格范围内但是范围具体是多少我在数据手册里没有找到如果大家找到了欢迎分享一下我只是在MPC5744P的官方例程的注释里看到了VCO的频率范围计算公式如下详细计算我就不再赘述了大家可以学习了我上面的计算步骤举一反三哦~5其他这一部分还有失锁和频率调制使用频率相对较少大家如果有需求自行看手册研究吧三 MC_MG时钟发生模块别害怕这个是你的老朋友了很简单还记得举的例子吧是不是出现了好多个辅助时钟选择寄存器、分频器......这个模块就是这些东西无非就是选一选我要哪个输入的时钟源设置一下分频系数take it easy1特性MC_CGM 模块包含以下功能特性生成系统时钟与外设时钟根据 MC_ME 模块的控制从多个系统时钟源中选择并启用 / 禁用系统时钟供给根据 MC_ME 的模式配置实现系统时钟频率的渐进式切换包含一组寄存器用于控制时钟分频器生成分频后的时钟信号支持多种时钟源并将它们的地址空间映射到自身的内存映射中在切换系统时钟源时保证无毛刺时钟切换glitch-less clock transitions支持 8 位、16 位和 32 位宽度的读写访问2寄存器定义3系统时钟生成下图为系统时钟生成逻辑的结构框图。MC_ME 模块提供系统时钟选择与切换屏蔽功能详见 MC_ME 章节手册第59章MC_RGM 模块提供安全时钟请求信号详见 MC_RGM 章节当芯片处于SAFE模式或发生复位事件时安全时钟请求信号会强制选择器将16 MHz IRC 内部振荡器IRCOSC作为系统时钟并忽略系统时钟选择信号。讲一下寄存器这个是系统时钟选择状态寄存器用于指示系统时钟状态快速略过。这个是系统时钟配置分频器记得使能记得真实分频值DIV14辅助时钟生成辅助时钟选择寄存器使用的时候参考时钟架构图理清楚时钟走的路线走到对应的辅助时钟选择寄存器的时候在SELECT位写入要选择的输入即可。比如我在辅助时钟选择寄存器0这里要选择PLL1PHI给SELECT位配置0b110即可。其他辅助时钟选择寄存器操作同理。辅助时钟分频配置寄存器跟前面的系统时钟配置分频器记得使能记得真实分频值DIV1四 时钟配置部分代码下面看我前面举的例子所对应的代码先配置系统时钟分频器看图中标注6的地方过了这个分频器就直连外设的时钟信号了配置为3就是314分频。void system160mhz(void) { /* PBRIDGEx_CLK */ MC_CGM.SC_DC0.B.DIV 3; /* Freq sysclk / (01) sysclk */ MC_CGM.SC_DC0.B.DE 1; /* Enable divided clock */ PLL_160MHz(); } void PLL_160MHz(void) { /* Connect XOSC to PLL. We ultimately use the output of PLL1. PLL1 must be fed the output of PLL0 */ MC_CGM.AC3_SC.B.SELCTL 1; //40 MHz XOSC selected as input of PLL0 MC_CGM.AC4_SC.B.SELCTL0b11; //PLL0_PHI1 selected as input of PHI1 /* Configure PLL0 Dividers - 160MHz from 40Mhx XOSC */ /* PLL input FXOSC 40MHz VCO range 600-1200MHz MPC5744P uses PLL1 for fractional divide options. Configure PLL1 first, because it depends on PLL0. So configure while PLL0 still off */ /* Program PLL1 to same frequency as PLL0. * MFD multiplies input by at least 10. So multiply by 10 and divide by 10. * 10/10 1, so same frequency as PLL0 */ PLLDIG.PLL1DV.B.RFDPHI 10; PLLDIG.PLL1DV.B.MFD 10; /* Configure PLL0 to 160 MHz. */ PLLDIG.PLL0DV.B.RFDPHI1 4; PLLDIG.PLL0DV.B.RFDPHI 4; PLLDIG.PLL0DV.B.PREDIV 1; PLLDIG.PLL0DV.B.MFD 16; /* switch to PLL */ MC_ME.DRUN_MC.R 0x00130072; MC_ME.MCTL.R 0x30005AF0; MC_ME.MCTL.R 0x3000A50F; while(MC_ME.GS.B.S_MTRANS 1); /* Wait for mode transition complete */ }这几行代码涉及到芯片的模式选择配置我将在下一章节中介绍。好啦时钟部分就到这里结束了其实例程写得也比较简单后面写外设驱动的时候还会教大家怎么配置的