ADC 具有一个用于与 DMA 进行通信的专用接口。该接口可使用 DMA 自动将 ADC 结果存储到存储器,从而有助于减轻 CPU 的工作负载。图 15-5 展示了构成此接口的信号:
注: “DMA 触发计数”信号指示 DMA 在一次触发请求时可以传输的样本数。ADC 使用“DONE 状态”信号生成 DMA DONE 中断,该信号指示编程块大小的 DMA 数据传输是否完成。
CTL2 寄存器中的 DMAEN 位用于使 DMA 能够进行 ADC 数据传输。当 DMA 发出“DONE 状态”信号时,ADC 硬件会将 DMAEN 位清零。预计软件将使用 DMAEN 重新启用 DMA,以使 ADC 生成下一个 DMA 触发。
ADC 还包含一个可选的先入先出缓冲区,提供了一种方法来存储 ADC 结果供将来使用,例如由 DMA 传输到存储器。无论是启用还是禁用 FIFO,CPU 和 DMA 均可用于从 ADC 移动数据。第三个事件发布者的 RIS 寄存器中的存储器结果标志用作 FIFO 阈值,可以取消屏蔽以生成 DMA 触发。
以下各节介绍了在各种转换模式下以及在启用或禁用 FIFO 的情况下使用 ADC+DMA/CPU 的详细信息
非 FIFO 模式 (FIFOEN=0) 下的 ADC-DMA/CPU 操作
非 FIFO 模式 (FIFOEN=0) 下的 ADC-DMA/CPU 操作
- 单次转换和重复单次转换
- 配置 STARTADD 位以选择所需的 MEMCTLx 寄存器
- MEMCTLx 与 MEMRESx 相关
- MEMRESx 与 MEMRESIFGx 相关
- 配置 MEMCTL CHANSEL 位以选择所需的 ADC 通道
- MEMRESx 中提供转换数据
- 可以设置 MEMRESIFGx 以生成 CPU 中断或 DMA 触发
- 必须通过软件将 SAMPCNT 编程为 1 以执行 DMA 操作
- 当 ADC 在 CPU 或 DMA 读取前一个样本之前更新 MEMRESx 时,会设置转换溢出标志 OVIFG
- 当 CPU 或 DMA 在下一个转换结果可用前读取 MEMRESx 寄存器时,会设置转换下溢标志 UVIFG
- 序列转换和重复序列转换
- 配置 STARTADD 位以选择序列中的第一个 MEMCTL
- 配置 ENDADD 位以选择序列中的最后一个 MEMCTL
- MEMCTLx 与 MEMRESx 相关
- MEMRESx 与 MEMRESIFGx 相关
- 配置每个 MEMCTLx CHANSEL 位以选择所需的 ADC 通道
- MEMRESx 中提供转换数据
- 可以设置 MEMRESIFGx 以生成 CPU 中断或 DMA 触发
- 必须根据软件针对 DMA 操作进行的阈值设置,通过软件将 SAMPCNT 编程为一个合适的值
- 当 ADC 在 CPU 或 DMA 读取前一个样本之前更新 MEMRESx 时,会设置转换溢出标志 OVIFG
- 当 CPU 或 DMA 在下一个转换结果可用前读取 MEMRESx 寄存器时,会设置转换下溢标志 UVIFG
注: 对于基于 DMA 的操作,由于 DMA 源不回滚,MEMCTL 起始地址应小于单次序列转换的结束地址。重复序列转换模式不支持基于 DMA 的数据传输,因为 DMA 不支持循环寻址模式。
FIFO 模式 (FIFOEN=1) 下的 ADC-DMA/CPU 操作
- 单次转换和重复单次转换
- 配置 STARTADD 位以选择所需的 MEMCTLx 寄存器
- MEMCTLx 与 MEMRESx 不相关
- MEMRESx 与 MEMRESIFGx 相关
- 配置 MEMCTL CHANSEL 位以选择所需的 ADC 通道
- 转换数据按顺序加载到 MEMRES0/1/2/…/N(FIFO 结构)
- CPU 或 DMA 必须从专用的 FIFODAT 寄存器(而不直接从 MEMRES 寄存器)读取 ADC 样本
- FIFO 中的数据始终压缩为两个样本,并在 CPU 或 DMA 读取 FIFODAT 时作为 32 位数据提供
- MEMRESIFGx 可用作阈值条件以生成 CPU 中断或 DMA 触发
- 为了充分利用 FIFO,可以使用最后一个 MEMRESIFG
- 必须根据针对 DMA 操作进行的阈值设置,通过软件将 SAMPCNT 编程为一个合适的值
- 当 ADC 在 CPU 或 DMA 读取前一个样本之前更新 MEMRESx 时,会设置转换溢出标志 OVIFG
- 当 CPU 或 DMA 在 MEMRESx 寄存器中的转换结果可用之前读取 FIFODAT 寄存器时,会设置转换下溢标志 UVIFG。
注: 对于基于 CPU 或 DMA 的操作,不建议采用启用了 FIFO 的单次转换模式。这将导致下溢情况,并且必须在软件中丢弃不需要的 16 位数据。
- 序列转换和重复序列转换
- 配置 STARTADD 位以选择序列中的第一个 MEMCTL
- 配置 ENDADD 位以选择序列中的最后一个 MEMCTL
- MEMCTLx 与 MEMRESx 不相关
- MEMRESx 与 MEMRESIFGx 相关
- 配置每个 MEMCTLx CHANSEL 位以选择所需的 ADC 通道
- 转换数据按顺序加载到 MEMRES0/1/2/…/N(FIFO 结构)
- CPU 或 DMA 必须从专用的 FIFODAT 寄存器(而不直接从 MEMRES 寄存器)读取 ADC 样本
- FIFO 中的数据始终压缩为两个样本,并在 CPU 或 DMA 读取 FIFODAT 时作为 32 位数据提供
- MEMRESIFGx 可用作阈值条件以生成 CPU 中断或 DMA 触发
- 为了充分利用 FIFO,可以使用最后一个 MEMRESIFG
- 必须根据针对 DMA 操作进行的阈值设置,通过软件将 SAMPCNT 编程为一个合适的值
- 当 ADC 在 CPU 或 DMA 读取前一个样本之前更新 MEMRESx 时,会设置转换溢出标志 OVIFG
- 当 CPU 或 DMA 在 MEMRESx 寄存器中的转换结果可用之前读取 FIFODAT 寄存器时,会设置转换下溢标志 UVIFG
注:
- CPU 或 DMA 读取后,不会自动清除 FIFODAT 寄存器中的数据。新的转换数据会覆盖 FIFODAT 寄存器中的先前数据。
- 为确保同步读取存储 16 位样本的 32 位 FIFO 中的字节,可以使用特定的 DMA 触发器。尤其是,选择 MEMRES1 和 MEMRES3 将使 FIFO 中的字节读取与相应的 MEMRESx 字节同步。
- 如果 ADC 在重复序列模式或正常重复模式期间被禁用,则值得注意的是在 ADC 完全停止之前可能会发生额外的转换。
表 15-5 ADC-DMA/CPU 操作摘要矩阵| 转换模式 | FIFO 禁用 (FIFOEN=0) 未压缩样本 直接从 MEMRESx 寄存器读取 | FIFO 启用 (FIFOEN=1) 始终压缩样本 仅从 FIFODAT 寄存器读取 |
|---|
| CPU 读取/写入 | DMA 读取/写入 | CPU 读取/写入 | DMA 读取/写入 |
|---|
| 单通道 | 支持 | 支持 SAMPCNT=1 16 位样本 | 不建议 将设置下溢标志 应忽略不需要的 16 位 | 不建议 将设置下溢标志 应忽略不需要的 16 位 |
| 重复单次 | 支持 | 支持 SAMPCNT=1 16 位样本 | 支持 MEMRESIFG=CPU 中断 32 位 FIFODAT 读取 | 支持 MEMRESIFG=DMA 触发 SAMPCNT=32 位样本 |
| 序列 | 支持 | 支持 SAMPCNT=16 位样本 STARTADD<ENDADD | 支持 MEMRESIFG=CPU 中断 32 位 FIFODAT 读取 | 支持 MEMRESIFG=DMA 触发 SAMPCNT=32 位样本 |
| 重复序列 | 支持 | 不支持 | 支持 MEMRESIFG=CPU 中断 32 位 FIFODAT 读取 | 支持 MEMRESIFG=DMA 触发 SAMPCNT=32 位样本 |