当前位置: 首页 > news >正文

深入解析TI CC13x2/CC26x2 AON_RTC:低功耗物联网设备的精准时钟与唤醒引擎

1. AON_RTC:低功耗无线MCU的时间基石

在嵌入式系统,尤其是电池供电的物联网设备里,时间是一个既基础又奢侈的概念。说它基础,是因为几乎所有的应用逻辑都离不开时间戳、定时任务和周期性唤醒;说它奢侈,是因为维持一个精准、可靠且低功耗的时钟源,往往需要在硬件设计、时钟校准和功耗管理上投入大量精力。对于TI的CC13x2/CC26x2这类主打低功耗的无线MCU来说,其内置的常开实时时钟模块,就是我们解决这个矛盾的核心武器。

AON_RTC,顾名思义,是一个位于“Always-On”电源域的实时时钟。这意味着除了最深的关机模式,在其他所有功耗模式下,哪怕主MCU域已经断电休眠,它依然能靠着一颗32.768kHz的低速晶振默默计数,为系统守夜。它的核心是一个70位的自由运行计数器,能同时追踪秒和亚秒,精度可以通过软件进行ppm级别的微调。更关键的是,它提供了三个独立的通道,可以实现定时比较、外部事件捕获以及自动重装的周期性触发,这些事件能直接唤醒沉睡中的MCU或协处理器,是实现超低功耗间歇工作的关键。

如果你正在为你的传感节点设计一个需要运行数年、且定时精度要求高的固件,或者你被芯片手册里那些分散的寄存器描述搞得头疼,不知道如何将它们串联成一个可用的定时服务,那么这篇深度解析就是为你准备的。我会从一个实际开发者的角度,带你彻底搞懂AON_RTC的里里外外,从核心原理到寄存器配置的每一个细节,再到实际编程中那些手册里不会明说的“坑”和技巧。

2. 核心架构与工作原理深度剖析

要驾驭AON_RTC,不能只停留在配置寄存器层面,必须理解其内部的工作机制和设计意图。这就像开车,只知道踩油门和刹车是不够的,了解发动机和变速箱的原理,才能开得又快又稳。

2.1 70位自由运行计数器与时钟补偿机制

AON_RTC的核心是一个70位的累加计数器。它被分为两个部分:高32位是SEC寄存器,记录整秒数;低32位是SUBSEC寄存器,记录秒的小数部分。这个计数器在每个32.768kHz时钟的上升沿递增。

这里有一个至关重要的细节:递增的步长是可编程的。默认情况下,每个时钟周期计数器增加0x200000(即2^21)。为什么是这个数?因为SUBSEC寄存器是一个32位的定点数,其满量程0xFFFFFFFF代表1秒。0x200000/0x100000000= 1/32768,正好对应32.768kHz时钟的一个周期。所以,默认配置下,计数器以1/32768秒的精度累加。

但现实世界的32.768kHz晶振或RC振荡器都有频率误差,可能是+20ppm或-50ppm。如果放任不管,一天就会产生数秒的累积误差。AON_RTC的巧妙之处在于SUBSECINC寄存器。通过修改这个寄存器的值,我们可以改变每个时钟周期的递增量,从而补偿时钟源的频率偏差。

补偿值如何计算?公式是:SUBSECINC.VALUEINC = 2^38 / F_clk。其中F_clk是你的实际低频时钟频率(单位Hz)。例如,如果你的晶振实测频率是32766Hz(偏差-2Hz,约-61ppm),那么补偿值应为2^38 / 32766 ≈ 0x2000B1。将这个值写入AUX_SYSIF:RTCSUBSECINC0/1寄存器组,并通过AUX_SYSIF:RTCSUBSECINCCTL.UPD_REQ触发更新,RTC的“走时”速度就会被精确校准。这是一个软件实现的硬件级补偿,是保证长期定时精度的关键。

注意SUBSECINC寄存器本身是只读的,它反映的是当前生效的递增值。真正的配置需要通过AUX系统接口的RTCSUBSECINC0/1RTCSUBSECINCCTL寄存器来完成。更新时,必须遵循“请求-等待应答”的流程,否则配置可能无法生效或导致计数错误。

2.2 三通道事件引擎:比较、捕获与自动重装

AON_RTC的三个通道是其灵活性的体现,它们共享同一个时间基准(70位计数器),但功能各有侧重。

