深入解析CC27xx ADC:从12位SAR原理到μDMA低功耗数据采集实战
2026/7/26 6:12:32 网站建设 项目流程

1. 项目概述与核心价值

在嵌入式开发,尤其是物联网和无线传感节点设计中,模拟信号采集是连接物理世界与数字处理的核心桥梁。一个高效、灵活的ADC(模数转换器)模块,直接决定了系统对电池电量、环境温度、压力、光照等关键模拟量的感知精度与响应速度。德州仪器(TI)的CC27xx系列无线MCU,作为专为低功耗、高性能物联网应用设计的芯片,其内置的ADC模块绝非简单的“标配外设”,而是一个集成了12位SAR核心、4通道独立缓冲、μDMA支持以及窗口比较器等高级特性的精密数据采集引擎。

我接触过不少MCU的ADC,从简单的8位逐次逼近型到复杂的Σ-Δ型,CC27xx的这个ADC模块在设计思路上给我留下了深刻印象。它没有盲目追求极致的采样率或分辨率,而是在12位精度、最高1Msps的转换速率下,通过精巧的硬件架构和丰富的可配置选项,在性能、功耗和易用性之间找到了一个绝佳的平衡点。其核心价值在于“智能化”和“自主化”——通过4个独立的转换控制缓冲器(MEMCTL0-3)和结果寄存器(MEMRES0-3),配合强大的μDMA和事件系统,可以实现多通道、多模式的连续数据采集,而几乎不需要CPU的实时干预。这意味着在采集传感器数据时,CPU可以长时间处于深度睡眠模式,仅在数据缓冲区满或特定事件(如阈值超限)发生时被唤醒,这对于依赖纽扣电池工作数年的物联网设备而言,是延长续航的关键。

本文将带你深入这个模块的“五脏六腑”。我们不会停留在寄存器手册的简单翻译上,而是结合实际的开发场景,拆解其12位SAR架构的工作原理、4通道缓冲的配置逻辑、各种采样与转换模式的适用场景,并重点探讨如何利用μDMA和窗口比较器这两个“神器”来构建高效、可靠的低功耗数据采集系统。无论你是正在评估CC27xx用于新项目,还是已经上手但对其ADC的进阶功能感到困惑,相信这篇详尽的解析都能为你提供清晰的路线图和实用的避坑指南。

2. 12位SAR架构与核心工作原理拆解

2.1 SAR ADC的基本原理与CC27xx的实现

逐次逼近寄存器(SAR)型ADC是嵌入式领域最常见的中等精度、中等速度的转换器架构。它的工作原理很像用天平称重:先拿一个最大的砝码(对应最高有效位MSB)跟未知重量比较,如果砝码太重就拿走,太轻就留下;然后再用次大的砝码重复这个过程,直到最小的砝码(对应最低有效位LSB)比较完毕。CC27xx的ADC核心就是一个典型的12位SAR架构。

具体到电路层面,它内部包含一个高精度的数模转换器(DAC)、一个比较器和一个逐次逼近逻辑控制单元。转换开始时,采样保持电路捕获外部输入电压(Vin)。然后,逻辑控制单元首先将DAC的输出设置为中间量程电压(对于12位,即VR+/2),并与Vin在比较器中比较。如果Vin大于DAC输出,则MSB保持为1,否则为0。接着,逻辑单元根据MSB的结果,设置下一个位(次高位)的DAC输出值,再次比较,以此类推,经过12次比较后,就得到了12位的数字输出。

CC27xx的ADC公式(见手册公式3)清晰地描述了这一量化过程:NADC = (2^n - 1) * (Vin + 0.5LSB) / VR+。这里的0.5LSB是一个关键的“量化偏移”,它确保了转换结果的期望值在理论上是无偏的。例如,当输入电压恰好为1.5LSB时,没有这个偏移,结果可能在1和2之间随机跳动;加上0.5LSB后,输入被“推”到了更接近2的区间,提高了线性度。LSB的大小等于参考电压VR+除以2^n,它直接决定了ADC的电压分辨率。在VR+ = 1.4V、12位模式下,LSB = 1.4V / 4096 ≈ 0.342 mV。这意味着ADC能分辨出约0.342毫伏的电压变化。

