1. 项目概述与RTC_B模块的核心价值在嵌入式系统开发里实时时钟RTC模块的地位有点像我们家里的挂钟——平时你可能不会时刻盯着它但一旦你需要知道准确时间或者设定一个闹钟它的重要性就立刻凸显出来了。尤其是在那些需要长时间独立运行、对功耗极其敏感的电池供电设备上比如智能水表、环境监测传感器、可穿戴设备一个精准且省电的RTC往往是决定产品成败的关键。我最近在做一个基于TI MSP430系列MCU的低功耗数据记录仪项目核心需求就是设备大部分时间在深度睡眠但需要每隔固定时间比如每小时精确醒来采集一次数据并且记录下每次采样的确切时间戳。这就要求RTC模块必须满足两个看似矛盾的要求一是走时要准年误差最好能控制在几分钟以内二是要足够省电在睡眠模式下几乎不消耗电量。经过一番折腾和调试我最终把MSP430内置的RTC_B模块摸了个门清特别是它的频率校准功能和LPM3.5低功耗模式下的“生存”技巧。今天这篇文章我就把自己从数据手册里啃出来、再到代码里验证过的这些实战经验掰开揉碎了分享给你。无论你是刚接触RTC的新手还是正在为产品的时间精度和功耗发愁的老鸟相信这些踩过的坑和总结出的套路都能让你少走不少弯路。2. RTC_B模块的整体架构与设计思路拆解2.1 时钟链与核心计数器理解RTC的“心跳”RTC_B模块的运作本质上是一个精密的“数心跳”过程。它的“心脏”是一个外接的32.768kHz低频晶体振荡器LFXT。这个频率是经过精心选择的因为32768是2的15次方经过简单的15级二分频就能得到精准的1Hz秒信号。在RTC_B内部这个“数心跳”的过程被分解为两级预分频计数器RT0PS和RT1PS和一个日历时间计数器。首先32.768kHz的原始时钟信号进入RT0PS预分频器。RT0PS是一个8位计数器它固定地将输入时钟除以256。这个设计很巧妙因为32768 / 256 128 Hz。这个128Hz的信号就成了RT1PS的时钟源。RT1PS也是一个8位计数器但它可以通过RTCPS1CTL寄存器中的RT1IPx位进行灵活配置分频系数可以是2、4、8、16、32、64、128或256。通常我们会将RT1PS配置为除以256这样128Hz / 256 0.5Hz即每2秒产生一次溢出。这个溢出信号就是驱动日历时间计数器秒、分、时、日等前进的“秒脉冲”基础。为什么要设计两级预分频直接用一个15级的分频器不行吗这里面的考量一是为了灵活性。RT1PS的中断RT1PSIFG可以作为一个独立的、周期可调的定时中断源用于唤醒系统执行一些比1秒更频繁的任务比如每125ms128Hz/16检查一次按键。二是为了校准。校准逻辑正是通过微调RT1PS计数器的计数行为来实现的这一点我们后面会详细说。这种架构在保证核心计时功能的同时为开发者提供了额外的定时资源和精度调整手段。2.2 校准逻辑给“心跳”做微调手术任何晶体都有频率误差可能是由于制造公差、环境温度、老化等因素造成的。一个标称32.768kHz的晶体实际频率可能是32.768.5Hz也可能是32.767.8Hz。日积月累这点微小的误差就会导致时钟走快或走慢。RTC_B的校准逻辑就是为了修正这个初始频率偏差。校准的核心寄存器是RTCCTL2它包含两个关键字段RTCCALS校准符号位和RTCCALx6位校准值。其工作原理不是直接改变晶体振荡频率而是通过周期性地“插入”或“跳过”RT1PS计数器的时钟脉冲来等效地调整最终“秒脉冲”的频率。具体来说校准操作以60分钟117,964,800个LF时钟周期为一个周期。在这个周期内向下校准调慢时钟设置RTCCALS 0。此时每设置一个RTCCALx LSB就会在60分钟周期内让RT1PS计数器“多停留”一个RT0PS输出时钟周期即一个128Hz脉冲的周期。由于RT0PS的输出频率是128Hz增加一个周期相当于在总周期数里增加了1/128秒。计算其带来的频率变化Δf (1/128) / (60*60) ≈ -2.17 ppm百万分之一。所以手册中近似表述为每LSB约-2 ppm。向上校准调快时钟设置RTCCALS 1。此时每设置一个RTCCALx LSB就会在60分钟周期内让RT1PS计数器“提前触发”两个RT0PS输出时钟周期。这相当于在总周期数里减少了2/128秒。计算其频率变化Δf (-2/128) / (60*60) ≈ 4.34 ppm。手册中近似为每LSB约4 ppm。注意这里有一个非常关键的细节也是我最初理解错误的地方。校准操作的对象是RT1PS计数器而不是直接作用于晶体振荡器或RT0PS。它通过改变RT1PS“吃到”的时钟脉冲数量来影响其溢出产生“秒脉冲”的间隔从而实现宏观上的频率修正。这种方法的优点是纯数字逻辑实现不涉及模拟电路调整非常稳定可靠。2.3 低功耗模式LPM3.5支持让RTC在“冬眠”中坚守岗位MSP430的LPM3.5模式是其超低功耗的“王牌”。在此模式下内核电压调节器被关闭几乎所有外设的配置寄存器都会丢失并复位主时钟停止系统功耗可以降到微安级以下。然而RTC_B模块的部分功能却被设计为可以在此模式下幸存。进入LPM3.5后RTC_B模块中得以保留的部分包括所有计数器RT0PS, RT1PS, 以及日历时间计数器秒、分、时、日、月、年。这是RTC的核心价值所在时间不能丢。部分控制寄存器的“配置状态”注意是配置状态比如中断使能位RTCTEVIE, RTCAIE等而不是寄存器本身的值。这些状态被硬件锁存用于在唤醒事件发生时恢复中断配置。中断标志如果进入LPM3.5前某个中断使能位未开启但其对应的中断标志位如RTCTEVIFG却被置位了那么这个标志位会被硬件自动清零。这是一个防误触发的保护机制。能够将系统从LPM3.5这种深度睡眠中唤醒的RTC事件包括时间事件中断RTCTEVIFG、闹钟中断RTCAIFG、预分频器1中断RT1PSIFG以及晶振故障中断RTCOFIFG。只要在进入睡眠前使能了对应的中断RTC就能在后台默默计时并在预定时刻“叫醒”整个系统。3. 频率校准的完整实操流程与细节解析理解了原理我们来看怎么动手。校准的目标是让RTC输出的时间尽可能准确。官方手册给出了一个流程但实际做起来有几个坑需要特别注意。3.1 硬件准备与信号测量校准的第一步是把内部的校准时钟信号引到外部进行测量。这通过配置RTCCTL3寄存器中的RTCCALFx位来实现可以选择输出512Hz、256Hz或1Hz的信号到指定的RTCCLK引脚。选择哪个频率512Hz / 256Hz频率较高用普通的频率计或示波器能快速、相对准确地测量。但请注意手册里的重要提示这两个频率的输出点在校准逻辑之前这意味着你测量到的512Hz信号不会随着你调整RTCCALx寄存器而改变。它们仅用于判断晶体的原始频率偏差。如果你想通过观察输出频率的变化来验证校准是否生效这两个频率是无效的。1Hz这个1Hz信号来源于校准逻辑之后是真正反映了校准效果的时间基准。调整RTCCALx这个1Hz信号的周期会随之微调。但是1Hz的频率太低要精确测量其周期误差在ppm级别需要非常专业的设备如高精度频率计数器和很长的测量时间可能需连续测量上千个周期做平均。对于大多数开发场景这并不现实。我的实操建议对于产品研发和初期校准我推荐使用512Hz输出模式。虽然它不反映校准效果但能非常方便地让你知道晶体本身的初始误差有多大。你可以用一个精度尚可的示波器或频率计在短时间内获得一个相对可靠的测量值从而计算出需要补偿的ppm值。测量实操要点将RTCCLK引脚配置为外围模块功能输出。设置RTCCTL3 RTCCALF_1;选择512Hz输出。使用频率计测量该引脚输出的实际频率f_measured。确保测量时间足够长例如10秒以上以平均掉短期的测量抖动。计算绝对误差ppm误差_ppm | (f_measured - 512) / 512 * 1e6 |3.2 校准值计算与软件实现得到误差ppm值后就需要计算RTCCALx的数值。根据手册公式若频率偏低需调快RTCCALS 1,RTCCALx round(误差_ppm / 4.34)若频率偏高需调慢RTCCALS 0,RTCCALx round(误差_ppm / 2.17)这里有一个极其重要的边界条件RTCCALx是一个6位寄存器最大值是630x3F。这意味着向下校准RTCCALS0的最大调整范围是63 * 2.17 ppm ≈ 136.7 ppm。向上校准RTCCALS1的最大调整范围是63 * 4.34 ppm ≈ 273.4 ppm。如果你的晶体误差超过了这个范围单靠RTC_B的内部校准是无法修正的必须更换晶体。通常一个合格的32.768kHz晶体初始精度应在±20ppm以内完全在校准范围内。软件校准函数示例C语言/** * brief 根据测量的RTCCLK频率计算并设置校准值 * param measured_freq_Hz 实际测量的RTCCLK频率单位Hz * param cal_freq_Hz 预期的RTCCLK频率应为512 256或1 * return 0成功-1失败误差超出可调范围 */ int8_t RTC_Calibrate(float measured_freq_Hz, uint16_t cal_freq_Hz) { float error_ppm; uint8_t cal_value; uint8_t max_cal 63; // RTCCALx 最大为63 // 1. 计算绝对误差 (ppm) error_ppm fabs((measured_freq_Hz - (float)cal_freq_Hz) / (float)cal_freq_Hz * 1e6); // 2. 判断调快还是调慢并计算校准值 if(measured_freq_Hz cal_freq_Hz) { // 频率偏低需要调快 (RTCCALS 1) cal_value (uint8_t)(error_ppm / 4.34 0.5); // 四舍五入 if(cal_value max_cal) { return -1; // 误差太大无法校准 } // 清除之前的校准设置然后写入新值 RTCCTL2 (RTCCTL2 ~(RTCCALS | RTCCALx_MASK)) | (RTCCALS | cal_value); } else { // 频率偏高需要调慢 (RTCCALS 0) cal_value (uint8_t)(error_ppm / 2.17 0.5); // 四舍五入 if(cal_value max_cal) { return -1; // 误差太大无法校准 } // 清除之前的校准设置然后写入新值 RTCCTL2 (RTCCTL2 ~(RTCCALS | RTCCALx_MASK)) | cal_value; // RTCCALS默认为0 } return 0; }实操心得校准不是一劳永逸的。晶体的频率会随温度变化温度特性也会随时间缓慢变化老化。对于高精度应用上述校准流程最好在产品的典型工作温度下进行。更高级的做法是在MCU中存储一个温度-频率补偿表通过内置的温度传感器定期动态调整RTCCALx值。RTC_B的校准逻辑只补偿初始偏移不处理温度和老化这部分需要软件策略来弥补。4. LPM3.5低功耗模式下的RTC操作全流程让RTC在LPM3.5下正常工作并可靠唤醒系统是低功耗设计的关键。这个过程比单纯使用RTC要复杂因为涉及到寄存器状态的丢失与恢复。下面我结合代码详细分解每一步。4.1 进入LPM3.5前的准备工作在让系统进入深度睡眠之前必须妥善配置好RTC和I/O确保唤醒路径畅通。配置RTC中断作为唤醒源假设我们想每天午夜唤醒系统。我们需要使能时间事件中断并设置为“每天午夜”模式。// 设置时间事件为每天午夜触发 RTCCTL1 | RTCTEV_3; // 使能时间事件中断 RTCCTL0 | RTCTEVIE; // 确保RTC处于运行状态RTCHOLD 0 RTCCTL1 ~RTCHOLD;配置I/O引脚根据手册进入LPM3.5后I/O引脚的状态会被锁定。因此在进入前需要将所有用到的I/O特别是那些连接了按钮、传感器等可能产生唤醒信号的引脚配置为需要的状态上拉/下拉输入或输出固定电平。// 示例配置P1.0为带上拉电阻的输入用于外部按键唤醒 P1DIR ~BIT0; // 输入模式 P1REN | BIT0; // 使能上下拉电阻 P1OUT | BIT0; // 选择上拉 P1IES | BIT0; // 下降沿触发中断按键按下 P1IE | BIT0; // 使能P1.0中断执行LPM3.5进入序列这是一个标准操作涉及电源管理模块PMM。// 1. 解锁PMM寄存器并设置PMMREGOFF位准备关闭稳压器 PMMCTL0_H PMMPW_H; // 写入密码高字节 PMMCTL0_L | PMMREGOFF; // 设置REGOFF位 // 2. 进入LPM3.5。注意以下汇编指令确保操作原子性。 __bis_SR_register(LPM4_bits | GIE); // 使用LPM4_bits因为LPM3.5在寄存器层面由PMMREGOFF标识 // 执行完这条指令后CPU停止稳压器关闭进入LPM3.5。4.2 从LPM3.5唤醒与恢复当RTC时间事件或外部引脚中断发生时设备开始唤醒流程。唤醒后所有外设寄存器包括RTC的大部分控制寄存器都恢复到了上电默认值但RTC的计数器值和中断配置状态被保留了。唤醒后的初始状态设备由BOR欠压复位序列唤醒核心电压恢复。此时LOCKLPM5位被硬件自动置位它锁定了I/O引脚和RTC中断的配置状态。在清除LOCKLPM5之前I/O和RTC中断保持着进入LPM3.5前的配置但你无法通过软件读取或修改它们。其他外设寄存器都是复位值。关键恢复步骤// 唤醒后首先执行系统初始化时钟、看门狗等... // ... // 1. 重新配置RTC控制寄存器那些在LPM3.5中丢失的 // RTCCTL0, RTCCTL1, RTCCTL3, RTCPS0CTL, RTCPS1CTL 等都需要重新配置 RTCCTL0 0; // 先清零 RTCCTL0 | RTCTEVIE; // 重新使能时间事件中断 RTCCTL1 0; RTCCTL1 | RTCTEV_3; // 重新设置为每天午夜事件 // RTCCTL1的RTCHOLD位默认是1保持需要清除它以启动RTC // 但注意在清除LOCKLPM5前RTC可能已经在运行因为计数器一直保留。 // 通常我们先配置最后再清除RTCHOLD。 // 2. 重新配置其他必要的外设和I/O除了那些被LOCKLPM5锁定的 // 3. 清除LOCKLPM5位。这是释放I/O和RTC中断配置的关键一步。 // 对于MSP430系列通常通过清除PMMCTL0的LOCKLPM5位实现。 // 注意操作PMMCTL0需要密码。 PMMCTL0_H PMMPW_H; // 写入密码高字节 PMMCTL0_L ~LOCKLPM5; // 清除LOCKLPM5 // 4. 现在I/O引脚配置被释放恢复为我们进入LPM3.5前软件设置的状态。 // RTC的中断使能状态也被释放与我们刚重新配置的寄存器值合并生效。 // 最后确保RTC运行 RTCCTL1 ~RTCHOLD; // 5. 检查并处理唤醒中断标志 // RTC的中断标志可能在唤醒时已置位需要检查RTCIV寄存器来判断中断源并清除标志。 uint16_t iv RTCIV; if (iv) { switch (iv) { case RTCIV_RTCTEVIFG: // 时间事件唤醒 // 处理每日任务... break; case RTCIV_RTCAIFG: // 闹钟唤醒 // 处理闹钟事件... break; // ... 其他中断源 } } // 同样处理可能的外部引脚唤醒中断...踩坑记录LOCKLPM5这个位非常关键。我曾有一次忘记清除它结果发现唤醒后所有I/O口都像“冻住”了一样无法响应配置RTC中断也不触发。折腾了好久才想起是这个位在作祟。记住流程先恢复软件配置 - 再清除LOCKLPM5 - 最后处理中断。5. 关键寄存器详解与配置避坑指南数据手册里寄存器表格很多但实际开发中频繁打交道、需要深刻理解的也就那么几个。我挑几个最容易出问题的地方重点讲。5.1 RTCCTL0 RTCCTL1控制与状态核心RTCCTL0 (中断控制寄存器)RTCTEVIE,RTCAIE,RT1PSIE,RTCOFIE这四个中断使能位是能否从LPM3.5被RTC事件唤醒的关键。即使进入深度睡眠只要这些位在睡眠前被使能其“使能状态”就会被保留用于唤醒。RTCTEVIFG,RTCAIFG,RT1PSIFG,RTCOFIFG中断标志位。特别注意如果进入LPM3.5前中断使能位是禁用的但对应的标志位是置位的那么进入LPM3.5时这个标志位会被自动清零。这是一个硬件防误唤醒机制。所以如果你的唤醒逻辑依赖于检查这些标志务必确保在进入睡眠前要么使能了中断要么手动清除了标志。RTCCTL1 (模式控制寄存器)RTCHOLDRTC保持位。1-停止计数0-运行。在修改任何时间/日历寄存器如RTCSEC, RTCMIN等之前必须先置位RTCHOLD停止RTC修改完成后再清除RTCHOLD让其继续运行。否则可能导致计数器进入非法状态或计数错误。RTCTEVx时间事件选择。这个配置决定了RTCTEVIFG在何时置位。00-每分钟01-每小时10-每天午夜11-每天中午。结合RTCTEVIE可以创建周期性的系统唤醒。5.2 RTCCTL2 RTCCTL3校准与输出控制RTCCTL2 (校准寄存器)RTCCALS和RTCCALx如前所述用于频率校准。校准值在RTC运行时也可以修改并且会立即生效。这为软件温度补偿提供了可能。最小校准步进问题手册Note里明确指出最小的可能校准是-4ppmRTCCALS0, RTCCALx0或8ppmRTCCALS1, RTCCALx0。这意味着即使你将RTCCALx设为0它仍然在进行一个最小单位的校准操作而不是“不校准”。如果你希望完全关闭校准功能理论上需要寻找一个让校准影响相互抵消的配置但这很复杂。通常的做法是如果你的晶体非常准误差在±1ppm以内你可以忽略这个最小校准带来的微小影响或者将其视为一个固定的系统偏差。RTCCTL3 (校准频率输出寄存器)RTCCALFx选择RTCCLK引脚输出频率。如前所述00-无输出01-512Hz10-256Hz11-1Hz。在产品最终版本中务必记得将此位设置为00无输出以避免不必要的引脚输出和功耗。5.3 时间/日历寄存器与BCD模式RTC_B支持二进制和BCD两种计数格式由RTCCTL1中的RTCBCD位选择。二进制模式寄存器直接存储十六进制数。例如秒寄存器RTCSEC的0-5位存储0-59的二进制值。读写直观适合内部运算。BCD模式寄存器存储二进制编码的十进制数。例如秒寄存器的高3位6-4位存储十位数0-5低4位3-0位存储个位数0-9。这种格式方便直接驱动数码管或发送给需要十进制格式的上位机。切换模式注意事项RTCBCD位只能在RTCHOLD1RTC停止时修改。切换模式后所有时间/日历寄存器的格式会改变但硬件会自动转换其数值。例如在二进制模式下时间为0x3B59秒切换到BCD模式后寄存器值会变为0x59。不过为了安全起见最好在切换模式前停止RTC切换完成后重新设置时间。读写时间的安全操作由于RTC计数器在后台持续运行直接读取秒、分、时等寄存器可能在读取过程中遇到进位比如在读秒和分之间秒恰好进位了导致读出的时间不一致如“59秒00分”变成“00秒01分”不可能读到“59秒01分”这种非法组合。RTC_B提供了RTCRDY位RTCCTL1.4来保证安全读取。当RTCRDY1时表示所有时间值处于稳定状态可以安全读取。通常的读时间流程是while (!(RTCCTL1 RTCRDY)); // 等待就绪 seconds RTCSEC; minutes RTCMIN; hours RTCHOUR; // ... 依次读取其他寄存器虽然连续读取多个寄存器时中间也可能发生变化但由于变化单位是秒只要读取操作在1秒内完成并且从低位秒向高位年读取即使有进位也能得到一组逻辑上自洽的时间值可能是进位前或进位后的某一瞬间值。RTCRDY机制提供了额外的保障。6. 常见问题排查与调试技巧实录在实际开发中RTC_B模块的问题主要集中在“不准”和“不醒”两个方面。下面是我总结的一些排查思路。6.1 时钟不准问题排查表问题现象可能原因排查步骤与解决方法时钟误差极大每天误差几分钟以上1. 晶体未起振或停振。2. 负载电容不匹配。3. RTCHOLD位被意外置位。1. 用示波器测量晶体引脚注意高阻抗探头应有32.768kHz正弦波。若无检查晶体焊接、电路、MCU振荡器配置选择LF模式正确配置负载电容。2. 根据晶体数据手册调整XTAL引脚连接的负载电容通常为12.5pF左右。电容过大或过小都会导致频率偏移。3. 检查代码确认在初始化后已清除RTCHOLD位。时钟有规律地快或慢误差在几十ppm量级1. 晶体本身初始精度差。2. 校准值RTCCALx计算或设置错误。3. 校准输出频率选择/测量错误。1. 使用512Hz输出模式测量实际频率计算初始误差。若误差超出晶体标称范围更换晶体。2. 复核校准计算代码确认ppm误差公式和除法系数4.34或2.17使用正确。检查RTCCALS位设置是否正确。3. 确认测量的是否是受校准影响的信号1Hz如果是512/256Hz它们不受校准影响不能用来验证校准效果。时钟误差随温度变化明显晶体温度特性导致。RTC_B校准不补偿温度。1. 如果应用环境温度变化大需考虑软件温度补偿。在MCU中存储温度-频率补偿曲线利用内部温度传感器读取温度查表动态调整RTCCALx值。2. 选用温度特性更好的晶体如±5ppm级别。时钟偶尔跳变或停滞1. 电源电压波动大影响振荡器。2. 软件在修改时间寄存器时未停止RTCRTCHOLD。3. 受到了强烈的电磁干扰。1. 确保供电电源稳定尤其在电池供电设备中注意电池低压情况。2. 检查所有修改RTCSEC, RTCMIN等寄存器的代码确保遵循“置位RTCHOLD - 修改 - 清除RTCHOLD”的流程。3. 优化PCB布局晶体尽量靠近MCU走线短用地线包围。6.2 无法从LPM3.5唤醒问题排查表问题现象可能原因排查步骤与解决方法RTC事件无法唤醒系统1. 进入LPM3.5前未使能对应的RTC中断RTCTEVIE等。2.LOCKLPM5位在唤醒后未被清除。3. RTC在LPM3.5中未运行RTCHOLD1。4. 中断标志在进入LPM3.5时被意外清除。1. 单步调试检查进入睡眠前RTCCTL0寄存器中相应中断使能位是否已置位。2. 在唤醒后的初始化代码中确保执行了清除LOCKLPM5的操作需要PMM密码。3. 确认进入睡眠前RTCHOLD0。在LPM3.5中只有RTC运行其中断才能作为唤醒源。4. 如果进入睡眠前中断使能是关闭的但标志是置位的标志会被清空。确保你的唤醒逻辑不依赖于这种状态。唤醒后时间不对或RTC不工作1. 唤醒后未正确恢复RTC配置寄存器。2. 恢复配置寄存器的顺序有误。1. 唤醒后RTCCTL0, RTCCTL1等寄存器已复位。必须在清除LOCKLPM5前重新配置它们如重新使能中断、设置时间事件模式等。2. 遵循正确的恢复顺序先配置RTC等外设 - 再清除LOCKLPM5- 最后清除RTCHOLD如果需要并处理中断。系统反复唤醒或唤醒不稳定1. 唤醒中断标志未及时清除。2. 多个唤醒源同时使能产生竞争。1. 在唤醒中断服务程序ISR中必须读取RTCIV寄存器。这个读取操作会自动清除最高优先级的中断标志。如果只检查标志位而不读RTCIV标志可能一直存在导致反复唤醒。2. 检查是否同时使能了多个RTC中断如每分钟事件和闹钟并确保你的ISR能正确处理所有可能的中断源。6.3 调试技巧利用预分频器中断辅助调试在调试初期尤其是验证LPM3.5唤醒功能时频繁等待一天或一小时来触发事件效率太低。这时可以巧妙利用RT1PS预分频器中断。你可以将RT1PS配置为一个较短的周期例如设置RT1IPx为010b即8分频。RT0PS输出128Hz8分频后是16Hz中断周期为62.5ms。然后在主循环中让系统进入LPM3而不是LPM3.5。在LPM3下大部分外设关闭但RAM和寄存器状态保持调试器仍然可以连接。当RT1PS中断触发时系统会唤醒你可以在中断服务程序里设置一个断点或翻转一个GPIO引脚来验证RTC的中断和唤醒功能是否正常。这比用真实的时间事件来调试要快得多。一旦RT1PS中断唤醒验证通过再将其改为实际需要的长周期如每小时一次并切换到LPM3.5模式进行最终的功耗和长期稳定性测试。这种由简入繁、分步验证的方法能极大提高调试效率。