通道0是最简单的比较模式。你设置一个目标时间点(写入CH0CMP寄存器),当RTC计数器的值达到或超过这个点时,就会产生一个事件。这个事件可以连接到AON事件总线,用于唤醒MCU。它适用于单次的、绝对的定时任务,比如“在开机后第300秒唤醒系统进行一次数据上传”。

通道1则具备双重模式。默认也是比较模式,但它多了一个捕获模式。当配置为捕获模式时(CHCTL.CH1_CAPT_EN=1),外部通过AON_EVENT:RTCSEL选择的事件(比如一个GPIO的边沿)可以触发捕获动作。捕获发生时,当前的RTC时间值(SEC的低16位和SUBSEC的高16位)会被锁存到CH1CAPT寄存器中,并产生一个捕获事件。这个功能极其有用,例如,你可以用它来精确记录一个外部传感器脉冲到来的绝对时间,用于计算时间间隔或打时间戳。

通道2在比较模式的基础上,增加了连续比较(自动重装)功能。当启用连续模式(CHCTL.CH2_CONT_EN=1)后,每次通道2的比较事件发生时,其比较值CH2CMP会自动加上CH2CMPINC寄存器中设定的增量值。这意味着,你只需要设置一次初始比较时间和步长,就能产生一个周期性的、完全等间隔的事件流。这是实现精准周期性唤醒(如每秒、每100毫秒唤醒一次)的理想选择,无需软件反复干预重装定时器,既降低了功耗也提高了定时精度。

2.3 事件延迟与组合:应对唤醒延迟的妙招

在实际的低功耗系统中,从事件产生到MCU被唤醒、内核开始执行第一条指令,存在一个不确定的、但有限的延迟。这个延迟可能来自电源域的上电、时钟稳定、以及内核的启动过程。如果事件直接用于触发某个对时间要求苛刻的动作(比如在精确时刻开启射频发射),这个延迟就会引入误差。

AON_RTC为此设计了一个精巧的事件延迟机制。每个通道产生的事件,都可以被一个公共的延迟计数器再延迟一段时间(通过CTL.EV_DELAY配置,可选1到144个SCLK_LF时钟周期)。延迟后的事件称为“延迟事件”。

更进一步,三个通道的延迟事件还可以通过CTL.COMB_EV_MASK进行逻辑“或”操作,生成一个组合事件。这个设计允许你将多个定时任务合并为一个唤醒源,或者创建一个更复杂的事件触发逻辑。例如,你可以让通道0在整秒触发,通道1在外部事件后500ms触发,然后将它们的延迟事件组合起来,共同唤醒MCU处理一批关联任务。

3. 关键寄存器详解与配置实战

理解了原理,我们进入实战环节。配置AON_RTC就像在组装一块精密的机械表,每一步都需要准确无误。下面我将以最常见的“周期性唤醒”应用为例,拆解每个关键寄存器的配置方法和注意事项。

3.1 基础配置:启动、复位与时间读取

首先,我们需要让RTC跑起来。这由CTL寄存器控制。

  • CTL.EN:这是总开关,置1启动RTC计数器。
  • CTL.RESET:这是一个“写1清零”的位。向它写1会立即将SECSUBSEC计数器复位到0。注意:复位操作是异步的,并且该位会在复位操作生效后自动清零。在启动RTC前进行一次复位,是一个好的编程习惯,可以确保从一个已知的起点开始计时。

如何正确读取当前时间?由于SECSUBSEC是两个独立的32位寄存器,而它们在不断累加,如果先读SUBSEC,再读SEC,中间可能发生进位,导致读出的时间不一致。芯片提供了原子读取机制:

  1. 首先读取SEC寄存器。这个操作会锁存当前SUBSEC的值到一个影子寄存器。
  2. 然后读取SUBSEC寄存器。此时读到的就是第一步锁存时的亚秒值,与第一步读到的秒值构成一个完整、一致的70位时间戳。
  3. 此外,TIME寄存器提供了一个快捷方式,它一次性返回SEC[15:0]SUBSEC[31:16]。如果你的应用只关心这个48位的时间格式(例如在比较/捕获寄存器中使用的格式),直接读TIME寄存器更方便,且能保证高、低位的一致性。

3.2 通道配置与事件管理