注意:参考电压的选择:公式中VR-默认为0V(地),这是单端输入测量的常见设定。VR+的选择(VDDS、内部1.4V/2.5V或外部参考)至关重要。选择VDDS作为参考,其值会随电源电压波动,适合测量与电源成比例的信号(如电阻分压测电池电压)。选择内部或外部精密参考电压,则能获得稳定、精确的绝对电压测量,但输入信号范围不能超过该参考电压。

2.2 分辨率模式与转换时钟周期的权衡

CC27xx的ADC支持12位、10位和8位三种分辨率模式,通过ADC.CTL2[2:1]的RES位域配置。这不仅仅是输出数据位宽的变化,更直接影响转换速度和功耗。

  • 12位模式:需要14个ADCCLK周期完成一次转换。这是精度最高的模式,能提供4096个码值。
  • 10位模式:需要12个ADCCLK周期。精度降至1024个码值,但转换速度更快。
  • 8位模式:仅需9个ADCCLK周期。精度为256个码值,速度最快。

为什么位数越少,所需周期越少?因为SAR ADC的转换周期数大致等于其位数加上一些固定的开销(如采样保持、比较器稳定时间)。降低分辨率,意味着需要进行的“称重”比较次数减少,自然就快了。

如何选择?这需要权衡。如果你的传感器本身精度只有8位,或者后级处理只需要8位数据,那么强行使用12位模式只会浪费转换时间和功耗。例如,在需要高速采集声音波形(虽然CC27xx的ADC不一定适合音频)或快速变化的信号时,8位模式可能是更好的选择。反之,对于高精度温度测量或电池电压监控,12位模式能提供更细腻的变化感知。在软件中,你可以根据应用场景动态切换分辨率,这也是低功耗设计的一个技巧:在需要高精度时用12位,在仅需监控大致趋势时切换到8位以节省功耗。

2.3 时钟源选择与采样时序精解

ADC的时钟(ADCCLK)是整个模块的“心跳”。CC27xx提供了两个时钟源:CLKSVT(系统总线时钟)和HFXT(高频外部晶振时钟),最高支持48MHz。

  • 选择CLKSVT:这是最常用的选择。它与其他外设时钟同源,便于同步,且能实现采样启动的确定性。例如,你可以让一个定时器事件精确地触发ADC采样,因为两者时钟同源,没有相位差带来的抖动。这对于需要多个传感器同步采样的应用(如三相电流检测)非常重要。
  • 选择HFXT:当你对采样周期的抖动(Jitter)有极严格要求时使用。HFXT通常是一个更稳定、更纯净的时钟源。采样时钟的抖动会直接转化为采样时间的误差,在测量高频信号时,这种时间误差会引入额外的噪声。因此,在需要极高信噪比(SNR)的场合,如某些精密测量仪表,应优先考虑HFXT。

采样周期由三个参数共同决定:采样时钟源频率、时钟分频器(SCLKDIV)和采样定时器(SCOMPx)。关系为:采样窗口时间 = (SCOMPx 值) * (ADCCLK 周期) * (SCLKDIV 分频系数)

这里有一个极易被忽略的坑点:当ADC配置为自动掉电模式(PWRDN=0,默认)时,ADC模块在每次转换结束后会关闭以省电。当下一个采样触发到来时,ADC需要一段“唤醒时间”才能稳定工作。这段唤醒时间必须被包含在有效的采样窗口内!手册中的警告非常明确:如果最大ADC唤醒时间是5µs,那么你通过SCOMPx设置的采样窗口持续时间必须大于(5µs + 实际需要的采样时间)。否则,ADC可能还未完全稳定就开始转换,导致结果不准。许多工程师在调试时发现ADC读数偶尔偏差很大,问题往往就出在这里。我的经验是,在初始化后,先让ADC完成一次 dummy conversion(虚转换)来确保它已稳定,或者在计算采样时间时,保守地预留足够的余量(比如额外增加10-20个ADCCLK周期)。

