1. 项目概述与核心价值
在物联网和可穿戴设备这类对功耗极其敏感的嵌入式应用里,如何让一颗小小的MCU在“沉睡”与“清醒”之间精准切换,同时还能完成高精度的传感器数据采集和事件计时,是每个嵌入式开发者都要面对的硬核挑战。这背后,一个强大而灵活的协处理器——传感器控制器(Sensor Controller),往往扮演着关键角色。德州仪器(TI)在其CC13xx/CC26xx系列无线MCU中集成的AUX传感器控制器,正是这样一个专为超低功耗传感任务设计的“幕后功臣”。
这个项目的核心,就是深入AUX传感器控制器的“心脏”——它的寄存器组。很多人看技术手册,看到满屏的寄存器位域描述就头疼,觉得是枯燥的硬件细节。但我的经验是,恰恰是这些寄存器,构成了你与硬件直接对话的“语言”。不理解它们,你就无法真正驾驭这颗低功耗猛兽。AUX控制器独立于主CPU运行,拥有自己的内存、时钟和丰富的外设(如TDC、定时器、ADC接口等)。通过精心配置其寄存器,我们能让它在主系统深度睡眠时,自主完成传感器采样、信号处理、事件判断甚至简单的数据滤波,只在必要时才唤醒主CPU,从而将系统的平均功耗降至微安级别。
本文将聚焦于AUX控制器中最核心、也最体现其设计思想的几组寄存器:用于高精度时间间隔测量的TDC相关寄存器、负责产生周期性事件或计时的定时器寄存器,以及掌管整个AUX域“生杀大权”的电源与时钟管理寄存器。我会结合我过去在环境监测传感器节点和可穿戴设备上的实际调试经验,不仅告诉你每个寄存器位是干什么的,更会深入剖析它们为何这样设计,配置时有哪些“坑”,以及如何组合使用它们来构建一个稳定、精准且超低功耗的传感任务链。无论你是刚开始接触TI这款MCU,还是已经用过但对其AUX模块一知半解,相信这篇深入解析都能帮你打通任督二脉。
2. AUX传感器控制器架构与寄存器访问原理
在直接切入具体寄存器之前,我们必须先建立起对AUX传感器控制器整体架构和访问机制的基本认知。这就像你要操作一台精密仪器,总得先知道它的控制面板在哪里、各个开关是干什么的。
2.1 AUX域:一个独立的低功耗岛屿
TI的CC13xx/CC26xx系列MCU采用了一种多域电源架构。你可以把主CPU(Cortex-M)所在的核心域想象成繁华的“主城区”,而AUX域则是一个功能完备、自给自足的“节能岛屿”。这个岛屿有自己的电源轨(可在系统其他部分关闭时单独供电)、自己的时钟源(可以来自低频时钟SCLK_LF以进一步省电),以及一套专用的外设和内存。AUX传感器控制器就是这个岛屿的“智能管家”。
它的独立性带来了巨大优势:主CPU可以完全进入待机或关闭状态,而AUX域依然可以持续监控传感器。两者通过一个事件总线(Event Bus)和共享内存进行通信。AUX完成任务后,可以通过触发事件(如唤醒事件)来通知主CPU。这种架构是实现nA级别待机电流的关键。
2.2 寄存器映射:与硬件对话的地址窗口
AUX的所有控制寄存器都被映射到MCU统一的存储器地址空间中。这意味着,主CPU或AUX传感器控制器引擎(SCE)本身,都可以通过标准的加载/存储指令来读写这些寄存器,从而配置外设、启动任务或读取状态。
技术手册中给出的寄存器偏移地址(如TRIGCNTLOAD的偏移0x18),是相对于AUX模块基地址的。在实际编程中,我们通常会使用TI提供的驱动程序库(DriverLib)中定义好的宏或结构体来访问,这样更安全便捷。例如,你可能会看到AUX_TDC_BASE这样的基地址定义,那么TRIGCNTLOAD寄存器的完整地址就是AUX_TDC_BASE + 0x18。
一个重要原则:在读写寄存器时,尤其是配置位,必须严格遵守手册中规定的“配置时机”。很多寄存器要求只能在模块处于空闲状态(如STAT.STATE = IDLE)时进行配置,否则写入可能无效或导致不可预知的行为。这是新手最容易忽略而导致调试困难的地方。
2.3 事件总线:模块间协同的神经系统
AUX内部各个模块(TDC、定时器、ADC、比较器、IO等)并非孤立的,它们通过一个强大的异步事件总线紧密连接。这个总线允许一个模块产生的信号(事件)作为另一个模块的触发源。例如,一个GPIO引脚上的上升沿可以触发TDC开始一次测量,而TDC测量完成的事件又可以触发定时器开始计时,定时器超时事件又可以触发ADC进行一次采样。
寄存器配置中大量涉及事件源的选择(如PRECTL.SRC,T0CFG.TICK_SRC),其本质就是在配置这个事件路由网络。理解并巧妙运用事件总线,是构建高效、低功耗传感流水线的核心技能。它避免了频繁的CPU中断和轮询,让硬件自动完成一系列连锁反应。
3. TDC寄存器深度解析与高精度时间测量实战
时间数字转换器(TDC)是AUX控制器中一颗璀璨的明珠,它能以极高的分辨率测量两个事件之间的时间间隔,常用于超声波测距、电容式传感、脉冲宽度测量等场景。其核心控制逻辑就体现在几个关键的寄存器上。
3.1 TRIGCNTCFG与TRIGCNTLOAD:测量逻辑的核心控制器
TRIGCNTCFG(偏移0x1C)这个寄存器非常简单,目前只用了最低位EN。但它的作用至关重要:它是整个停止计数器的总开关。必须牢记:只有当AUX_TDC:STAT.STATE为IDLE时,才能修改EN位。在测量进行中更改它,会导致未定义行为。
真正的灵活性在于TRIGCNTLOAD(偏移0x18)寄存器。它的16位CNT字段,定义了在启用停止计数器后,要忽略多少个“停止事件”。这个“忽略”机制,正是实现多种测量模式的关键。
3.1.1 频率测量模式要测量一个周期性信号(比如来自传感器的脉冲)的频率,你需要测量多个周期的时间来求平均以提高精度。这时,你需要:
- 设置事件源:将TDC的启动(START)事件和停止(STOP)事件设置为同一个信号源(例如同一个GPIO引脚)。
- 设置极性:通常将启动和停止事件设置为相同的边沿(如都是上升沿)。
- 配置CNT:如果你想测量N个周期的时间,就将
CNT设置为N-1。例如,设置CNT = 9,那么TDC会记录从第1个上升沿(启动)到第10个上升沿(停止)之间的时间,也就是9个完整周期的时间。特别注意:手册说明,设置CNT为0或1,测量的都是一个周期的时间。这是为了逻辑一致性,当CNT=0时,表示不忽略任何停止事件,第一个停止事件即有效,测量的是从一个启动边沿到紧接着的下一个同向边沿的时间。
3.1.2 脉冲宽度测量模式要测量一个脉冲的高电平或低电平宽度,你需要:
- 设置事件源:启动和停止事件仍为同一信号源。
- 设置极性:关键在这里!将启动和停止事件设置为相反的边沿。例如,测量高电平宽度,则启动事件设为上升沿,停止事件设为下降沿。
- 配置CNT:此时,
CNT必须设置为0。因为你要测量的是从第一个边沿(如上升沿)到紧接着的相反边沿(下降沿)的时间,中间没有需要忽略的同类停止事件。
3.1.3 多事件间隔测量模式这种模式用于测量两个不同事件源之间的时间,并且可以忽略停止事件源前期的若干次触发。例如,你想在系统启动后,测量从“按键按下”(启动事件)到“第5次传感器触发”(停止事件)之间的时间。
- 设置事件源:启动和停止事件选择不同的信号源。
- 配置CNT:将
CNT设置为N-1。比如你想在第N次停止事件发生时结束测量,就设置CNT = N-1。这样,前N-1次停止事件被忽略,第N次停止事件才真正停止计数。
实操心得:理解
CNT是“忽略的停止事件数”而非“计数的周期数”是避免混淆的关键。在编程时,我习惯用一个宏或函数来封装这个逻辑,比如#define TDC_SET_CYCLE_MEASURE(cycles) (AUX_TDC->TRIGCNTLOAD = (cycles - 1)),这样意图更清晰,不易出错。
3.2 PRECTL与PRECNT:应对高速信号的预分频器
当你要测量的信号频率接近甚至超过AUX时钟频率时,直接测量会导致精度下降甚至无法捕捉。这时就需要预分频器(Prescaler)出场。PRECTL寄存器(偏移0x20)控制其工作。
3.2.1 预分频器工作原理预分频器本质上是一个计数器,它对输入的事件进行分频。RATIO位控制分频比:0代表16分频,1代表64分频。分频后产生一个新的内部事件AUX_TDC_PRE。手册中那句“AUX_TDC_PREevent toggles on every 32nd rising edge of the input”需要理解:在64分频模式下,输出事件每32个输入上升沿翻转一次,因此要获得一个完整的输出脉冲周期(上升沿到上升沿),需要64个输入上升沿。
3.2.2 配置步骤与注意事项
- 选择事件源(
SRC, bits 4:0):从异步事件总线中选择一个信号作为预分频器的输入。这个列表非常长,从RTC事件、比较器输出到任意AUXIO引脚事件都可以。 - 设置分频比(
RATIO, bit 6)。 - 复位与释放(
RESET_N, bit 7):这是一个关键步骤。配置SRC和RATIO时,必须先将RESET_N写0复位预分频器,配置完成后再写1释放。在复位期间,AUX_TDC_PRE事件输出为0。 - 连接至TDC:要使TDC使用预分频后的信号,必须将TDC的
TRIGSRC.START_SRC和TRIGSRC.STOP_SRC都设置为AUX_TDC_PRE。
3.2.3 PRECNT:读取分频器计数值PRECNT寄存器(偏移0x24)用于捕捉预分频器内部计数器的值。操作方式是写入任意值到CNT字段来触发捕捉,然后读取CNT字段获得捕捉到的值。手册警告了“1 LSB uncertainty”的问题,这通常发生在异步释放复位或门控事件源时。最佳实践是:在捕捉计数值时,确保事件源处于稳定的高电平或低电平。例如,如果事件源是AUXIO引脚,可以先禁用其输入缓冲器将其钳位到低电平;如果是比较器输出,则先禁用比较器。
踩坑记录:我曾遇到读取的
PRECNT值偶尔跳变的问题。后来发现是在预分频器仍在运行且输入信号活跃时进行捕捉。解决方案是,在触发捕捉前,先通过配置(如禁用IO缓冲器)确保事件源稳定,或者在一个已知的信号静止期(如传感器驱动的空闲阶段)进行读取。手册中提到的“captured value equals number of event pulses - 1”也需要注意,这意味着如果你看到计数值为N,实际输入的脉冲数是N+1(当N>=2时)。
4. 定时器(TIMER)寄存器配置与灵活定时策略
AUX提供了两个通用的16位定时器/计数器(Timer 0和Timer 1),它们比主CPU的定时器更节能,且能与AUX域内其他硬件事件紧密联动。
4.1 定时器配置寄存器:T0CFG/T1CFG
这两个寄存器结构完全相同,分别控制Timer 0和Timer 1。它们是定时器的大脑,决定了定时器如何“滴答”。
4.1.1 时钟源与分频(TICK_SRC, TICK_SRC_POL, PRE, MODE)这是定时器最灵活的部分。定时器的核心是一个计数器,它需要在每个“滴答”时递增。这个“滴答”可以来自两个源头:
- AUX时钟(
MODE=0):这是最常用的模式,定时器以AUX时钟频率(经预分频后)运行。PRE字段(bits 7:4)设置分频系数,分频比为2^PRE,范围从1 (PRE=0)到32768 (PRE=15)。这让你可以轻松获得从微秒到秒量级的定时周期。 - 外部事件(
MODE=1):此时,TICK_SRC(bits 12:8)选择的同步事件总线上的信号,成为计数器的时钟。TICK_SRC_POL(bit 13)决定在信号的上升沿还是下降沿计数。这允许你将定时器用作事件计数器。例如,你可以配置定时器对某个GPIO引脚上的脉冲进行计数。
4.1.2 工作模式(RELOAD)RELOAD位(bit 0)决定了定时器计数到目标值后的行为:
- 手动模式(
RELOAD=0):当计数器值T0CNTR.VALUE达到目标值T0TARGET.VALUE时,定时器自动停止(T0CTL.EN变为0)。你需要手动重新使能定时器才能开始下一次计时。这种模式适用于单次定时任务。 - 连续模式(
RELOAD=1):当计数器达到目标值后,它会自动清零并重新开始计数,T0CTL.EN保持为1。同时,它会生成一个TIMERx_EV事件(高电平持续一个AUX时钟周期)。这是产生周期性中断或触发事件的典型模式。
4.2 定时器控制与目标寄存器:T0CTL/T1CTL与T0TARGET/T1TARGET
配置好T0CFG后,就需要设置目标值和启动定时器。
T0TARGET.VALUE(bits 15:0):这是16位计数器的目标值。计数器从0开始递增,只要小于VALUE就继续计数,等于VALUE时则触发动作(停止或重载并产生事件)。注意:如果你设置VALUE=0,计数器会从0开始,由于0不小于等于0(取决于比较逻辑的具体实现,通常视为立即匹配),可能导致立即触发。通常应设置VALUE >= 1。T0CTL.EN(bit 0):定时器的使能位。写1启动定时器,同时计数器清零。写0停止定时器。
手册中给出了一个产生固定事件的最小配置示例:MODE=0(AUX时钟源),PRE=0(不分频),RELOAD=1(连续模式),VALUE=1。这样,定时器会在每个AUX时钟周期都产生一个TIMER0_EV事件,相当于一个频率为AUX时钟频率的脉冲发生器。
4.3 定时器实战应用:构建低功耗采样时序
假设我们需要用AUX定时器控制一个传感器每2秒采样一次,并在采样完成后通过事件触发ADC转换。
计算参数:假设AUX时钟频率为24MHz。我们需要2秒的定时周期。首先确定分频比。如果直接使用24MHz计数到2秒,需要计数值为48,000,000,远超16位定时器的最大值65535。因此必须使用预分频器。
- 尝试
PRE=15(分频32768),则定时器时钟频率 = 24MHz / 32768 ≈ 732.42 Hz。 - 2秒需要的计数值 = 732.42 Hz * 2s ≈ 1465。这个值在65535以内,可行。
- 设置
T0TARGET.VALUE = 1465。
- 尝试
配置寄存器:
// 假设使用TI DriverLib // 1. 配置定时器0 AUXTimerConfigure(AUX_TIMER_0_BASE, AUX_TIMER_CFG_MODE_PERIODIC | // 连续模式 AUX_TIMER_CFG_PRE_DIV_32768); // 预分频比 2^15 // 2. 设置目标值(周期) AUXTimerLoadSet(AUX_TIMER_0_BASE, AUX_TIMER_0, 1465); // 3. 配置定时器0完成事件,将其路由到ADC启动触发源 AUXEventClear(AUX_EVENT_ADC_IRQ); // 清除旧事件 AUXEventRegister(AUX_EVENT_TMR0_EV, myAdcTriggerCallback, NULL); // 关联回调(如果使用中断) // 或者更常见的是,通过事件总线直接硬件触发ADC: // 需要配置ADC的触发源为 TIMER0_EV启动定时器:
AUXTimerEnable(AUX_TIMER_0_BASE, AUX_TIMER_0);
这样,一个完全由硬件控制的、低功耗的周期性采样时序就建立起来了。主CPU可以在此期间休眠,只在ADC完成一批采样后才被唤醒处理数据。
注意事项:定时器的
TICK_SRC如果选择外部事件,那么该事件的频率必须低于AUX时钟频率,否则可能丢失计数。此外,在修改T0CFG、T0TARGET等配置寄存器时,务必确保定时器已停止(T0CTL.EN = 0)。
5. 电源与时钟管理寄存器:低功耗的指挥中枢
AUX_WUC(Wake-Up Controller)相关的寄存器是AUX域低功耗管理的总开关。它们控制着哪些模块上电、何时请求系统进入低功耗状态,以及如何被唤醒。
5.1 模块时钟使能:MODCLKEN0/MODCLKEN1
这两个寄存器(MODCLKEN0偏移0x0, MODCLKEN1偏移0x5C)功能类似,分别供系统CPU和AUX SCE请求某个AUX子模块的时钟。它们的设置是“或”关系,意味着只要两者之一请求了时钟,该模块的时钟就会被开启。这种设计允许主CPU和AUX SCE独立控制所需的外设,非常灵活。
关键位域解析:
TDC(bit 5): 使能TDC模块的接口时钟。特别注意:这仅使能了TDC的控制接口时钟。要使用TDC进行测量,还必须通过TDCCLKCTL寄存器请求TDC计数器和参考时钟。ANAIF(bit 4): 使能模拟接口(ADC, DAC, 比较器等)的时钟。同样,ADC的内部转换时钟需要单独通过ADCCLKCTL请求。TIMER(bit 3): 使能定时器模块时钟。SMPH(bit 0): 使能采样保持器(Sample-and-Hold)时钟,用于多通道ADC采样同步。
最佳实践:遵循“按需开启,用完即关”的原则。在AUX SCE的程序中,在任务初始化阶段使能所需模块的时钟(通过MODCLKEN1),在任务结束时关闭。这能最大限度减少动态功耗。例如,一个只使用定时器和ADC的任务,就只开启TIMER、ANAIF以及ADCCLKCTL,不要开启TDC或SMPH的时钟。
5.2 电源状态控制:PWROFFREQ, PWRDWNREQ, PWRDWNACK
这三个寄存器协同工作,管理AUX域与整个系统的电源状态。
PWRDWNREQ / PWRDWNACK (请求/确认对): 这是AUX域请求系统进入低功耗模式的通道。
- AUX SCE通过写
PWRDWNREQ.REQ=1,向系统(AON域)发出请求:“我的任务完成了,系统可以进入低功耗模式了”。 - AON域处理这个请求,并可能在适当的时候让系统进入低功耗模式。一旦进入,它会设置
PWRDWNACK.ACK=1作为回应,告诉AUX:“你的请求已被批准,系统现已进入低功耗,请注意电流受限”。 - 当AUX需要系统恢复全速运行时,写
PWRDWNREQ.REQ=0。但必须注意:在收到PWRDWNACK.ACK=0之前,AUX都应假定系统仍在低功耗模式。这是一个握手协议,确保状态同步。
- AUX SCE通过写
PWROFFREQ: 这是一个更彻底的请求——请求关闭AUX域的电源。这通常只在设备进入完全关机(Shutdown)模式,且下次唤醒需要完整复位时才使用。它的执行有两个前提条件:
AONCTLSTAT.AUX_FORCE_ON=0(AON域没有强制AUX开启)且MCUBUSSTAT.DISCONNECTED=1(MCU总线已断开)。一旦设置,该位在AUX重新上电前不应被清除。
5.3 时钟源控制:CLKLFREQ / CLKLFACK
AUX域通常运行在高速时钟下以执行任务。但在空闲或执行简单监控任务时,切换到更低频率的时钟(如32.768kHz的SCLK_LF)可以显著节省功耗。
- AUX SCE通过写
CLKLFREQ.REQ=1来请求切换到低频时钟。 - AON域完成切换后,会设置
CLKLFACK.ACK=1作为确认。 - 重要安全规则:软件在修改
REQ位之前,必须检查ACK位的值是否与当前REQ值一致。这是一条防止时钟竞争和系统不稳定的硬性规定。
5.4 唤醒事件管理:WUEVFLAGS与WUEVCLR
当AUX域和系统处于低功耗状态时,需要外部事件将其唤醒。WUEVFLAGS寄存器显示了来自AON域的唤醒事件状态。
AON_PROG_WU(bit 0): 由AON_EVENT:AUXWUSEL寄存器编程选择的唤醒源(如特定的RTC闹钟、IO引脚事件)触发。AON_SW(bit 1): 由系统CPU写AON_WUC:AUXCTL.SWEV位触发,用于软件唤醒。AON_RTC_CH2(bit 2): 由AON RTC的通道2比较事件触发。注意:这个事件本身不一定能唤醒AUX,除非它被配置为AUXWUSEL中的唤醒源之一。
当这些标志位被置起,且AUX域被唤醒后,需要通过写WUEVCLR寄存器相应的位来清除这些标志。清除操作有严格要求:必须保持WUEVCLR中的对应位为1,直到读取WUEVFLAGS中相应的标志位变为0。对于IO引脚唤醒源,还需要确保该IO引脚已正确分配给AUX域并已使能输入。
6. 寄存器配置的常见陷阱与调试技巧
即使理解了每个寄存器的含义,在实际配置和调试中依然会遇到各种问题。下面分享一些我踩过的坑和总结的技巧。
6.1 状态依赖与配置顺序
这是导致配置失败的最常见原因。许多寄存器位要求在模块处于特定状态(通常是IDLE)时才能修改。
- TDC:修改
TRIGCNTCFG.EN、TRIGSRC等关键配置前,务必检查AUX_TDC:STAT.STATE是否为IDLE。 - 定时器:修改
T0CFG、T0TARGET前,确保T0CTL.EN = 0。 - 预分频器:配置
PRECTL.SRC和RATIO时,必须先写PRECTL.RESET_N = 0,配置完成后再写RESET_N = 1。 - 时钟/电源请求:修改
CLKLFREQ.REQ前,必须确认CLKLFACK.ACK与当前REQ值一致。
建议的通用初始化顺序:
- 确保模块处于复位或禁用状态(如定时器停止,TDC空闲)。
- 配置所有静态参数(时钟源、分频比、工作模式、目标值等)。
- 配置事件路由(将模块的输出事件连接到其他模块的输入)。
- 最后才使能模块(置位
EN位)或释放复位(如RESET_N)。
6.2 事件总线配置的交叉验证
事件总线是硬件自动化的核心,但配置错误会导致整个链路失效。调试时:
- 逐级验证:如果设计了一个“IO事件 -> 预分频器 -> TDC启动”的链路,先验证IO事件本身是否能产生(可以通过配置一个定时器对该IO事件计数来测试)。再验证预分频器输出
AUX_TDC_PRE是否有信号(可以将其路由到一个GPIO引脚用示波器观察,或作为另一个定时器的时钟源)。 - 利用观察多路复用器:AUX的
OBSMUX功能可以将内部事件路由到特定的AUXIO引脚进行观察,这是非常强大的调试工具。 - 检查事件极性:确保启动和停止事件的边沿设置符合你的测量意图(同一边沿测周期,相反边沿测脉宽)。
6.3 低功耗场景下的特殊考量
- 时钟开关时序:在请求切换低频时钟(
CLKLFREQ)或关闭模块时钟前,确保该模块已完全停止工作。例如,关闭TDC时钟前,确认其STAT.STATE为IDLE。 - 唤醒源的稳定性:用于唤醒的IO引脚,需要配置正确的上下拉电阻,防止悬空引起的误唤醒。对于毛刺较多的信号,可以考虑在AON域或AUX内使用简单的数字滤波。
- 功耗测量验证:使用电流探头或芯片的功耗分析工具,验证你的配置是否真正达到了预期的低功耗状态。有时软件上认为进入了睡眠,但某个模块的时钟未被正确关闭,会导致功耗高于预期。
MODCLKEN0/1和ADCCLKCTL、TDCCLKCTL等寄存器是重点检查对象。
6.4 调试辅助:寄存器字段速查表
下表整理了本文涉及的核心寄存器及其关键字段,方便快速查阅:
| 寄存器组 | 寄存器名 (偏移) | 关键字段 | 功能描述 | 配置时机/注意事项 |
|---|---|---|---|---|
| TDC | TRIGCNTCFG(0x1C) | EN(bit 0) | 使能停止计数器 | 仅当STAT.STATE=IDLE时可更改 |
TRIGCNTLOAD(0x18) | CNT(bits 15:0) | 设置要忽略的停止事件数 | 0: 测量1个间隔/脉宽;N-1: 忽略前N-1次停止事件 | |
| 预分频器 | PRECTL(0x20) | SRC(bits 4:0)RATIO(bit 6)RESET_N(bit 7) | 选择输入事件源、分频比、复位控制 | 配置SRC/RATIO时需先设RESET_N=0,后设RESET_N=1 |
PRECNT(0x24) | CNT(bits 15:0) | 预分频器计数值捕捉 | 写操作触发捕捉,读操作获取值。确保事件源稳定时捕捉。 | |
| 定时器 | T0CFG/T1CFG(0x0/0x4) | TICK_SRC(bits 12:8)MODE(bit 1)PRE(bits 7:4)RELOAD(bit 0) | 选择时钟源、时钟源模式、预分频、重载模式 | 定时器禁用时(T0CTL.EN=0)配置 |
T0TARGET/T1TARGET(0xC/0x10) | VALUE(bits 15:0/7:0) | 定时器目标计数值 | ||
T0CTL/T1CTL(0x8/0x14) | EN(bit 0) | 定时器使能 | 写1启动并清零计数器 | |
| 电源时钟 | MODCLKEN0/1(0x0/0x5C) | TDC,ANAIF,TIMER,SMPH等 | 模块时钟使能请求 | 与MODCLKEN1是“或”关系。按需开启。 |
PWRDWNREQ(0x8) | REQ(bit 0) | AUX请求系统进入低功耗 | 需与PWRDWNACK握手 | |
CLKLFREQ(0x10) | REQ(bit 0) | AUX请求切换至低频时钟 | 修改前需检查CLKLFACK.ACK状态 |
掌握AUX传感器控制器的寄存器,就如同掌握了一套精细控制低功耗硬件协效处理器的密码。从高精度时间测量的TDC,到灵活多变的定时器,再到精细到模块级的电源时钟管理,每一组寄存器都体现了在资源受限环境下追求极致能效的设计哲学。实际开发中,我强烈建议在理解寄存器手册的基础上,多利用TI提供的Sensor Controller Studio图形化工具进行原型设计和代码生成,它能帮你直观地配置事件链路和生成稳健的SCE代码,然后再深入生成的代码去学习寄存器的具体操作,这样理论与实践结合,效率最高。记住,所有的配置都要围绕“让正确的硬件在正确的时间做正确的事,其他时间彻底休息”这一低功耗黄金法则。