STM32F103系列微控制器中的ADC注入通道确实不支持DMA传输,这是由其硬件架构和设计目标决定的。主要原因如下:
-
设计定位与优先级不同:
-
规则通道: 设计用于常规、顺序或扫描模式的数据采集。它们通常处理多路信号,需要高效地将批量数据传输到内存,这正是DMA的强项。规则通道转换完成事件(EOC)可以触发DMA请求。
-
注入通道: 设计为高优先级、可抢占式的通道。它们用于在紧急事件(如过压、过流、定时器触发、外部中断)发生时,立即打断正在进行的规则通道转换,插入一个或多个通道的转换。其核心目标是低延迟响应,而不是批量数据传输。注入通道转换完成事件(JEOC)只能触发中断,不能触发DMA请求。
-
-
硬件架构限制:
-
STM32F103的ADC模块内部结构明确规定,只有规则通道组转换完成时,才会产生一个DMA请求信号(如果DMA已使能)。
-
注入通道组没有连接到DMA控制器的硬件路径。 当注入通道转换完成时,它只能设置
JEOC(注入通道转换结束)标志位并产生中断(如果使能),但没有任何机制让这个事件去触发DMA控制器启动一次传输。
-
-
响应方式的需求:
-
注入通道通常用于需要立即软件响应的关键事件。例如,在电机控制中检测到过流时,注入通道转换完成产生中断,中断服务程序(ISR)可以立即读取注入通道数据寄存器(
ADC_JDRx)并采取紧急措施(如关闭PWM)。这种场景下,中断的低延迟响应比后台DMA传输更重要。 -
DMA传输虽然不占用CPU,但它本身有一定的配置和仲裁延迟。对于需要“立即行动”的关键安全事件,等待DMA传输完成后再由CPU处理可能不够快。
-
-
数据量与处理方式:
-
规则通道通常配置为转换多个通道(甚至循环扫描),每次转换完成都触发一次DMA,将单个数据点传输到内存数组。这避免了CPU频繁被中断。
-
注入通道一次转换通常只涉及1到4个通道(取决于ADC)。数据量很小,在中断服务程序中直接读取这少数几个
ADC_JDRx寄存器对CPU的开销非常有限。使用DMA来传输这1-4个字节的数据,其设置和启动的开销相对于直接读取寄存器来说可能并不划算,甚至可能更慢。
-
-
工作流程的复杂性:
-
注入通道的抢占特性使得其转换时机不确定(可能在任何规则通道转换期间被触发)。如果支持DMA,需要设计更复杂的机制来处理DMA传输的同步、可能的冲突(如注入DMA请求打断了正在进行的规则通道DMA传输)以及确保数据存储位置的正确性(注入数据放在哪里?如何与规则数据区分?)。硬件上不支持DMA简化了这个问题,强制要求软件在中断中处理注入数据,逻辑更清晰可控。
-
总结:
STM32F103 ADC注入通道不支持DMA,根本原因是其设计目标和硬件架构决定的:
-
核心目标: 实现最低延迟的、可抢占的高优先级转换,服务于需要立即软件响应的关键事件。
-
实现方式: 硬件上只提供
JEOC中断信号,不提供触发DMA请求的机制。 -
适用场景: 数据量小,在中断中直接读取寄存器效率足够且响应最快。
-
简化设计: 避免了因注入通道的异步抢占特性带来的DMA管理复杂性。
因此,如果你需要在STM32F103上使用注入通道,就必须在注入转换完成中断服务程序(ISR)中手动读取ADC_JDR1, ADC_JDR2, ADC_JDR3, ADC_JDR4寄存器来获取转换结果。对于需要DMA的批量数据传输场景,应使用规则通道。如果应用既需要注入通道的抢占特性,又需要将注入数据通过DMA传输(例如记录多次注入事件),则需要在注入中断中手动将数据写入一个缓冲区(或队列),然后启动一个独立的(非ADC触发的)DMA传输或由另一个事件(如定时器)触发的DMA来搬运这个缓冲区。但这会增加软件复杂性和一定的延迟。
1529

被折叠的 条评论
为什么被折叠?