3. 四通道缓冲与多样化转换模式实战

3.1 MEMCTL与MEMRES:独立缓冲区的设计哲学

CC27xx ADC最强大的特性之一就是其4个独立的转换控制缓冲区(MEMCTL0-3)和对应的结果寄存器(MEMRES0-3)。这绝不仅仅是多了几个寄存器那么简单,它代表了一种硬件级的任务调度能力。

每个MEMCTLx寄存器可以独立配置:

  • CHANSEL:选择16个模拟输入通道中的哪一个。
  • VRSEL:选择该通道使用的参考电压源(VDDS、内部VREF、外部VREF)。
  • STIME:选择使用SCOMP0还是SCOMP1作为该通道的采样时间基准。
  • WINCOMP:使能或禁用该通道的窗口比较器功能。
  • TRIG:在序列转换模式下,决定是否需要一个触发来切换到下一个通道。

而每个MEMRESx寄存器则专门用于存储对应MEMCTLx通道的转换结果。

这种设计的好处是什么?想象一个环境监测节点,需要同时采集温度(通道0)、湿度(通道1)、光照(通道2)和电池电压(通道3)。如果没有独立缓冲,你需要频繁地通过软件切换通道、配置参数、启动转换、读取结果,CPU忙个不停。而在CC27xx上,你可以一次性配置好:

  • MEMCTL0: 通道0,内部VREF参考,采样时间SCOMP0
  • MEMCTL1: 通道1,内部VREF参考,采样时间SCOMP0
  • MEMCTL2: 通道2,VDDS参考(因为光照传感器输出与电源相关),采样时间SCOMP1(可能需要更长的采样时间)。
  • MEMCTL3: 通道3,内部VREF参考,采样时间SCOMP0

然后,你可以启动一个“序列转换”模式。ADC会按照MEMCTL0->MEMCTL1->MEMCTL2->MEMCTL3的顺序,自动完成所有四个通道的采样和转换,结果分别存入MEMRES0-3。整个过程,CPU只需要在序列开始时给一个触发(软件或事件),然后在序列结束后一次性读取四个结果,或者更酷的是,直接让μDMA把四个结果搬走,CPU全程可以睡觉。

3.2 四种转换模式的场景化配置指南

CC27xx ADC提供了四种转换模式,覆盖了从简单单次采样到复杂循环序列的所有需求。

1. 单通道单次转换(Single channel single conversion)

  • 工作流程:选定一个MEMCTL(即一个通道),采样并转换一次,完成后自动停止,ENC位被硬件清零。
  • 适用场景:非周期性的、按需读取的传感器。例如,用户按下按钮后才读取一次电位器的位置。
  • 配置要点:通常配合软件触发和手动采样模式使用。配置简单,但效率最低。

2. 单通道重复转换(Repeat single channel conversion)

  • 工作流程:选定一个MEMCTL,对该通道进行连续、重复的采样转换,直到软件主动清除ENC位。
  • 适用场景:需要对单一信号进行连续监控或波形捕获。例如,持续监控一个模拟电压是否超过阈值。
  • 配置要点:可以配置为自动采样模式,由定时器事件定期触发,实现固定频率的采样。注意:在自动采样模式下,如果MEMCTL.TRIG位被设置,则每次转换完成后需要一个新的触发(软件或事件)来启动下一次采样;如果TRIG为0,则会自动连续进行。

3. 通道序列转换(Sequence of channel conversion)

  • 工作流程:通过STARTADDENDADD定义一个MEMCTL序列(例如从MEMCTL0MEMCTL3),ADC按顺序对每个通道采样转换一次,整个序列完成后停止,BUSY标志位清零。
  • 适用场景多传感器轮流采集的经典场景。如上文的环境监测节点例子。非常适合需要同步或按固定顺序采集多个不同信号的应用。
  • 配置要点:每个MEMCTL都可以独立配置通道和参数。TRIG位在这里非常有用:你可以设置序列中某些通道转换后需要等待外部事件(如一个GPIO信号)才能继续下一个,实现硬件同步的复杂采样逻辑。