配置一个通道,例如通道2用于周期性唤醒,需要操作以下几个寄存器:

  1. CHCTL(通道控制寄存器):

    • CH2_EN: 置1,使能通道2。
    • CH2_CONT_EN: 置1,启用连续比较(自动重装)模式。这是实现周期性的关键。
    • 对于通道1,你还需要关注CH1_CAPT_EN,用于切换比较/捕获模式。
  2. CH2CMP(通道2比较值寄存器):

    • 写入第一次触发事件的绝对时间。时间格式为:高16位是秒数(取自SEC[15:0]),低16位是亚秒的高16位(取自SUBSEC[31:16])。
    • 示例:要设置从RTC启动后5.5秒触发第一次事件,计算如下:5秒对应SEC部分为5,0.5秒对应SUBSEC部分为0.5 * 2^32 ≈ 0x80000000,取其高16位是0x8000。所以CH2CMP应写入0x00058000
    • 重要警告:手册中提到,如果你写入的比较值落在“当前时间”到“当前时间-1秒”这个区间内,硬件会立即触发一个比较事件。这是为了防止你设置了一个已经过去的时间点而错过事件。但在编程时,这很可能成为一个坑。比如你刚复位RTC(时间为0),然后想设置10秒后触发,但如果你错误地写入了CH2CMP为0,由于0落在“当前时间0”到“-1秒”的区间?实际上,对于“过去”的判断逻辑需要仔细理解:它检查的是(比较值 - 当前值) > (2^32 - 1秒)。在初始化时,最安全的做法是先配置通道,再写入比较值,或者确保写入的比较值远大于当前时间。
  3. CH2CMPINC(通道2比较值增量寄存器):

    • 写入每次触发后,CH2CMP自动增加的值。格式与CH2CMP相同。
    • 示例:要实现每秒触发一次,增量就设置为1秒,即0x00010000(因为亚秒部分增量为0)。
  4. EVFLAGS(事件标志寄存器):

    • 当比较事件发生时,对应的CH2位会被硬件置1。
    • 软件需要写1清零该标志位,以确认事件已被处理,并等待下一次触发。
    • 关键操作:在中断服务程序或主循环中检测到事件后,必须执行EVFLAGS = (1 << 16);来清除通道2的事件标志。不清除的话,该标志会一直存在,你可能无法区分是新事件还是旧事件。

3.3 时钟补偿配置流程

校准RTC时钟是一个精细活,步骤如下:

  1. 测量时钟频率:通过高频时钟(如48MHz系统时钟)在一段时间内对32.768kHz时钟进行计数,精确计算出其实际频率F_actual
  2. 计算补偿值inc_value = (2^38) / F_actual。将计算结果取整,得到24位的VALUEINC值(对应SUBSECINC寄存器的[23:0]位)。
  3. 写入AUX接口:将计算出的24位值,低16位写入AUX_SYSIF:RTCSUBSECINC0,高8位写入AUX_SYSIF:RTCSUBSECINC1
  4. 发起更新请求:向AUX_SYSIF:RTCSUBSECINCCTL.UPD_REQ位写1。
  5. 等待确认:轮询读取AUX_SYSIF:RTCSUBSECINCCTL.UPD_ACK位,直到它变为1,表示AON_RTC已接收新值。
  6. 清除请求:将UPD_REQ位写回0。此后,新的递增值便开始生效。

实操心得:时钟补偿最好在产品生产测试环节进行,将计算出的校准值保存在非易失性存储器中,设备上电时读取并配置。对于精度要求不高的场景(如仅用于小时级别的唤醒),可以忽略此步骤,使用默认值。但对于需要日误差小于秒级的应用(如数据记录时间戳),校准是必须的。

3.4 跨域同步与低功耗管理

AON_RTC位于常开电源域,而我们的配置代码运行在MCU域。这两个域由不同的时钟驱动,存在同步延迟。SYNC寄存器就是用来管理这个同步的。

  • 写入同步:对AON_RTC寄存器的写操作,MCU总线会立即完成,但实际写入AON域会延迟1-2个2MHz MF时钟周期。这意味着连续写多个寄存器时,无需额外等待。
  • 读取同步与唤醒这是最容易出错的地方。当MCU从睡眠中唤醒后,AON域接口需要时间同步。如果立即读取SEC等寄存器,可能会读到睡眠前的旧值。
    • 正确做法:唤醒后,先向SYNC寄存器执行一次写操作(写入任何值均可,通常写0),这会触发一次到AON域的同步。
    • 然后,读取SYNC寄存器。这个读操作会被阻塞,直到所有未完成的同步操作(包括刚才的写)都完成。
    • 完成上述步骤后,才能安全地读取其他AON_RTC寄存器,获取当前准确的时间。

