STM32F103 ADC注入通道不支持DMA原因

STM32F103系列微控制器中的ADC注入通道确实不支持DMA传输,这是由其硬件架构和设计目标决定的。主要原因如下:

  1. 设计定位与优先级不同:

    • 规则通道: 设计用于常规、顺序或扫描模式的数据采集。它们通常处理多路信号,需要高效地将批量数据传输到内存,这正是DMA的强项。规则通道转换完成事件(EOC)可以触发DMA请求。

    • 注入通道: 设计为高优先级、可抢占式的通道。它们用于在紧急事件(如过压、过流、定时器触发、外部中断)发生时,立即打断正在进行的规则通道转换,插入一个或多个通道的转换。其核心目标是低延迟响应,而不是批量数据传输。注入通道转换完成事件(JEOC)只能触发中断,不能触发DMA请求。

  2. 硬件架构限制:

    • STM32F103的ADC模块内部结构明确规定,只有规则通道组转换完成时,才会产生一个DMA请求信号(如果DMA已使能)。

    • 注入通道组没有连接到DMA控制器的硬件路径。 当注入通道转换完成时,它只能设置JEOC(注入通道转换结束)标志位并产生中断(如果使能),但没有任何机制让这个事件去触发DMA控制器启动一次传输。

  3. 响应方式的需求:

    • 注入通道通常用于需要立即软件响应的关键事件。例如,在电机控制中检测到过流时,注入通道转换完成产生中断,中断服务程序(ISR)可以立即读取注入通道数据寄存器(ADC_JDRx)并采取紧急措施(如关闭PWM)。这种场景下,中断的低延迟响应比后台DMA传输更重要

    • DMA传输虽然不占用CPU,但它本身有一定的配置和仲裁延迟。对于需要“立即行动”的关键安全事件,等待DMA传输完成后再由CPU处理可能不够快。

  4. 数据量与处理方式:

    • 规则通道通常配置为转换多个通道(甚至循环扫描),每次转换完成都触发一次DMA,将单个数据点传输到内存数组。这避免了CPU频繁被中断。

    • 注入通道一次转换通常只涉及1到4个通道(取决于ADC)。数据量很小,在中断服务程序中直接读取这少数几个ADC_JDRx寄存器对CPU的开销非常有限。使用DMA来传输这1-4个字节的数据,其设置和启动的开销相对于直接读取寄存器来说可能并不划算,甚至可能更慢。

  5. 工作流程的复杂性:

    • 注入通道的抢占特性使得其转换时机不确定(可能在任何规则通道转换期间被触发)。如果支持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来搬运这个缓冲区。但这会增加软件复杂性和一定的延迟。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值