4. 通道序列重复转换(Repeat sequence of channel conversion)

  • 工作流程:与序列转换类似,但会无限循环执行定义的序列,直到软件清除ENC位。
  • 适用场景需要持续、循环采集多路信号。例如,一个数据记录仪需要以10Hz的频率持续记录4个通道的传感器数据。
  • 配置要点:这是实现后台连续数据采集的利器。结合μDMA,可以构建一个“采集流水线”:ADC在前台循环采集,μDMA在后台默默地将MEMRES中的数据搬运到RAM的环形缓冲区中,CPU只需定期处理缓冲区中的数据即可。

实操心得:模式选择与触发配置的陷阱配置转换模式时,最容易出错的是**触发源(TRIGSRC)采样模式(SAMPMODE)**的组合。手册中的表21-1是必读的“交通规则”。

  • 手动采样模式(MANUAL)限制极大:它只支持“软件触发+单通道单次转换”这一种组合。如果你配置了事件触发或重复/序列模式,ADC将无法工作。手动模式下,你需要用软件控制SC位的高低电平来精确控制采样窗口的宽度,这通常用于需要非常规采样时间或与外部硬件严格同步的特殊场合。
  • 自动采样模式(AUTO)是主流:在自动模式下,采样窗口的宽度由SCOMPx寄存器决定,你只需要提供一个触发边沿(软件写SC位或事件输入)来启动采样,剩下的ADC会自动完成。绝大多数应用都应使用自动模式。
  • 事件触发与序列模式:在序列或重复序列模式下使用事件触发时,需要仔细规划TRIG位。如果序列中所有MEMCTLTRIG=0,那么一个事件触发会启动整个序列,ADC自动完成序列内所有通道的转换。如果某个MEMCTLTRIG=1,则转换完该通道后,ADC会停下来等待下一个事件触发,才会继续下一个通道。这可以用来实现与外部信号严格同步的多步采样。

4. μDMA与FIFO:实现零CPU开销的数据搬运

4.1 μDMA集成与配置精髓

直接存储器访问(DMA)是解放CPU的利器,而CC27xx的μDMA与ADC的集成度非常高。ADC模块有一个专用的INT_EVENT2事件发布者,可以将特定的ADC事件(最常用的是MEMRESIFGx,即结果寄存器更新标志)直接映射为μDMA的触发信号。

配置μDMA搬运ADC数据的典型流程:

  1. 配置ADC端
    • 使能DMA:设置CTL2.DMAEN = 1
    • 配置INT_EVENT2.IMASK寄存器,将MEMRESIFGx(例如MEMRESIFG3)对应的中断标志位解除屏蔽,使其能产生DMA触发事件。
    • 选择转换模式(如重复序列转换)。
  2. 配置μDMA通道
    • 设置通道控制结构体,指定传输模式(如基本模式、Ping-Pong模式)。
    • 设置源地址(Source Address):在非FIFO模式下,是MEMRESx的地址;在FIFO模式下,是FIFODATA寄存器的地址。
    • 设置目的地址(Destination Address):通常是RAM中的一个数组(缓冲区)。
    • 设置传输数据量(Transfer Size)。
    • 使能该通道。
  3. 启动ADC转换:设置ENC=1,并给出初始触发(软件或事件)。

之后,每当ADC完成一次转换并设置MEMRESIFGx标志,μDMA控制器就会自动被触发,将MEMRESxFIFODATA中的数据搬运到指定的RAM地址。当设定的传输数据量完成时,μDMA会产生一个完成中断,通知CPU数据已就绪,可以处理了。在整个数据搬运过程中,CPU无需参与。