关闭通道时的同步:如果你想禁用某个通道(例如CH2_EN清零),也必须使用SYNC寄存器来确保操作完成,防止操作过程中产生意外事件。

  1. 设置CHCTL.CH2_EN = 0
  2. 读取SYNC寄存器(该读操作会等待上述写操作真正在AON域生效)。
  3. 此后,通道2才被确认禁用。

4. 典型应用场景与代码实现框架

理论结合实践,下面我们构建几个典型场景下的软件框架。请注意,以下代码基于TI的DriverLib或类似HAL库的抽象,旨在展示逻辑流程,具体寄存器操作需替换为你的底层驱动。

4.1 场景一:实现高精度周期性系统唤醒

这是最常见的低功耗应用。假设我们需要每250毫秒唤醒一次MCU进行传感器采样。

// 初始化AON_RTC周期性唤醒 (周期 = 250ms) void AON_RTC_Init_PeriodicWakeup(void) { // 1. 确保AON域电源和时钟已开启(通常由启动代码完成) // 2. 复位并启动RTC AONRTCCounterReset(); // 置位 CTL.RESET while(AONRTCSyncCheck() != 0); // 等待复位完成,通过SYNC寄存器 AONRTCEnable(); // 置位 CTL.EN // 3. 配置通道2为连续比较模式 AONRTCChannelDisable(AON_RTC_CH2); // 先关闭通道 AONRTCSync(); // 等待关闭生效 AONRTCContinuousCompareModeEnable(AON_RTC_CH2); // CHCTL.CH2_CONT_EN = 1 // 4. 设置比较增量 (250ms) // 250ms = 0.25s。0.25 * 2^16 = 16384 = 0x4000 (作为低16位亚秒增量) // 秒增量为0。所以CH2CMPINC = 0x00004000 AONRTCPeriodicCompareValueSet(AON_RTC_CH2, 0x00004000); // 5. 设置首次比较时间 (例如,从现在起250ms后) // 需要先读取当前TIME,然后加上偏移量。为简单起见,设为250ms后。 // 首次比较值 = 当前TIME + 0x00004000。注意处理进位。 uint32_t currentTime = AONRTCTimeGet(); // 读取TIME寄存器 uint32_t firstCompare = currentTime + 0x00004000; // 处理秒部分进位:如果亚秒部分相加溢出,秒部分需加1。 if ((currentTime & 0xFFFF) + 0x4000 > 0xFFFF) { firstCompare += 0x00010000; // 秒部分加1 } AONRTCCompareValueSet(AON_RTC_CH2, firstCompare); // 写入CH2CMP // 6. 使能通道2,并连接其事件到MCU唤醒源(通过AON事件映射,此处略) AONRTCChannelEnable(AON_RTC_CH2); AONRTCSync(); // 等待使能生效 // 7. 配置AON事件总线,将AON_RTC_CH2事件映射到MCU唤醒控制器(具体寄存器为AON_EVENT:MCUWUSEL等) // 8. 使能MCU域的中断或事件唤醒 // 9. 清除可能存在的旧事件标志 AONRTCEventClear(AON_RTC_CH2); } // 在唤醒后的中断服务程序或主循环中 void Wakeup_Handler(void) { if(AONRTCEventGet(AON_RTC_CH2)) { // 检查EVFLAGS.CH2 // 处理你的任务,例如采样传感器 Sensor_Sample(); // 必须清除事件标志! AONRTCEventClear(AON_RTC_CH2); } }

4.2 场景二:使用通道1进行外部事件时间戳捕获

假设我们需要精确记录一个按键按下的时刻。

