
1. 从寄存器手册到实战AUX传感器控制器的核心玩法如果你正在折腾TI的CC26xx或CC13xx系列这类低功耗无线MCU那你肯定绕不开一个核心模块AUX传感器控制器。这玩意儿是TI为了极致低功耗场景设计的一个协处理器专门用来处理传感器数据、管理定时和进行一些简单的逻辑控制而主MCU可以放心地去睡大觉。手册里那一页页的寄存器描述乍一看全是位域和缩写让人头大。但说白了寄存器就是你和这个硬件“对话”的语言。你不会直接对芯片说“去测个频率”而是通过配置TRIGCNTLOAD.CNT这个寄存器字段来告诉它“忽略前面N个事件从第N1个开始认真数。”今天我就结合自己踩过的坑和项目经验把AUX里最核心的TDC时间数字转换、定时器和电源管理这几组寄存器掰开揉碎了讲清楚让你不仅能看懂手册更能用起来。2. 核心思路为什么是AUX和寄存器直接操作在深入寄存器之前得先明白我们为什么需要它。在物联网传感器节点里核心矛盾是“随时待命”和“电池续航”之间的冲突。主CPUCortex-M性能强但功耗也高让它一直轮询一个传感器引脚的变化简直是电力自杀。AUX传感器控制器就是为了解决这个矛盾而生的独立子系统。它有自己的时钟域、内存AUX RAM和一套精简的指令集由Sensor Controller Engine执行最关键的是它集成了一系列数字和模拟外设TDC、定时器、ADC接口、模拟比较器、I/O等并且能够被配置为完全由硬件事件如引脚电平变化、比较器输出、定时器超时触发和运行无需CPU干预。而配置这一切的“开关”和“旋钮”就是内存映射的寄存器。直接操作寄存器意味着你能进行最精细、最及时的控制尤其是在对时序抖动和功耗切换延迟有苛刻要求的场景下。当然TI也提供了Sensor Controller Studio这样的高级抽象工具但理解底层寄存器是解决复杂问题和性能调优的基石。2.1 寄存器访问的基本认知AUX的寄存器位于特定的内存地址CPU或AUX SCE通过加载/存储指令来读写。每个寄存器通常有多个字段Field每个字段控制一个具体功能。手册中的“R”表示只读“R/W”表示可读写“Reset”是上电复位后的默认值。一个至关重要的原则是对于标记为“RESERVED”的位域必须严格按照手册处理通常只能写入复位值通常是0读取值则不可依赖否则可能导致未定义行为。这是硬件编程的铁律。另一个关键概念是“事件总线”。AUX内部有一个异步事件总线和一个同步事件总线各种外设如IO、ADC、比较器、定时器的状态变化可以作为“事件”发布到这些总线上。而TDC的启动/停止源、定时器的计数源等都需要从这些事件总线中选择。理解AUX_EVCTL:EVSTAT0/1这些事件状态寄存器以及如何配置事件路由是灵活运用AUX的基础。3. 高精度时间测量核心TDC相关寄存器详解TDC是AUX里的一把“精密尺子”用来测量两个事件之间的时间间隔分辨率可以远高于系统时钟周期。它不直接测时间而是通过一个高速振荡器通常为4.8MHz或更高在“开始事件”和“停止事件”之间计数从而实现皮秒级的时间差测量。常用于测量传感器脉冲宽度、频率、电容感应的充电时间等。3.1 TRIGCNTLOAD设定你的“忽略”策略TRIGCNTLOAD寄存器偏移地址0x18的核心是它的低16位CNT字段。这个字段的功能非常巧妙它定义了在开始正式测量前要“忽略”多少个“停止事件”。工作模式解析测量事件频率这是最常用的模式之一。假设你要测量一个方波的频率你可以将TDC的启动事件和停止事件都配置为这个方波的边沿比如上升沿。如果你设置CNT 9那么TDC会忽略前9个上升沿从第10个上升沿开始作为“开始”第11个上升沿作为“停止”。这样它测量到的就是10个完整周期的时间。计算公式为实际测量时间间隔 (CNT 1) * 信号周期。因此要测量单周期CNT设为0或1即可两者都测量一个周期。这样做的优势是可以通过增加CNT来测量多个周期的平均时间提高频率测量的精度和抗干扰能力。测量脉冲宽度比如要测一个高电平脉冲的宽度。你需要将启动事件设为上升沿停止事件设为下降沿但两者的事件源必须相同例如都是AUXIO0。此时CNT必须设置为0。TDC会在第一个上升沿启动紧接着的第一个下降沿停止直接测出脉冲宽度。测量从事件A到事件B的第N次发生假设你想知道从按键按下事件A到传感器第5次触发事件B之间的时间。你需要将启动事件源设为按键事件停止事件源设为传感器事件。此时设置CNT 4N-1。TDC会在按键事件发生时启动然后忽略接下来的4次传感器事件在第5次传感器事件发生时停止计数。实操心得CNT的值是在测量开始时一次性加载到内部的TRIGCNT.CNT计数器中的。这意味着如果你想在连续测量中动态改变忽略次数必须在每次启动测量前重新配置TRIGCNTLOAD寄存器并确保TDC状态机处于IDLE状态。3.2 TRIGCNTCFGTDC测量的总开关TRIGCNTCFG寄存器偏移0x1C非常简单只有一个有效的位EN位0。把它设为1就使能了前面提到的“停止事件计数器”功能。这个寄存器是TDC测量逻辑的一部分必须和TRIGCNTLOAD配合使用。关键限制手册明确写道EN位的修改只能在AUX_TDC:STAT.STATE为IDLE时进行。在测量进行中STATE为BUSY修改此寄存器可能导致不可预测的行为。因此安全的编程模式是先停止TDC如果需要等待其进入IDLE状态配置TRIGCNTLOAD和TRIGCNTCFG最后再配置启动/停止事件源并触发测量。3.3 PRECTL与PRECNT应对高速信号的预分频器当你要测量的信号频率非常高接近甚至超过AUX时钟频率例如24MHz时直接测量会导致误差甚至失败。这时就需要预分频器Prescaler出场。PRECTL寄存器偏移0x20控制其工作模式。SRC位4-0选择预分频器的输入事件源。这是一个长长的列表从AON_RTC_CH2到ADC_IRQ意味着你可以对几乎任何内部或外部事件进行分频。RATIO位6分频比选择。0代表16分频1代表64分频。注意描述AUX_TDC_PRE事件即分频器输出在输入信号的每16个或64个上升沿产生一个上升沿实际上其波形是在每8个或32个上升沿翻转一次。这意味着它是一个占空比50%的方波频率为输入频率的1/16或1/64。RESET_N位7预分频器复位。写0复位写1释放。重要在改变SRC源选择时必须确保RESET_N 0处于复位状态。配置好SRC后再设置RESET_N 1来启动分频器。PRECNT寄存器偏移0x24是一个16位的计数器可以用来直接读取预分频器对输入事件计数的值。但读取它有讲究向PRECNT.CNT写入任意值会触发一次对内部预分频器计数器的“捕获”Snapshot捕获到的值会更新到CNT字段供读取。读取时机陷阱手册警告如果在释放PRECTL.RESET_N即启动分频器的瞬间输入事件源恰好是上升沿会导致捕获值有±1的误差1 LSB uncertainty。同样如果异步地门控开关事件源也会引入此误差。安全读取法为了获得准确值应在事件源电平稳定恒高或恒低时进行捕获。例如如果要测量AUXIO引脚的事件可以先禁用该引脚的输入缓冲器将其钳位到低电平然后进行捕获操作。使用流程若想用分频后的信号作为TDC的测量源需将TRIGSRC.START_SRC和TRIGSRC.STOP_SRC都设置为AUX_TDC_PRE。手册建议当待测信号频率超过AUX时钟频率的1/10时就应考虑使用预分频器。4. 灵活的时间与事件管理AUX_TIMER寄存器组AUX提供了两个通用定时器/计数器Timer 0和Timer 1。它们的寄存器结构完全对称理解了其中一个另一个也就通了。定时器不仅可以基于AUX时钟计数还能以任何同步事件总线上的事件作为“滴答”Tick来计数功能非常灵活。4.1 定时器配置寄存器T0CFG/T1CFG这是定时器的大脑决定了它如何工作。TICK_SRC位12-8选择定时器的计数源。可以从同步事件总线上的大量事件中选择例如另一个定时器的事件(TIMER0_EV/TIMER1_EV)、TDC完成事件(TDC_DONE)、ADC完成事件、甚至是RTC的亚秒计数器位。这实现了硬件级的定时器级联或事件驱动计数。TICK_SRC_POL位13计数边沿选择。0为在TICK_SRC的上升沿计数1为在下降沿计数。PRE位7-4预分频器系数。公式是分频比 2^PRE。PRE0不分频1PRE4代表16分频PRE15代表32768分频。这个分频器作用于MODE选择的时钟源上。MODE位1时钟源模式选择。这是关键0使用AUX时钟ACLK_REF或SCLK_LF取决于电源模式作为预分频器的源。这是最常用的“定时”模式配合PRE可以产生各种时间基准。1使用TICK_SRC选择的事件作为预分频器的源。这是“事件计数”模式。例如你可以选择AUXIO0引脚事件作为TICK_SRC并设置PRE0那么这个定时器就直接变成了一个AUXIO0引脚事件的上/下降沿计数器。RELOAD位0重载模式。0手动模式当定时器计数值(T0CNTR.VALUE)达到目标值(T0TARGET.VALUE)时定时器使能位T0CTL.EN会自动清零定时器停止。需要软件重新使能才能再次启动。1连续模式计数值达到目标值后T0CTL.EN保持为1计数值清零并重新开始计数。这是产生周期定时中断或事件的常用模式。4.2 定时器控制与目标寄存器T0CTL/T1CTL T0TARGET/T1TARGETT0CTL偏移0x8和T1CTL偏移0x14极其简单只有最低位EN有效。写1启动定时器写0停止。特别注意每次使能定时器EN从0变1其内部计数器T0CNTR.VALUE都会从0重新开始计数。这意味着如果你在定时器运行中修改了T0TARGET新的目标值会在当前计数周期结束后生效在连续模式下或者在下一次启动时生效在手动模式下。T0TARGET偏移0xC和T1TARGET偏移0x10定义了定时器计数的目标值。当T0CNTR.VALUE T0TARGET.VALUE时计数器递增。当两者相等时定时器会生成一个持续一个AUX时钟周期的高电平事件TIMER0_EV或TIMER1_EV。这个事件可以触发中断也可以作为其他外设如另一个定时器、ADC、甚至TDC的启动源构建复杂的硬件自动化链路。一个有用的特例手册提到如果配置MODE0AUX时钟源PRE0无分频RELOAD1连续模式且VALUE1那么只要定时器使能TIMERx_EV事件就会持续产生频率等于AUX时钟频率。这可以作为一个高频时钟源来使用。5. 功耗控制的咽喉要道AUX_WUC电源管理寄存器AUX_WUCWake-Up Controller是AUX域电源和时钟的总调度中心。在低功耗设计中这里的每一个寄存器都关乎微安级的电流差异。5.1 模块时钟门控MODCLKEN0/MODCLKEN1MODCLKEN0偏移0x0和MODCLKEN1偏移0x5C是模块时钟使能寄存器。它们控制着AUX域内各个子模块TDC, TIMER, ANAIF, SMPH等的时钟供给。这是降低动态功耗最直接有效的手段。不需要某个模块工作时立即关闭它的时钟。工作方式这两个寄存器的位是“或”关系。也就是说只要系统CPU通过MODCLKEN0或AUX_SCE通过MODCLKEN1中的任何一个请求了某个模块的时钟该模块的时钟就会被使能。这为CPU和传感器控制器协同管理功耗提供了灵活性。重要提示对于某些复杂模块仅使能这里的时钟可能不够。例如TDC位使能了TDC接口逻辑的时钟但要进行实际测量还需要通过TDCCLKCTL寄存器来请求TDC计数器和参考时钟。同样ANAIF位使能了模拟接口的时钟但ADC的内部时钟需要ADCCLKCTL单独控制。务必阅读每个模块的完整初始化序列。5.2 电源模式请求与确认PWROFFREQ, PWRDWNREQ, PWRDWNACK这三个寄存器管理着AUX域乃至整个芯片的电源状态深度。PWROFFREQ偏移0x4-彻底断电请求将REQ位写1请求关闭AUX域的电源。这通常只在设备进入完全关机模式Shutdown时使用因为再次上电需要完整的复位。安全条件这个请求只有同时满足AONCTLSTAT.AUX_FORCE_ON0AON域没有强制AUX开启且MCUBUSSTAT.DISCONNECTED1MCU总线已断开时才会生效。一旦设置该位在AUX重新上电前不应被清除。PWRDWNREQ偏移0x8与PWRDWNACK偏移0xC-深度睡眠协调这对寄存器用于AUX域和系统AON域之间的电源状态握手。AUX请求睡眠当AUX_SCE完成工作决定进入低功耗状态时它设置PWRDWNREQ.REQ 1向系统请求进入“掉电模式”Power Down。在此模式下系统供电受限时钟源切换为AON_WUC:AUXCLK.PWR_DWN_SRC指定的低频时钟如32kHz晶振。系统确认系统电源管理单元收到请求后如果条件允许会进入掉电模式并设置PWRDWNACK.ACK 1作为回应。AUX_SCE在设置REQ1后需要轮询或等待ACK1才能确认系统已进入低功耗状态并执行自己的低功耗操作。唤醒与恢复当需要唤醒时AUX_SCE设置REQ0。但注意在收到ACK变回0之前AUX仍应假设系统处于掉电模式。这个过程确保了电源状态切换的同步防止数据丢失或硬件冲突。5.3 时钟源切换CLKLFREQ与CLKLFACKCLKLFREQ偏移0x10和CLKLFACK偏移0x14是另一对握手寄存器专门用于请求切换AUX的主时钟源。目的在活跃模式下AUX通常使用高速时钟如24MHz DCO以获得最佳性能。在低功耗待机时可以切换到低频时钟SCLK_LF 32.768 kHz以节省功耗。CLKLFREQ.REQ就是用来发起这个切换请求的。安全操作手册强调在修改REQ位之前必须确保CLKLFACK.ACK的值与当前REQ值一致。这是一个典型的“请求-确认”机制。流程应为读取CLKLFACK.ACK假设其为0当前使用系统控制的时钟。如果你想切换到低频时钟写入CLKLFREQ.REQ 1。轮询CLKLFACK.ACK直到它变为1确认低频时钟已就绪。反之亦然从低频切回高速时钟时先确保ACK1再写REQ0然后等待ACK0。与电源模式的关系当系统进入掉电模式PWRDWNACK.ACK1时时钟源很可能已经被强制切换为低频时钟。此时CLKLFACK.ACK可能已经为1。AUX_SCE需要根据整体电源状态来管理时钟请求。5.4 唤醒事件管理WUEVFLAGS与WUEVCLR这是AUX被唤醒的“门铃”和“复位键”。WUEVFLAGS偏移0x28是一个状态寄存器指示哪些来自AON域的事件唤醒了AUX。常见的有AON_PROG_WU可编程唤醒事件。具体源由AON_EVENT:AUXWUSEL寄存器配置可以是RTC闹钟、IO引脚输入等。AON_SW软件唤醒事件。由系统CPU写AON_WUC:AUXCTL.SWEV触发。AON_RTC_CH2RTC通道2比较事件。注意这个标志位只要RTC CH2事件发生就会被置位但只有该事件在AUXWUSEL中被配置为唤醒源时它才能真正唤醒AUX。WUEVCLR偏移0x2C用于清除上述唤醒标志。清除方法不是直接写0而是向对应的位写1。关键细节该位必须保持为1直到对应的WUEVFLAGS中的标志位读回0。这确保了边沿事件的完整清除。对于AON_PROG_WU如果唤醒源是IO引脚清除操作还需要该IO引脚已分配给AUX域通过IOC配置并且其在AIODIO0/1中的输入使能已打开。否则清除可能无效。6. 实战配置流程与避坑指南理解了单个寄存器后将它们串联起来完成一个实际任务才是关键。下面以“使用TDC测量外部引脚脉冲频率并在测量完成后由定时器产生中断最后让系统进入低功耗”为例梳理配置流程和注意事项。6.1 TDC频率测量完整流程前期准备与时钟使能通过AUX_WUC:MODCLKEN0或MODCLKEN1使能TDC和ANAIF如果用到模拟比较器模块的时钟。通过AUX_WUC:TDCCLKCTL请求并确认TDC计数器和参考时钟就绪。配置AUX_EVCTL相关寄存器将目标IO引脚如AUXIO0的事件路由到异步事件总线。配置TDC参数等待AUX_TDC:STAT.STATE为IDLE。设置TRIGCNTCFG.EN 0先禁用。根据要测量的周期数N设置TRIGCNTLOAD.CNT N-1。例如测量10个周期则设CNT9。设置TRIGSRC.START_SRC和TRIGSRC.STOP_SRC为同一个IO事件如AUXIO0的上升沿。设置TRIGCNTCFG.EN 1使能停止计数器。启动测量与读取结果通过向AUX_TDC:CTL寄存器写入启动命令来触发单次测量。轮询STAT.STATE或等待TDC_DONE事件。测量完成后从AUX_TDC:RESULT寄存器中读取计数值。该值代表了“开始”到“停止”之间高速参考时钟的周期数。结合参考时钟频率如4.8MHz即可计算出时间间隔时间 计数值 / 参考时钟频率。频率f (CNT 1) / 时间。6.2 定时器中断与低功耗进入流程配置定时器在TDC完成后触发使能TIMER模块时钟MODCLKEN0.TIMER1。配置T0CFGTICK_SRC选择TDC_DONE事件MODE1事件源模式PRE0不分频RELOAD0单次模式T0TARGET.VALUE0收到一个事件即触发。使能T0CTL.EN1。现在TDC测量完成事件将触发Timer 0超时。配置定时器超时事件唤醒系统将TIMER0_EV事件配置为AUX的唤醒源之一通过AON_EVENT:AUXWUSEL寄存器。在AUX_SCE的程序中完成所有工作包括启动TDC测量后执行以下步骤进入低功耗 a. 检查并清除旧的唤醒标志WUEVCLR。 b. 设置PWRDWNREQ.REQ 1请求系统进入掉电模式。 c. 等待PWRDWNACK.ACK 1。 d. 可选如果需要更低功耗请求切换至低频时钟CLKLFREQ.REQ 1 等待CLKLFACK.ACK1。 e. 关闭不需要的模块时钟MODCLKEN0/1。 f. 执行AUX_SCE的睡眠指令如halt。唤醒与后续处理TDC测量完成 - Timer 0超时产生TIMER0_EV- 该事件通过AUXWUSEL配置唤醒AUX。AUX_SCE从睡眠中恢复首先会检查WUEVFLAGS寄存器确定唤醒源。如果是AON_PROG_WU且源为TIMER0_EV则用WUEVCLR清除该标志。设置PWRDWNREQ.REQ 0请求系统退出掉电模式。等待PWRDWNACK.ACK 0。如果之前切换了时钟切换回高速时钟CLKLFREQ.REQ 0 等待CLKLFACK.ACK0。重新使能必要的模块时钟。读取TDC测量结果进行后续处理。6.3 常见问题与调试技巧TDC测量结果不准或溢出检查参考时钟确认TDCCLKCTL已正确配置且ACK位已响应。参考时钟不稳定会导致测量误差。检查事件极性确保TRIGSRC中为START和STOP选择的事件边沿符合预期。测量脉宽时启动和停止必须是相反极性。信号频率过高如果待测信号频率高于AUX时钟的1/10务必使用预分频器PRECTL。直接测量高频信号会导致计数器溢出或严重误差。注意复位状态在修改TDC配置特别是TRIGCNTCFG前务必确认STAT.STATE为IDLE。定时器不工作或计数不准时钟源模式混淆最易出错的是T0CFG.MODE位。如果用AUX时钟定时选MODE0如果用外部事件计数选MODE1且TICK_SRC选对事件。事件未产生确认定时器的超时事件TIMER0_EV是否已产生。可以将其路由到一个AUXIO引脚用示波器观察。重载模式影响在手动模式RELOAD0下定时器超时一次后会自动禁用EN位清0。如果你期望连续定时需要设置为连续模式或者在中断服务程序中重新手动使能。无法进入低功耗或唤醒异常握手未完成进入低功耗前必须完成PWRDWNREQ/PWRDWNACK和CLKLFREQ/CLKLFACK的完整握手流程并等待ACK信号到位。跳过等待直接睡眠是常见错误。唤醒源未正确配置检查AON_EVENT:AUXWUSEL寄存器确保你期望的唤醒事件如TIMER0_EV已正确映射到WU0_EV等字段。同时确认该事件在AUX内部已使能并路由到事件总线。唤醒标志未清除如果上一次唤醒的标志位没有清除新的唤醒事件可能无法再次置位标志。确保在每次唤醒处理中都正确操作WUEVCLR寄存器并等待WUEVFLAGS对应位清零。IO配置问题如果使用IO引脚作为唤醒源除了配置AUXWUSEL还必须确保在IOC中该引脚功能已映射到AUX并且在AIODIO中使能了输入功能。否则引脚事件无法进入AUX域。调试建议充分利用AUXIO将关键内部事件如TDC_DONE,TIMER0_EV,AUX_ACTIVE路由到AUXIO引脚用逻辑分析仪或示波器捕捉可以直观地看到硬件时序是调试复杂交互的最有效手段。分步验证不要试图一次性配置所有功能。先单独测试TDC测量一个已知频率的信号再单独测试定时器最后再整合低功耗流程。查阅勘误表TI的芯片勘误表Errata非常重要里面可能记录了某些寄存器在特定条件下的异常行为及解决方案。在遇到无法解释的问题时务必查阅。