重要警告:手册中明确提到,对于基于DMA的操作,在单次序列转换模式下,STARTADD必须小于ENDADD,因为DMA的源地址指针不会自动回滚。而重复序列转换模式不支持基于DMA的数据传输,因为μDMA不支持循环寻址模式。这意味着,如果你想用DMA搬运一个无限循环的ADC序列数据,需要采用其他方法,例如使用Ping-Pong缓冲区结合DMA的半满/全满中断,或者使用FIFO模式并设置合适的触发阈值。

4.2 FIFO模式与非FIFO模式的深度抉择

是否启用FIFO(FIFOEN位)是配置ADC数据流的一个关键决策,它深刻影响了CPU/DMA读取数据的方式和效率。

非FIFO模式(FIFOEN=0)

  • 数据存储:转换结果直接存入对应的MEMRESx寄存器。MEMCTL0的结果进MEMRES0,一一对应。
  • 读取方式:CPU或DMA直接读取MEMRESx寄存器。
  • 优点:简单直观,每个通道的结果有固定的“家”,便于管理和寻址。
  • 缺点:在序列转换时,如果CPU/DMA读取速度跟不上ADC转换速度,就可能发生数据覆盖(溢出)或读到旧数据(下溢)。需要精细的同步。

FIFO模式(FIFOEN=1)

  • 数据存储:所有通道的转换结果(无论来自哪个MEMCTL)都按顺序压入一个深度为4(对应4个MEMRES)的硬件FIFO队列。MEMRES0-3变成了FIFO的存储单元,失去了与MEMCTLx的直接对应关系。
  • 读取方式必须通过一个专用的FIFODATA寄存器读取。更重要的是,数据总是以32位(两个16位样本打包)的形式被读出。这意味着每次读取FIFODATA,你会一次性得到两个ADC转换结果(高16位和低16位)。
  • 优点
    1. 数据压缩:32位读取效率更高,减少了总线访问次数,尤其在DMA传输时能提升吞吐量。
    2. 缓冲作用:FIFO可以平滑CPU/DMA读取和ADC转换之间的速度差异,减少溢出/下溢错误。
    3. 灵活的触发:可以使用MEMRESIFGx作为FIFO的填充水位线来触发DMA。例如,设置MEMRESIFG3(即FIFO快满时)触发DMA,让DMA一次性搬运多个数据,效率更高。
  • 缺点:数据失去了通道标签。你从FIFO读出的是一串数据,需要根据你配置的转换序列顺序来解析哪个数据对应哪个通道。在复杂的、动态切换通道的序列中,这增加了软件解析的复杂度。

模式选择建议

  • 固定序列、多通道、希望简化软件逻辑:使用非FIFO模式。每个通道结果位置固定,编程简单。
  • 高速、连续采样单一或少数通道,追求最高数据传输效率:使用FIFO模式。利用32位打包读取和DMA,可以最大化总线利用率。
  • 需要利用FIFO作为缓冲区来应对突发数据或降低CPU中断频率:使用FIFO模式,并设置合适的水位线中断。

一个真实的踩坑案例:我曾在一个项目中启用FIFO模式进行单通道重复转换,并尝试用CPU轮询MEMRES0来读取数据,结果读到的全是乱码。调试了很久才发现,在FIFO模式下,必须通过FIFODATA寄存器读取,并且读出的32位数据包含两个样本。手册也特别警告:“单次转换模式启用FIFO不推荐用于CPU或DMA操作,这会导致下溢情况……” 所以,务必根据你的转换模式来选择是否启用FIFO。

5. 窗口比较器与低功耗监控实战技巧

5.1 窗口比较器:硬件实现的智能阈值报警

窗口比较器是CC27xx ADC的一个“智能化”功能,它允许你在硬件层面设定一个高阈值(WCHIGH)和一个低阈值(WCLOW)。每次ADC转换完成后,硬件会自动将结果与这两个阈值比较,并产生三种可能的中断标志:

  • HIGHIFG:结果高于WCHIGH
  • LOWIFG:结果低于WCLOW
  • INIFG:结果在WCLOWWCHIGH之间(含等于)。