volatile uint32_t g_captureTimeStamp = 0; // 全局变量存储捕获时间 void AON_RTC_Init_CaptureMode(void) { // 1. 启动RTC(同上,略) // 2. 配置通道1为捕获模式 AONRTCChannelDisable(AON_RTC_CH1); AONRTCSync(); AONRTCCaptureModeEnable(AON_RTC_CH1); // CHCTL.CH1_CAPT_EN = 1 // 3. 配置AON事件选择器,将某个GPIO事件(如上升沿)连接到RTC捕获源 // 假设配置AON_EVENT:RTCSEL,选择来自AON_GPIO的某个事件作为捕获触发源。 // 这通常涉及配置AON_GPIO、AON_EVENT等多个模块,此处以伪代码表示。 Configure_AON_GPIO_AsEventSource(); Configure_AON_EventRouter_For_RTC_Capture(); // 4. 使能通道1 AONRTCChannelEnable(AON_RTC_CH1); AONRTCSync(); // 5. 使能捕获事件产生的中断(如果需要) // 事件会出现在AON事件总线上,需要配置映射到MCU中断。 Enable_Capture_Event_Interrupt(); } // 捕获事件中断服务程序 void Capture_ISR(void) { if(AONRTCEventGet(AON_RTC_CH1)) { // 读取捕获到的时间戳 g_captureTimeStamp = AONRTCCaptureValueGet(AON_RTC_CH1); // 读取CH1CAPT寄存器 // 清除事件标志 AONRTCEventClear(AON_RTC_CH1); // 后续处理,例如将时间戳存入队列或设置标志 } }

4.3 场景三:组合事件实现复杂唤醒逻辑

假设我们需要在两种条件下唤醒MCU:一是每60秒的周期性唤醒,二是一个外部警报信号(通过GPIO)产生后的10秒延迟唤醒。我们可以用通道0做周期性,通道1做延迟比较,并用组合事件来唤醒。

