DMA之 Trigger input和 Trigger Output 概念
理解DMA(直接内存访问)中的 Trigger Output(触发输出) 和 Trigger Input(触发输入) 的关键在于明确“谁”在触发“谁”,以及信号流动的方向。
它们确实是两个方向的触发信号,但作用的对象和目的不同:
📍 核心概念
DMA传输的启动/继续: 本质上,DMA传输(无论是从外设到内存,内存到外设,还是内存到内存)需要由一个事件来启动或继续下一个数据块的传输。这个事件就是一个触发信号。
硬件触发 vs 软件触发: 触发信号可以由软件(设置寄存器位)或硬件(特定的引脚电平或边沿变化)产生。Trigger Input 和 Trigger Output 主要讨论的是硬件触发的场景。
🔌 DMA Trigger Input (触发输入)
输入到哪里? 信号输入到 DMA控制器。
谁发出的? 由外设发出。
作用: 这个信号告诉 DMA控制器:“我现在有数据需要传输” 或者 “我现在准备好接收数据了”。
目的: 启动一次新的DMA传输请求,或者继续一个正在进行但需要外设事件同步的DMA传输(比如流传输模式)。
典型场景:
ADC转换完成: ADC完成一次模数转换后,其转换完成标志或专用触发信号线会发出一个触发信号给DMA的 Trigger Input。DMA控制器收到后,立即将ADC数据寄存器中的最新数据搬运到指定的内存地址。
UART接收数据寄存器非空: UART接收到一个新字节并放入接收数据寄存器后,会发出触发信号。DMA收到后,立即将接收到的字节搬走,防止被下一个字节覆盖。
定时器溢出/比较匹配: 定时器达到预设值(溢出或匹配)时产生触发信号,DMA收到后执行搬运操作(例如,定期搬运数据到DAC输出)。
SPI/I2C传输完成: 当SPI或I2C完成发送或接收一个数据单元时发出的信号。
本质: 是外设请求DMA服务的信号。
🔋 DMA Trigger Output (触发输出)
从哪里输出? 信号从 DMA控制器输出。
发送给谁? 发送给另一个外设。
作用: 这个信号告诉另一个外设:“DMA已经完成了一个操作” 或者 “DMA已经准备好让你进行下一个操作了”。
目的: 用于协调多个外设之间或外设与DMA之间更复杂的时序关系,通常用于链式触发或同步。
典型场景:
链式触发 (Chaining): DMA传输A完成 ➡️ DMA控制器产生 Trigger Output ➡️ 这个输出信号连接到另一个外设B的 Trigger Input ➡️ 自动启动DMA传输B。
例子: DMA将ADC数据搬到一个内存缓冲区后,其 Trigger Output 触发另一个DMA通道,将处理好的数据从该缓冲区发送到DAC输出。
通知外设: DMA完成了一次传输(例如,传输完成中断TCI标志对应的硬件输出),通知相关外设可以进行下一步操作。
例子: DMA将一组数据从内存搬运到SPI发送数据寄存器后,DMA的 Trigger Output 可以连接到SPI的“开始传输”触发输入,告诉SPI:“数据已经准备好了,你现在可以开始发送了”。这样SPI的发送动作由DMA搬运完成精确触发。
同步外设: 在某些需要严格时序的场景下,一个外设的操作需要等待DMA完成某个动作。
本质: 是DMA控制器通知其他外设的信号。
🧩 总结:输入与输出的对比
特性 DMA Trigger Input (触发输入) DMA Trigger Output (触发输出)
信号流向 输入到 DMA控制器 从 DMA控制器输出
发送方 外设 (ADC, UART, Timer, SPI…) DMA控制器
接收方 DMA控制器 另一个外设 (可能是另一个DMA通道的外设)
核心作用 告诉DMA: “我有数据/准备好了,快干活!” 告诉其他外设: “我干完活了/准备好了,你可以开始了!”
主要目的 启动/继续 DMA传输 协调/链式操作 (触发下一个动作)
类比 外设给DMA的“服务请求”按钮 DMA给其他外设的“任务完成”指示灯或“启动”按钮
💡 为什么说“输入和输出都可以触发DMA”?
Trigger Input 直接触发DMA: 这是最常见和直接的方式。外设通过 Trigger Input 信号线直接向DMA控制器发出请求,DMA控制器收到后,如果配置正确且通道使能,就会启动或继续传输。这是输入触发DMA。
Trigger Output 间接触发DMA: Trigger Output 本身并不直接触发发出它的那个DMA控制器本身。但是,它可以连接到另一个外设的 Trigger Input 上。当这个 Trigger Output 信号有效时,它就触发了那个连接着的外设的 Trigger Input。如果那个外设的 Trigger Input 被配置为启动另一个DMA传输,那么:
DMA_A 的 Trigger Output 激活 ➡️ 触发外设B的 Trigger Input ➡️ 外设B的 Trigger Input 启动/继续了 DMA_B 的传输。
所以,Trigger Output 通过触发另一个外设的 Trigger Input,间接地触发了另一个DMA通道的传输。 这就是链式传输的核心机制。
📍 关键结论
Trigger Input 是DMA传输的“起点”或“推进器”信号,直接由外设驱动。
Trigger Output 是DMA传输完成或准备好后发出的“通知”或“接力棒”信号,用于协调后续操作(通常是触发另一个外设或DMA通道)。
Trigger Input 直接触发其连接到的DMA通道。
Trigger Output 间接触发其他DMA通道(通过先触发其他外设的Trigger Input)。
两者结合使用可以实现非常强大的、无需CPU干预的、由硬件事件精确驱动的外设间数据自动传输流水线(链式DMA)。
理解这两者的区别和联系对于设计高效的、基于DMA的数据采集、处理和传输系统至关重要。🛠️