这个功能的威力在于极低的功耗监控。想象一个电池供电的温湿度记录仪,大多数时间温度都在舒适区间内缓慢变化,我们不需要记录每一个数据点。我们可以配置ADC以很低的频率(比如每分钟一次)采样温度传感器,并启用窗口比较器,将阈值设置为关注范围的上下限(例如18°C和28°C对应的ADC码值)。只要温度在范围内,ADC转换完成后产生INIFG,这个事件可以配置为不唤醒CPU,或者仅触发一个不处理的中断。一旦温度超限(产生HIGHIFGLOWIFG),这个事件可以配置为一个高优先级中断,立即唤醒深度睡眠的CPU进行紧急处理或记录。这样,CPU绝大部分时间都在睡觉,只有异常情况才被唤醒,系统平均功耗可以做到极低。

配置要点与坑点

  1. 全局阈值,局部使能WCHIGHWCLOW是全局寄存器,对所有通道生效。但是,窗口比较功能需要在每个MEMCTLx寄存器中通过WINCOMP位单独使能。这非常灵活,你可以让通道0(温度)启用比较器,而通道1(电池电压)禁用。
  2. 数据格式与阈值设定这是一个巨坑!窗口比较器比较的是存储在MEMRESFIFO中的数字结果。这个结果的格式受CTL2.DF(数据格式:无符号/二进制补码)和CTL2.RES(分辨率:12/10/8位)影响。手册明确警告:当改变数据格式或分辨率时,硬件不会自动重置或缩放阈值寄存器!如果你从12位无符号模式切换到8位二进制补码模式,但阈值寄存器里的值还是原来的,比较结果将完全错误。软件必须在每次更改DF或RES后,重新计算并配置WCHIGH和WCLOW的值。我的习惯是,将阈值计算封装成一个函数,在ADC初始化或配置变更时调用。

5.2 低功耗设计模式与自动掉电

CC27xx ADC的功耗管理非常细致。核心是CTL0.PWRDN位,它控制ADC核心的掉电策略。

  • 自动掉电模式(PWRDN=0,默认):ADC在一次转换结束后,如果下一采样不需要立即开始,则会自动进入低功耗状态。这是最常用的省电模式。但如前所述,需要额外考虑唤醒时间对采样窗口的影响。
  • 手动掉电模式(PWRDN=1):ADC在转换结束后保持上电状态。这适用于需要极高采样率或连续采样的场景,可以避免频繁唤醒的开销,但静态功耗会更高。

构建一个超低功耗数据采集系统的思路

  1. 使用定时器事件触发:配置一个低功耗定时器(如RTC),定期(例如每秒一次)产生一个事件,作为ADC的采样触发源(TRIGSRC = EVENT)。
  2. 配置序列转换:将需要采集的所有传感器通道配置为一个转换序列。
  3. 启用μDMA:配置μDMA,当序列中最后一个通道转换完成(例如MEMRESIFG3)时触发,将整个序列的结果搬运到RAM。
  4. 启用窗口比较器(可选):对关键通道(如电池电压)设置阈值,仅当数据超限时才产生CPU中断。
  5. 配置ADC为自动掉电模式
  6. 启动序列:设置ENC=1
  7. CPU进入低功耗模式:CPU可以进入待机或深度睡眠模式。

此后,系统完全由硬件自动运行:定时器唤醒ADC,ADC完成多通道采集,DMA搬运数据,CPU仅在DMA传输完成或窗口比较器报警时才被唤醒进行后续处理。这种架构将CPU的参与度降到最低,是物联网终端设备实现长续航的经典设计。

6. 常见问题排查与调试心得实录

即使理解了所有原理,实际调试ADC时还是会遇到各种问题。下面是我总结的一些常见“症状”和排查思路。

