TMS570时钟系统与低功耗模式深度解析:从架构到实战优化
1. 项目概述
时钟系统对于任何嵌入式微控制器而言,都如同人体的心脏和神经系统,它决定了整个芯片的“脉搏”和“节奏”。在TMS570LS12x/11x这类面向功能安全(如ISO 26262 ASIL-D)的汽车级MCU中,时钟系统的设计更是重中之重。它不仅要提供稳定、精准的时序基准,确保CPU、内存、总线以及各类通信外设(如CAN、FlexRay、Ethernet)协同工作,还必须具备极高的可靠性和灵活的功耗管理能力,以满足汽车电子对功能安全和低功耗的严苛要求。
很多工程师在初次接触这类复杂MCU时,往往只关注如何让芯片“跑起来”,即配置PLL获得所需的主频,却忽略了时钟系统的精细化管理。这直接导致了两个问题:一是系统功耗居高不下,在电池供电或需要低功耗待机的场景下续航能力不足;二是在进行功能安全设计时,无法有效实施对时钟失效的监控和响应。实际上,TMS570的时钟架构提供了一套非常精细的“开关”和“调速”机制,允许你对每一个时钟域进行独立控制,并支持多种低功耗模式。理解并掌握这套机制,是从“能用”到“用好”这款芯片的关键一步。
本文将深入拆解TMS570LS12x/11x的时钟系统架构与低功耗模式。我不会仅仅罗列数据手册中的寄存器描述,而是结合我多年在汽车ECU开发中的实际经验,带你理解时钟源(如OSC、PLL、LPO)、时钟域(如GCLK、HCLK、VCLK、VCLKAx)之间的层级关系和配置逻辑。我们会重点探讨如何根据应用需求,动态地启用或禁用时钟域以优化功耗,并详细分析Doze、Snooze、Sleep等低功耗模式的进入、退出流程及其适用场景。最后,我还会分享一些在调试时钟相关问题时,如何利用时钟测试模式和内置安全机制(如振荡器监控、PLL滑差检测、双时钟比较器DCC)进行故障诊断的实战技巧。无论你是正在评估TMS570系列芯片,还是已经在项目中遇到了功耗或时钟稳定性的挑战,相信这篇内容都能给你带来直接的帮助。
2. 时钟系统架构深度解析
TMS570LS12x/11x的时钟系统并非一个简单的树状分频器,而是一个高度模块化、可配置且具备安全监控能力的复杂网络。它的核心设计思想是“按需供给”和“分层管理”,旨在为不同的功能模块提供最合适的时钟,同时最大限度地减少不必要的动态功耗。
2.1 时钟源:系统的“心脏”
一切时钟的起点都是时钟源。TMS570提供了多个时钟源,你可以把它们想象成不同特性的“发电机”。
- 主振荡器:通常是外部晶体或陶瓷谐振器,提供高精度、稳定的基础频率。这是系统上电后默认的时钟源,也是PLL的参考输入。
- PLL1 & PLL2:锁相环。它们的作用是将低频的输入时钟(如主振荡器)倍频到芯片工作所需的高频。PLL1通常用于生成CPU、系统总线和高性能外设的核心时钟;PLL2可能用于生成特定外设(如以太网)所需的特殊频率。启用PLL需要等待其锁定(Lock)信号稳定,这是一个关键时序点。
- 外部时钟输入:芯片可以直接接收外部有源时钟信号,绕过内部振荡器电路。
- 低频/高频LPO:内部低功耗振荡器。LF LPO频率很低(例如32kHz),用于在低功耗模式下维持基本计时;HF LPO频率较高(例如10MHz),但精度较差,常用于唤醒序列或作为安全监控的参考时钟。LPO的优点是启动速度快,功耗极低。
实操心得:在电路设计时,务必参考数据手册的“电气特性”章节,为外部晶体匹配正确的负载电容。电容值不匹配会导致振荡频率偏移,轻则通信波特率不准,重则导致PLL无法锁定或系统工作不稳定。我曾在一个项目中因为省事用了“大概差不多”的电容,结果在低温下CAN通信偶尔出错,排查了很久才发现是晶体起振不良导致的时钟抖动。
时钟源的管理通过CSDIS、CSDISSET、CSDISCLR这一组寄存器完成。这里有一个关键机制:一个时钟源只有在没有任何时钟域使用它时,才能被真正关闭。这意味着你不能简单地写CSDIS寄存器来关闭PLL,必须先确保所有依赖PLL的时钟域(如GCLK、HCLK)已经切换到了其他时钟源(如OSCIN)或被禁用。
2.2 时钟域:电力的“分配箱”
时钟源产生的时钟信号,需要分配到芯片的各个功能区域,这些区域就是时钟域。每个时钟域可以独立选择时钟源,也可以独立地被开启或关闭。这是实现精细功耗管理的基石。
根据你提供的资料,我们重点关注几个关键的异步时钟域:
- VCLKA2:专用于FlexRay控制器及其专用传输单元。FlexRay是汽车高速网络协议,对时钟精度和稳定性要求极高。此域默认源为VCLK,但频率最高可达HCLK的频率。这意味着即使总线时钟较低,FlexRay模块仍可以全速运行。
- VCLKA4:专用于以太网控制器。当EMAC的TX和RX时钟由内部产生时使用。它同样源自VCLK,且可通过
VCLKACON1寄存器中的VCLKA4R字段进行1到8的分频,默认是2分频。这为调整以太网模块的时钟频率提供了灵活性,以适应不同的功耗和性能需求。 - RTICLK:用于实时中断模块的时间基准生成。它默认源也是VCLK,但有一个重要的安全限制:如果为RTICLK选择了非VCLK的时钟源,则RTICLK的频率必须小于或等于VCLK频率的1/3。这一限制通常是为了确保在VCLK(系统主时钟)出现故障时,RTI(作为看门狗或时间基准)能够以一个更慢但可靠的时钟继续工作,从而触发安全响应。你可以通过
RCLKSRC寄存器的RTI1DIV字段对选中的时钟源进行1、2、4或8分频来满足此要求。
时钟域的开关通过CDDIS、CDDISSET、CDDISCLR寄存器控制。与时钟源类似,一个时钟域只有在所有使用它的模块都“许可”关闭时,才能被真正关闭。这个“许可”通常意味着该模块处于空闲或软件已将其禁用。例如,你想关闭VCLKA4以省电,必须先确保以太网控制器(EMAC)已被正确禁用,并释放了对该时钟域的占用。
2.3 时钟路径与映射逻辑
理解了源和域,接下来就是连接它们的“线路”和“开关”。
- 核心时钟路径:CPU时钟、系统模块时钟和大部分外设总线时钟是联动的。它们通过
GHVSRC寄存器选择一个共同的时钟源。上电后,默认使用主振荡器。此时,GCLK和HCLK以OSCIN频率运行,而VCLKx则是OSCIN频率的二分频。当你启用PLL并切换GHVSRC后,整个系统的核心时钟频率会同步提升。 - 异步外设时钟路径:像VCLKA1、VCLKA2、VCLKA4和RTICLK这样的异步时钟域,则有自己独立的源选择寄存器(
VCLKASRC、VCLKACON1、RCLKSRC)。这允许它们独立于核心系统时钟运行。例如,在Doze模式下,CPU时钟(GCLK)可以停止,但RTICLK仍然运行以维持定时中断。 - 外设级门控:除了时钟域,每个具体的外设(如某个特定的UART或SPI模块)还有一层更细粒度的时钟门控,通常由外设自己的控制寄存器或中央资源控制器管理。即使其所在的VCLKx域是开启的,如果外设自身被禁用,它的时钟也会被门控住,从而实现更底层的功耗节省。
这种分层、分级的时钟管理架构,赋予了开发者极大的灵活性。你可以构建这样的场景:CPU以低速运行(使用LF LPO),以太网模块以中速运行(VCLKA4分频),而FlexRay模块仍以全速运行(VCLKA2),同时关闭所有其他不用的外设时钟域。这种“精打细算”正是汽车电子低功耗设计的精髓。
3. 低功耗模式实战指南
低功耗模式不是简单的“让芯片睡觉”,而是一套有严格进入、运行和退出序列的状态机。TMS570LS12x/11x文档中重点描述了三种典型模式:Doze、Snooze和Sleep。它们本质上是通过组合关闭不同的时钟源和时钟域来实现的。
3.1 三种低功耗模式对比与选型
下表清晰地对比了三种模式的核心特征:
| 模式 | 活动时钟源 | 活动时钟域 | 典型唤醒源 | 建议唤醒时钟源 | 功耗水平 | 唤醒延迟 |
|---|---|---|---|---|---|---|
| Doze | 主振荡器 | RTICLK | RTI中断、GIO中断、CAN消息、SCI消息 | 主振荡器 | 低 | 短(仅Flash状态切换) |
| Snooze | LF LPO | RTICLK | RTI中断、GIO中断、CAN消息、SCI消息 | HF LPO | 非常低 | 中(需HF LPO启动+Flash切换) |
| Sleep | 无 | 无 | GIO中断、CAN消息、SCI消息 | HF LPO | 最低 | 长(需HF LPO启动+Flash切换) |
模式选择策略:
- Doze模式:适用于需要快速响应、但CPU可以暂停执行的场景。例如,等待一个周期性的RTI定时中断来执行后台任务。因为主振荡器和PLL都保持运行,唤醒后几乎无需等待,可以立刻全速执行代码。
- Snooze模式:适用于对功耗要求更严格,且能容忍稍长唤醒时间的待机场景。CPU和高速时钟关闭,仅由超低功耗的LF LPO维持RTICLK,功耗极低。当唤醒事件发生时,需要先启动HF LPO,再恢复Flash,最后切换回主时钟,这个过程需要几十到几百微秒。
- Sleep模式:是最深的低功耗模式,所有内部时钟源都停止。只有特定的引脚中断或通信模块(配置为在无时钟情况下仍能检测边沿或消息)才能唤醒系统。唤醒延迟最长,因为需要从头启动HF LPO和整个时钟系统。
注意事项:CAN或SCI(UART)消息唤醒通常要求这些模块在低功耗模式下被配置为“唤醒模式”,并且外部需要有一个持续的电平或特定的报文帧来触发唤醒。硬件设计时,需要确保在Sleep模式下,这些通信接口的供电和基本信号链路仍然存在。
3.2 进入低功耗模式的标准化软件序列
进入低功耗模式不是一个单条指令,而是一个需要精心编排的序列,以确保数据完整性和硬件状态安全。以下是基于文档和最佳实践的标准化步骤:
步骤一:配置Flash进入睡眠模式这是最容易忽略但至关重要的一步。Flash存储器有不同的功耗状态(Active, Standby, Sleep)。在关闭其时钟前,必须指示Flash进入低功耗的Sleep模式。
// 假设使用HALCoGen或类似库,关键操作是设置Flash控制器的回退模式为Sleep // 这通常涉及配置FEDAC、FBPWRMODE等寄存器 // 需要等待所有Flash bank确认不再被访问(AGP周期结束) systemREG1->FBPWRMODE = (systemREG1->FBPWRMODE & ~0xFF) | 0xAA; // 示例:设置所有bank为Sleep while((systemREG1->FBPWRMODE & 0xFF) != 0xAA); // 等待确认 // Flash Pump会在所有Bank进入Sleep后自动进入Sleep步骤二:禁用不需要的时钟源检查当前有哪些时钟源是活动的(如PLL1、PLL2),如果确定在低功耗模式下不需要它们,就将其禁用。记住前提:先切换走依赖它的时钟域。
// 1. 将GCLK/HCLK/VCLKx的源从PLL切换回OSCIN(如果需要关闭PLL) systemREG1->GHVSRC = (systemREG1->GHVSRC & ~0x7) | 0x0; // 选择OSCIN // 2. 等待时钟切换稳定(通常需要几个周期) __asm(" nop"); __asm(" nop"); // 3. 禁用PLL1时钟源 systemREG1->CSDISSET = (1 << 1); // 设置CLKSR1OFF (PLL1)步骤三:禁用不需要的时钟域根据目标低功耗模式,禁用相应的时钟域。例如,进入Doze模式,可能需要保留RTICLK域,禁用GCLK域。
// 禁用CPU时钟域 (GCLK),位0对应GCLK systemREG1->CDDISSET = (1 << 0); // 检查CDDIS寄存器确认该域已成功禁用(等待模块“许可”) while((systemREG1->CDDIS & (1 << 0)) == 0);步骤四:执行CPU空闲指令这是让CPU核心进入低功耗状态的最后软件指令。
// 执行WFI (Wait For Interrupt) 指令 __asm(" wfi"); // 执行此指令后,CPU核心将暂停,等待中断唤醒 // 全局时钟模块(GCM)在检测到CPU空闲且GCLK域被请求禁用后,会关闭GCLK时钟3.3 低功耗模式进入的特殊考量与避坑指南
在实际操作中,直接套用上述序列可能会遇到问题。以下是我踩过的一些“坑”:
总线主设备活动:文档特别警告,在应用程序试图进入低功耗模式时,像HTU、FTU、POM这类总线主设备模块可能还有未完成的事务。强行关闭它们的时钟会导致设备状态不可预测。正确的做法是:在进入低功耗序列前,确保这些模块的当前传输任务已经完成,并将其置于空闲或禁用状态。例如,停止DMA传输,等待传输完成标志,然后禁用DMA通道。
唤醒后的时钟源选择:
GHVSRC寄存器中的GHVWAKE字段允许你指定唤醒后GCLK/HCLK/VCLKx使用的时钟源。如果你在Snooze/Sleep模式下关闭了主振荡器和PLL,那么唤醒时必须选择一个能快速启动的源,通常是HF LPO。配置错误会导致唤醒失败或系统挂起。// 在进入低功耗模式前,设置唤醒时钟源为HF LPO systemREG1->GHVSRC = (systemREG1->GHVSRC & ~(0x7 << 8)) | (0x5 << 8); // GHVWAKE = 0x5 (HF LPO)外设模块的“许可”:禁用时钟域(
CDDIS)不是立即生效的。你需要轮询CDDIS寄存器,直到对应位被硬件置起,才表示所有相关模块已释放该时钟域。忘记等待会导致后续操作基于错误的时钟状态假设。中断配置:确保你期望的唤醒中断(如RTI中断、GIO中断)已被正确使能,并且其优先级和CPU的中断屏蔽状态(如CPSR中的I位)允许它唤醒CPU。在WFI执行前,最好清除可能挂起的中断标志,避免误唤醒。
4. 时钟安全机制与诊断技巧
对于安全关键系统,时钟不仅不能停,更不能错。TMS570内置了多层时钟监控机制。
4.1 振荡器失效检测
这是第一道防线。一个专用的CLKDET电路,以HF LPO为参考,持续监测主振荡器频率。如果OSCIN频率超出范围(f(HF LPO)/4到f(HF LPO)*4),就会触发振荡器失效标志。未经修剪的HF LPO频率范围是5.5MHz到19.5MHz,因此有效的OSCIN范围大致在1.375MHz到78MHz之间。你需要在系统初始化时配置LPOMONCTL寄存器,决定检测到失效后系统如何响应(如产生错误信号、触发复位或切换时钟源)。
4.2 PLL滑差检测
PLL可能因为电源噪声、温度突变等原因失锁。PLL内部的滑差检测器会监测两种错误:
- RFSLIP:输出时钟相对于参考时钟过快。
- FBSLIP:输出时钟相对于参考时钟过慢。 一旦检测到滑差,状态会被记录在
GLBSTAT寄存器中。同样,你可以配置滤波器和系统响应策略。
4.3 外部时钟监控与双时钟比较器
- 外部时钟监控:你可以通过配置
ECPCNTL寄存器,将VCLK分频后的信号从ECLK引脚输出。外部电路可以监控这个信号的频率,从而间接验证芯���内部主时钟是否运行在预期频率。这是一个由外部硬件实现的冗余监控手段。 - 双时钟比较器:这是芯片内部一个非常强大的自我检查工具。DCC模块包含两个独立的递减计数器,分别由两个独立的时钟驱动。例如,DCC1可以用���知良好的主振荡器时钟驱动计数器0,用待测的PLL1输出时钟驱动计数器1。两个计数器从相同的种子值开始递减,由于时钟频率不同,它们会在不同时间点计数到零。通过比较两个计数器归零的时间差,就可以判断待测时钟的频率是否在允许的容差范围内。这在功能安全设计中常用于在线监测PLL的稳定性。
4.4 时钟测试模式:调试的利器
当你的系统时钟行为异常,或者想确认某个内部时钟信号的实际频率时,时钟测试模式是你的“示波器探头”。通过配置CLKTEST寄存器,你可以将内部众多的时钟源或时钟域信号映射到ECLK或**N2HET1[12]**引脚上输出。
操作流程如下:
- 将
CLKTEST.CLK_TEST_EN字段写入0x5,使能时钟测试模式。 - 通过
SEL_ECP_PIN字段选择要输出到ECLK引脚上的信号(如0x1000选择GCLK)。 - 通过
SEL_GIO_PIN字段选择要输出到N2HET1[12]引脚上的信号(通常是各时钟源的有效状态标志)。 - 将ECLK和N2HET1[12]引脚配置为功能模式(通过SYSPC1等寄存器)。
- 用示波器或逻辑分析仪测量这些引脚,即可直观看到内部时钟的波形和频率。
调试心得:我曾遇到一个疑难杂症,系统在某种低温条件下会随机死机。使用时钟测试模式将GCLK输出到ECLK引脚后,用示波器长时间监控,发现在死机前瞬间,GCLK波形出现了严重的抖动和周期拉伸。这直接将问题定位到了电源完整性或PLL稳定性上。最终发现是PCB板上一颗去耦电容的容值在低温下变化超标,导致PLL供电纹波过大而失锁。没有这个测试模式,这种问题的排查将如同大海捞针。
5. 关键寄存器精讲与配置示例
理解了原理,最终都要落实到寄存器配置上。我们挑几个最核心的寄存器,看看如何操作。
5.1 时钟源与时钟域控制寄存器组
这是功耗管理的直接控制面板。
CSDIS,CSDISSET,CSDISCLR:管理8个时钟源的禁用状态。CSDIS直接反映状态,CSDISSET写1禁用,CSDISCLR写1启用。注意:上电或唤醒后,只有时钟源0、4、5(OSC, LF LPO, HF LPO)是默认启用的。CDDIS,CDDISSET,CDDISCLR:管理时钟域的禁用状态。每个位对应一个时钟域(见表2-10)。例如,禁用以太网时钟域VCLKA4:// 先确保EMAC模块已停止并释放时钟 emacREG1->MACCONTROL = 0; // 禁用EMAC // 请求禁用VCLKA4域 (位11) systemREG1->CDDISSET = (1 << 11); // 等待确认禁用完成 while((systemREG1->CDDIS & (1 << 11)) == 0);
5.2 时钟源选择寄存器
这是时钟路由的调度中心。
GHVSRC:这是最重要的寄存器之一。低3位GHVSRC选择GCLK/HCLK/VCLKx的当前运行源,高3位GHVWAKE选择唤醒后的源。切换时钟源(尤其是切换到PLL)必须遵循严格的序列:- 确保目标时钟源(如PLL)已启用且稳定(锁定)。
- 配置
GHVSRC.GHVWAKE为目标源。 - 执行一个特殊的“时钟切换请求”操作(可能涉及向
GHVSRC的CLKCHANGE位写1,具体请查勘误表或最新数据手册)。 - 等待切换完成标志。
VCLKASRC,VCLKACON1,RCLKSRC:分别控制VCLKA1/A2、VCLKA4和RTICLK的时钟源。配置相对简单,但务必注意RTICLK的频率限制(≤ VCLK/3)。
5.3 低功耗模式相关配置示例
假设我们要配置系统进入Snooze模式,由RTI定时唤醒。
void enterSnoozeMode(void) { // 1. 配置Flash进入Sleep模式 (此处为示例,需根据具体Flash控制器寄存器操作) configureFlashForSleep(); // 2. 切换核心时钟源为OSCIN(如果当前在用PLL),为关闭PLL做准备 uint32_t ghvsrc_backup = systemREG1->GHVSRC; systemREG1->GHVSRC = (ghvsrc_backup & ~0x7) | 0x0; // 切换到OSCIN // 等待切换稳定... // 3. 禁用PLL1时钟源(假设不需要) systemREG1->CSDISSET = (1 << 1); // 禁用PLL1 // 4. 配置唤醒时钟源为HF LPO systemREG1->GHVSRC = (systemREG1->GHVSRC & ~(0x7 << 8)) | (0x5 << 8); // GHVWAKE = HF LPO // 5. 禁用除RTICLK外的时钟域。需要根据实际使用的外设决定。 // 例如,禁用CPU时钟域(GCLK)、系统时钟域(HCLK)等。 // 注意:RTICLK域(对应CDDIS bit 6)必须保持开启。 systemREG1->CDDISSET = (1 << 0) | (1 << 1) | (1 << 2) | (1 << 3) | (1 << 4); // 示例:禁用GCLK, HCLK, VCLK1,2,3等 // 等待各域禁用完成... while((systemREG1->CDDIS & (0x1F)) != (0x1F)); // 等待bit 0-4被置位 // 6. 确保RTI中断已配置并启用 rtiREG1->INTFLAG = 0xFF; // 清除RTI中断标志 rtiREG1->INTENA = 0xFF; // 启用RTI中断 _enable_IRQ(); // 使能CPU全局中断 // 7. 执行WFI指令 __asm(" wfi"); // CPU在此挂起,等待RTI中断... // 8. 唤醒后,系统会先以HF LPO运行,执行中断服务程序。 // 在RTI中断服务程序(ISR)或主循环中,需要恢复系统到全速模式。 } // RTI中断服务程序中恢复时钟 void rtiInterruptHandler(void) { rtiREG1->INTFLAG = 0xFF; // 清除中断标志 // 1. 恢复时钟域 systemREG1->CDDISCLR = (1 << 0) | (1 << 1) | (1 << 2) | (1 << 3) | (1 << 4); // 2. 重新使能PLL1并等待锁定 systemREG1->CSDISCLR = (1 << 1); while((systemREG1->CSVSTAT & (1 << 1)) == 0); // 等待PLL1有效 // 3. 切换核心时钟源回PLL1 systemREG1->GHVSRC = (systemREG1->GHVSRC & ~0x7) | 0x1; // 选择PLL1 // 等待切换完成... // 4. 恢复Flash到Active模式 configureFlashForActive(); }6. 常见问题排查与实战经验
问题一:进入低功耗模式后电流下降不明显。
- 排查思路:
- 检查时钟域:使用调试器读取
CDDIS寄存器,确认你希望关闭的时钟域是否真的被禁用了(对应位为1)。如果没有,说明有模块还在占用它。检查所有相关外设(DMA、通信模块、定时器等)是否已完全停止。 - 检查时钟源:读取
CSDIS寄存器,确认不用的高频时钟源(如PLL2)是否已关闭。 - 检查外设级门控:即使时钟域开着,如果外设自身的时钟被门控,功耗也会降低。确保在进入低功耗前,已通过各外设的自身控制寄存器(如
xxxCR中的CLKEN位)将其禁用。 - 检查I/O引脚:未使用的I/O引脚如果悬空,可能会因漏电流或振荡导致功耗增加。将其配置为输出低电平或带上拉/下拉的输入模式。
- 检查时钟域:使用调试器读取
问题二:系统无法从低功耗模式唤醒。
- 排查思路:
- 确认唤醒源:检查你期望的唤醒中断是否已正确使能(外设中断使能位和CPU的IRQ/FIQ使能)。在WFI前,清除可能存在的旧中断标志。
- 检查唤醒时钟源:确认
GHVSRC.GHVWAKE字段配置是否正确。如果你关闭了主振荡器,唤醒源必须是HF LPO。 - 检查HF LPO:HF LPO是否已启用(
CSDIS中CLKSR5OFF位为0)?它的有效状态CSVSTAT位是否为1? - 检查唤醒信号:对于引脚中断唤醒,确认引脚功能复用、上下拉电阻配置正确,且外部信号确实产生了有效的边沿。对于CAN/SCI唤醒,确认模块已配置为唤醒模式,且总线上有正确的唤醒帧。
问题三:切换时钟源后系统跑飞或外设工作异常。
- 排查思路:
- 遵循切换序列:时钟源切换,尤其是切换到PLL,必须等待新时钟源稳定(PLL锁定)。切换后需要等待几个时钟周期让新时钟稳定传播。
- 注意外设同步:一些外设(特别是基于VCLKAx异步时钟域的)可能在时钟切换过程中需要重新初始化或同步。查阅具体外设的用户指南,看是否有关于时钟切换的特殊说明。
- 检查Flash等待状态:当提高CPU主频(GCLK)后,Flash的访问速度可能跟不上。需要根据新的HCLK频率,调整Flash控制器的等待状态配置,否则会导致取指错误。
问题四:如何测量系统实际运行频率?
- 方法1:使用ECLK输出。将GCLK或VCLK分频后通过ECLK引脚输出,用频率计或示波器测量。
- 方法2:使用RTI和GIO。配置一个RTI定时器,在中断服务程序里翻转一个GIO引脚,测量该引脚的方波频率,反推RTICLK和系统时钟频率。
- 方法3:使用DCC模块。用DCC以已知的、稳定的时钟(如LF LPO)去测量另一个时钟(如GCLK)的频率,通过读取计数器值计算比例。
最后一点经验:在开发初期,不要急于优化到最低功耗。先让系统在全功能、全时钟开启的状态下稳定运行。然后,像“关灯”一样,一个一个地禁用未使用的外设时钟和时钟域,每做一步都测试功能是否正常,并测量电流变化。使用数据手册中的典型功耗数据作为参考,但要以实际测量为准。功耗优化是一个迭代和平衡的过程,需要在性能、响应时间和省电之间找到最适合你应用场景的平衡点。