void AON_RTC_Init_CombinedWakeup(void) { // 1. 启动RTC(略) // 2. 配置通道0:60秒周期性比较(非连续模式,需软件重装) AONRTCChannelDisable(AON_RTC_CH0); AONRTCSync(); // 计算60秒对应的比较值:60秒 = 0x003C0000 AONRTCCompareValueSet(AON_RTC_CH0, 0x003C0000); AONRTCChannelEnable(AON_RTC_CH0); AONRTCSync(); // 3. 配置通道1:用于延迟比较。初始比较值设为一个很大的值(如1天),使其不立即触发。 // 当外部警报事件发生时,在中断中重新配置CH1CMP为“当前时间+10秒”。 AONRTCChannelDisable(AON_RTC_CH1); AONRTCSync(); AONRTCCompareValueSet(AON_RTC_CH1, 0xFFFFFFFF); // 设为一个遥远的未来时间 AONRTCChannelEnable(AON_RTC_CH1); AONRTCSync(); // 4. 配置事件延迟(可选,这里假设需要一点延迟来补偿唤醒时间) AONRTCEventDelaySet(4); // 设置EV_DELAY,例如延迟几个时钟周期 // 5. 配置组合事件掩码,将通道0和通道1的延迟事件进行“或”组合 // COMB_EV_MASK: CH0 (1) + CH1 (2) = 3 AONRTCCombinedEventMaskSet(0x03); // 6. 将组合事件(AON_RTC_COMB)映射为MCU的唤醒源,而非单个通道事件。 Configure_AON_Event_For_MCU_Wakeup(AON_RTC_COMB_EVENT); // 7. 清除所有事件标志 AONRTCEventClear(AON_RTC_CH0); AONRTCEventClear(AON_RTC_CH1); } // 外部警报中断服务程序 void External_Alarm_ISR(void) { // 读取当前RTC时间 uint32_t currentTime = AONRTCTimeGet(); // 计算10秒后的时间 uint32_t wakeTime = currentTime + 0x000A0000; // 10秒 = 0x000A0000 // 处理进位 if ((currentTime & 0xFFFF) + 0x0000 > 0xFFFF) { // 简单示例,实际需计算 wakeTime += 0x00010000; } // 更新通道1的比较值,使其在10秒后触发 AONRTCCompareValueSet(AON_RTC_CH1, wakeTime); // 注意:这里可能需要考虑同步问题。简单应用可忽略,高可靠应用需调用AONRTCSync()。 }

5. 调试技巧与常见问题排查

即使理解了所有原理,实际调试AON_RTC时也难免遇到问题。下面是我在项目中积累的一些经验和常见坑点。

5.1 问题排查清单

现象可能原因排查步骤与解决方案
RTC根本不计数1. AON域电源或32kHz时钟未开启。
2.CTL.EN位未置1。
3. 芯片处于SHUTDOWN模式。
1. 检查电源和时钟配置代码,确保LF时钟源(RCOSC或XOSC)已启动且稳定。
2. 确认CTL.EN已设置为1。
3. SHUTDOWN模式下AON_RTC也会断电,确认芯片未进入此模式。
比较事件不触发1. 通道未使能 (CHCTL.CHx_EN=0)。
2. 比较值 (CHxCMP) 设置错误或为0。
3. 事件标志未清除,阻塞了新事件。
4. 事件未正确路由到唤醒控制器或中断。
1. 检查CHCTL寄存器对应通道使能位。
2. 打印/调试读取CHxCMPTIME寄存器,确认比较值大于当前值且格式正确。
3. 检查EVFLAGS寄存器,确认旧标志已清除(写1清零)。
4. 检查AON事件总线配置(AON_EVENT:MCUWUSEL,AUX_EVCTL等),确保RTC事件已映射到目标。
捕获功能失效1. 通道1未设置为捕获模式 (CH1_CAPT_EN=0)。
2. AON事件选择器 (AON_EVENT:RTCSEL) 配置错误。
3. 捕获源(如GPIO)事件未产生。
1. 确认CHCTL.CH1_CAPT_EN=1
2. 仔细检查AON_EVENT:RTCSEL寄存器,确保选择了正确的输入源。
3. 使用逻辑分析仪或调试器检查预期的GPIO或事件信号是否确实到达AON域。
周期性唤醒间隔不准1.CH2CMPINC增量值计算错误。
2. 32kHz时钟源精度太差,未进行ppm补偿。
3. 连续模式未启用 (CH2_CONT_EN=0)。
4. 软件处理事件时间过长,影响了下次触发。
1. 重新计算增量值,注意格式是(秒数<<16) | (亚秒高16位)
2. 测量并校准低频时钟频率,配置SUBSECINC
3. 确认CHCTL.CH2_CONT_EN=1
4. 优化唤醒后的处理代码,确保在下次事件前完成并再次进入低功耗模式。
唤醒后读到的RTC时间不对这是最典型的问题!MCU唤醒后未等待AON域同步。严格按照以下步骤操作:
1. 唤醒后,先向AON_RTC:SYNC寄存器写任意值。
2. 然后读取AON_RTC:SYNC寄存器,该操作会阻塞直到同步完成。
3. 之后再读取SECSUBSECTIME寄存器。
修改配置后立即读回,发现未生效跨时钟域同步延迟。写操作后立即读,可能读到旧值。对于关键配置(如禁用通道),在写操作后,通过读写SYNC寄存器来保证同步完成。例如:CHCTL.CHx_EN = 0;->temp = SYNC;

5.2 调试实操心得

  1. 善用TIME寄存器:在调试初期,频繁读取70位完整时间戳(先SECSUBSEC)比较麻烦。可以多使用TIME寄存器进行快速查看和比较值设置,因为它直接提供了与比较寄存器相同的48位格式。
  2. 初始化顺序很重要:推荐的初始化顺序是:配置通道参数(比较值、模式)-> 禁用通道 -> 等待同步(SYNC) -> 使能通道 -> 等待同步。这可以避免在配置过程中产生意外事件。
  3. 事件标志是“快照”EVFLAGS寄存器中的标志位,在MCU接口侧有“快速清除”特性。你写1清除后,MCU侧立即看到它为0,但AON域实际清除会晚1-2个时钟周期。这意味着如果你清除标志后极短时间内又有事件发生,可能会被“淹没”。在高速轮询的场景下需要注意,但在低功耗唤醒场景中,这个问题不常见。
  4. 计算比较值时的进位处理:当计算“当前时间 + 偏移量”作为比较值时,必须分别处理秒和亚秒部分的进位。一个健壮的计算函数是必不可少的。例如,计算current_time + offset
    uint32_t current_time = AONRTCTimeGet(); uint32_t current_sec_l = (current_time >> 16) & 0xFFFF; uint32_t current_sub_h = current_time & 0xFFFF; uint32_t offset_sec_l = (offset >> 16) & 0xFFFF; uint32_t offset_sub_h = offset & 0xFFFF; uint32_t new_sub_h = current_sub_h + offset_sub_h; uint32_t new_sec_l = current_sec_l + offset_sec_l; if (new_sub_h > 0xFFFF) { new_sub_h &= 0xFFFF; new_sec_l += 1; // 亚秒向秒进位 } if (new_sec_l > 0xFFFF) { new_sec_l &= 0xFFFF; // 处理秒部分回绕(约18小时) } uint32_t compare_value = (new_sec_l << 16) | new_sub_h;
  5. 功耗考量:AON_RTC本身功耗极低,但它的输出事件会唤醒其他模块。确保未使用的通道被禁用 (CHx_EN=0)。如果完全不需要RTC,可以考虑将其关闭(CTL.EN=0),但在大多数低功耗应用中,RTC常开用于定时唤醒是其核心价值所在。

通过以上这些步骤和注意事项,你应该能够驯服CC13x2/CC26x2的AON_RTC,让它成为你低功耗应用设计中精准而可靠的“心跳”。记住,理解同步机制和严谨的配置顺序是成功的关键。在实际项目中,建议将RTC操作封装成独立的、健壮的驱动层,并提供清晰的时间计算、事件设置API,这样就能在应用层专注于业务逻辑,而不用担心底层的时序错乱问题。

http://www.jsqmd.com/news/1287039/

相关文章:

  • 湖北武汉高三复读学校推荐 襄武学校报名条件及联系方式 - 湖北成人升学提升
  • Excel 清洗透视全自动?LobsterAI 流水线搭建踩过这 4 类坑
  • 某日系酵母精华水小样源头工厂:发酵工艺与私域利润的硬核拆解
  • 2026年电动车托运怎么便宜?省钱攻略+避坑指南 - 快递物流资讯
  • 源头工厂好物✨美琪锌合金厨具开瓶器质感绝了 - 资讯纵览
  • 字符串匹配算法:KMP、Boyer-Moore与AC自动机详解
  • C++命名空间与局部变量优先级解析:名字查找机制与二义性解决方案
  • 提示词迭代效率低?你缺的不是灵感,是动态权重校准器:基于RLHF反馈的实时衰减补偿算法实操指南
  • 5步解锁文件分享新维度:秒传链接技术深度解析
  • 3分钟掌握:终极STL文件缩略图生成方案,让3D模型管理更简单
  • BLE 5.0发起者模式深度解析:扩展广播与辅助通道连接状态机实战
  • 2026常熟全案设计品牌怎么选,本地工厂完整盘点 - 十大品牌排行榜
  • Arduino进阶:从顺序执行到事件驱动与状态机的智能系统设计
  • 几何公差GDT:跳动公差
  • 基于斐波那契数列与Minim库的算法作曲实践
  • 2026高性价比耐震压力表怎么选:资质齐全厂家推荐 - 优企甄选
  • 三相离网逆变器不对称负载控制与MATLAB仿真实践
  • 免费图表工具终极指南:draw.io桌面版,你的跨平台绘图软件新选择
  • 家用嵌入式冰箱实用推荐:微冻专区、熟食密封舱、全自动快速制冰 - 天下观知
  • AI提示词的“最后一公里”危机:93.6%的业务场景失败源于模板未适配推理链路——附可审计的RAG+CoT双模模板包
  • CAN总线核心技术解析:从多主通信、非破坏性仲裁到工程实践
  • RWA(现实世界资产代币化)为何成为币安关注的新方向?
  • 美国专线物流有哪些?怎么选靠谱渠道?空派海派全场景解析
  • 树莓派Pico 2 W无线微控制器深度评测:RP2350芯片、Wi-Fi/BLE与MicroPython实战
  • 放弃继承遗产的声明书必须公证吗?内行人告诉你大实话 - 信息快递
  • 终极文字转手写工具:3分钟让电子文档拥有真实笔迹的完整指南
  • 不知选哪家永年螺母热镀锌公司?这些要点帮你做判断! - 信息热点
  • PLC与组态王在水泥生产线高精度称重系统中的应用
  • 口红包材定制水有多深?工厂老炮拆解锌合金顶盖与磁吸底牌的降维打击
  • 2026年最新图书管理员证书报考条件:学历、年龄及从业要求汇总 - 中科资质认证报考中心