问题1:ADC读数不稳定,跳动很大。

  • 检查电源和地:这是首要问题。确保模拟电源(VDDS)干净、稳定,纹波小。模拟地和数字地之间的连接要处理好,推荐单点接地。在VDDS和VSS引脚附近放置足够且合适的去耦电容(例如10uF钽电容+100nF陶瓷电容)。
  • 检查信号源阻抗:ADC的采样保持电路在对内部电容充电时,需要从信号源汲取电流。如果信号源阻抗太高,在采样时间内电容无法充电到稳定电压,就会导致误差。确保信号源阻抗足够低(通常要求小于10kΩ),或者在ADC输入端并联一个小的滤波电容(如100pF)以提供瞬时电荷,但要注意这会降低输入信号的带宽。
  • 检查采样时间:采样窗口时间不足是读数不准的常见原因。根据信号源阻抗和内部采样电容计算所需的最小采样时间,并加上ADC的唤醒时间(如果使能了自动掉电)。通过增大SCLKDIV分频系数或SCOMPx寄存器的值来延长采样时间。
  • 检查参考电压:如果使用VDDS作为参考,测量VDDS是否稳定。如果使用内部参考,注意其精度和温漂是否符合要求。

问题2:ADC转换结果全为0或全为满量程。

  • 全为0:可能输入电压低于地(VSS),或输入通道配置错误,实际测量的是内部连接到地的测试通道。检查CHANSEL配置和实际电路连接。
  • 全为满量程(如0xFFF):可能输入电压超过参考电压VR+,或者参考电压源选择错误(例如输入1V信号,但选择了1.4V内部参考,结果接近满量程是合理的)。检查VRSEL配置和实际输入电压范围。

问题3:DMA无法正常搬运ADC数据。

  • 检查DMA触发源是否匹配:确保在INT_EVENT2.IMASK中使能了正确的MEMRESIFGx位。在非FIFO模式下,这个x要与STARTADD指定的MEMCTL索引对应。在FIFO模式下,通常使用最后一个MEMRESIFG(如MEMRESIFG3)作为FIFO快满的触发条件。
  • 检查DMA通道配置:确认源地址、目的地址、传输数据量配置正确。在FIFO模式下,源地址必须是FIFODATA寄存器,且读取的数据是32位的。
  • 检查DMA与ADC的启动顺序:一个可靠的顺序是:1) 配置ADC所有参数,但先不设ENC=1;2) 配置并使能μDMA通道;3) 最后设置ADC.CTL1.ENC = 1并发出启动触发。避免DMA还没准备好,ADC数据就来了的情况。
  • 确认转换模式支持:再次确认你的转换模式是否支持DMA。记住,重复序列转换模式不支持DMA。

问题4:使用事件触发时,ADC不启动或只转换一次。

  • 检查事件路由:确认事件产生源(如定时器)的事件输出已正确映射到ADC的事件输入。这通常需要通过事件路由器(EVTSVT)的ADCTRGSEL寄存器配置。
  • 检查TRIG:在序列转换模式下,如果某个MEMCTLTRIG=1,那么转换完该通道后,ADC会等待下一个事件触发。如果你希望一个事件触发整个序列,需要确保序列中所有MEMCTLTRIG=0
  • 检查ENC:在转换完成(单次模式)或主动停止前,不要清除ENC位。在事件触发的重复或序列模式下,ENC位需要一直保持为1。

调试技巧:利用状态寄存器(STA)ADC.STA寄存器中的BUSY位是一个非常有用的调试工具。它直观地告诉你ADC当前是否正在采样或转换。在调试触发或序列逻辑时,可以在关键点读取这个位,验证ADC是否按预期工作。另外,注意手册中对查询BUSY位的提醒:在软件触发启动转换后,需要等待至少9个CLKSVT时钟周期再去查询,以避开内部同步延迟。

最后,分享一个软件架构上的建议:将ADC的配置参数(通道、参考源、采样时间、序列顺序等)封装成结构体,并针对不同的应用场景(如“高精度温度测量”、“快速电池电压巡检”、“多传感器循环采集”)预定义几个配置模板。在初始化时,只需加载对应的模板并稍作修改(如修改具体的GPIO引脚),可以极大提高代码的复用性和可维护性,减少配置出错的概率。ADC模块虽然复杂,但一旦摸清其脉络,它将成为你在CC27xx平台上构建高效、可靠嵌入式系统的得力助手。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询