ADC高速采样和转换(2):数据搬运
DMA相对于软件搬运(尤其是中断方式)节省的时间,主要体现在CPU时间的解放*上。对于16次搬运:*软件中断:CPU花费。
一、软件读取和DMA搬运的差别
问:对于stm32而言,adc采集,使用软件搬运采集值和使用dma搬运采集值,时间上能相差多久,软件搬运16次ad采集值大概耗时多久?
0. 问题分析
-
问题需要拆解几个层面
- 首先是软件搬运单次ADC值的基本耗时
- 然后考虑16次循环软件搬运的开销
- 最后对比DMA搬运16次的理论优势
- 除了核心搬运时间,上下文切换和中断延迟也会影响实际性能。
-
关于16次软件搬运的耗时估算,需要重点考虑:
- CPU主频、
- ADC数据位宽、
- 编译器优化等级。
-
最核心的是LDR指令的执行时间,在72MHz Cortex-M3上约14ns,但实际代码会有循环开销。保守估计单次搬运在50-100ns比较合理,这样16次大约0.8-1.6μs。不过这个时间在低速采样时影响不大,但如果是高频采样(比如1MHz以上),累积起来就很可观了。
-
DMA能节省多少时间。这里要强调DMA几乎是零CPU开销的本质优势——它不需要中断响应和现场保护,在后台完成传输。不过要注意DMA初始配置的代价,虽然是一次性的,但在某些实时启动场景也需要考虑。
在STM32上进行ADC采集时,使用软件(中断或轮询)搬运数据与使用DMA搬运数据,在时间效率上的差异非常显著。这种差异主要体现在CPU时间占用和系统响应性上,而不是单次采样转换时间本身。
1.核心差异:CPU 参与度
1.1 软件搬运 (中断/轮询)
中断方式: 每次ADC转换完成都会产生一个中断。CPU必须暂停当前任务,保存上下文,跳转到中断服务程序(ISR),从ADC数据寄存器(如ADCx->DR)读取数据,存储到目标数组,然后恢复上下文并返回。这个过程涉及多条指令和总线访问。
轮询方式: CPU需要不断检查(在while循环里)ADC状态寄存器(如ADCx->SR中的EOC标志位)。当检测到转换完成时,CPU读取数据寄存器并存储。这同样需要CPU持续参与检查状态和搬运数据。
1.2 DMA搬运
ADC转换完成信号直接触发DMA控制器。DMA控制器 在完全不需要CPU干预的情况下,自动将ADCx->DR寄存器中的数据搬运到指定的内存地址(如数组)。
CPU可以继续执行主程序代码或其他任务,只有在整个DMA传输完成(或半传输)时(如果需要),才可能产生一个中断通知CPU进行后续处理(如计算、发送)。
2.时间差异估算
2.1 单次数据搬运耗时 (软件 vs DMA)
2.1.1 软件搬运 (中断方式)
这是最耗时的。一次中断的响应和处理(包括上下文保存/恢复、状态检查、数据读取、数据存储)通常需要 几十到几百个CPU时钟周期。具体取决于:
- CPU内核类型 (Cortex-M0, M3, M4, M7 性能不同)
- CPU主频
- 编译器优化等级
- 中断嵌套情况
- 存储数据的位置 (SRAM速度较快,但访问也需要周期)。
保守估计:在典型的72MHz Cortex-M3/M4上,一个简单ADC中断服务程序(只做读取DR和存储到内存)可能消耗 20 - 100个周期。时间范围大约在 0.28μs (20/72M) 到 1.39μs (100/72M) 之间。
2.1.2 软件搬运 (轮询方式)
比中断方式稍好,避免了中断开销,但CPU必须持续轮询状态位。轮询循环本身(检查状态、条件跳转)也需要几个周期。当转换完成时,读取数据存储也需要周期。有效数据搬运本身可能比中断快一点(省去了上下文切换),但CPU在等待期间被完全占用做无用功,效率极低。单次有效操作可能在 10 - 50个周期 (0.14μs - 0.69μs @72MHz),但等待期间的CPU占用是100%。
2.1.3 DMA自动搬运
单次传输的开销对CPU来说是 0 周期! DMA控制器使用系统总线在后台完成数据从外设到内存的搬运。这个搬运操作本身也需要总线时间(通常1-几个周期,取决于总线架构和仲裁),但这完全不占用CPU时间。CPU可以并行执行其他代码。DMA配置是初始化时一次完成的。
2.2 搬运16次数据的耗时估算
2.2.1 软件中断16次
假设使用中断方式,每次中断处理(包括上下文切换、读DR、存内存)平均消耗 50个CPU周期 (一个比较合理的中间值),CPU主频为 72MHz。
- 单次中断处理时间 =
50 / 72MHz ≈ 0.694 μs - 16次中断处理时间 ≈
16 * 0.694 ≈ 11.11 μs
注意: 这只是CPU处理中断和搬运数据的时间,不包括以下时间:
- ADC本身的采样和转换时间(例如,如果采样周期+转换时间是1μs,那么16次转换本身需要至少16μs)。
- 中断延迟(从EOC置位到CPU开始执行ISR第一条指令的时间,受中断优先级和当前中断状态影响,可能几到几十个周期)。
- 其他更高优先级中断的抢占时间。
因此,在72MHz下,仅软件中断搬运16个ADC值,CPU就需要花费大约11微秒的时间来处理这些中断和数据移动。
2.2.2 软件轮询16次
如果使用轮询,CPU在等待16个转换完成期间几乎被完全占用(时间至少等于16个转换周期加上16次数据搬运时间),效率更低。
2.2.3 DMA搬运16次
CPU在16次传输过程中花费的时间 ≈ 0 μs (用于数据搬运本身),即不占用CPU,CPU只管使用数据。- DMA控制器在后台完成所有16次在后台完成所有16次搬运。整个DMA传输序列的总线时间可能只需要几十个周期(例如,16次读DR + 16次写内存,每次读写假设2-3个周期,总共64-96个周期,即 0.89μs - 1.33μs @72MHz),但这与CPU是并行的。
- 如果启用了DMA传输完成中断,在16次传输全部结束后,CPU会进入一次中断进行后续处理。这个中断的开销与软件方式的一次中断类似(几十个周期),但只有一次,而不是16次。
3. 软件任务的确定性
-
任务周期确定但响应最慢:如果是AD的单次、非扫描工作模式,那么要由软件控制AD启动的时刻,比如每1ms启动一次本通道的AD采集16次,即在这1ms内进行16次循环AD启动,然后对16个数据进行软件滤波和计算(计算耗时不多的话可以放到中断里,多的话就需要放到while循环里了),再将计算结果给到其他外设使用,比如给到DA外设。这个周期启动AD的好处就是能确定在每个时刻各个外设在干什么,有很好的确定性,但由于存在调度周期,也意味着没有达到对外界模拟量变化的最高响应速度。 -
任务周期不确定但响应最快:如果是AD的连续、扫描工作模式,并配合DMA搬运AD数据寄存器的值到SRAM,CPU在DMA搬运的同时可以直接使用搬运后的数据,进行计算,显然节省了搬运的操作。这样的话,响应速度就取决于CPU对数据的计算和处理(放到while循环里响应最快)时间了(假设DMA搬运耗时很低,CPU计算耗时高一些)。为了使得响应能够最快,AD设置成了连续模式,这也意味着软件里没有人为控制的任务周期,而是完全由硬件自身性能(采样、转换、搬运耗时)决定了一个任务执行周期,这也就是达到了响应的上限。所以说,这是这个不好的地方。 -
任务周期确定但响应较快:如果不是要求极致的响应速度,为了兼顾响应速度和任务周期的确定性,一般可以使用定时器去触发启动AD采样,这时AD可设置为单次、扫描模式,因此AD就成了周期进行采样,并且配合DMA搬运数据到SRAM,CPU无需参与,完全由这些外设自动完成,节省了CPU的资源,CPU只需专注于AD数据的计算和处理。
4. 关于DMA缓冲区配置
配置ADC为扫描连续模式,使用DMA循环传输,配置为3个通道,每个通道采样16次(总共48个转换)。DMA设置为双缓冲模式,每次传输48个样本(每个缓冲区48个样本)。这样其实就保证了DMA每次进行一轮,就按要求完成了一轮ADC的采集:3个通道各自采集16次。- 当DMA半传输完成中断(即24个样本,对应每个通道8次采样)时,处理前24个样本,但这里需要每个通道16次,所以需要等待全传输完成,所以说应修改为:
可以设置DMA缓冲区长度为96(每个通道32次采样),然后半缓冲区就是48个样本(每个通道16次)。这样,当半传输中断时,我们处理前48个样本(即每个通道16次),同时DMA继续填充后48个样本。 如果说3个通道里有一个通道1要求采集速度和响应速度很快,但另外两个响应慢一点没关系,那么采用这种3通道扫描的方式其实还不是最快的,因为要DMA搬运48次后才能使用ADC通道1的数据。最好的方式应该就是用2个ADC模块,一个给需要高速采样和快速响应的ADC通道1,并且可以配置为注入组,并且配置对应的DMA搬运;另一个给普通采样的ADC通道2和3,配置为规则组,如果DMA资源足够,则可以配置DMA,否则使用软件读取。
5. 总结与关键点
5.1 时间差
DMA相对于软件搬运(尤其是中断方式)节省的时间,主要体现在CPU时间的解放上。对于16次搬运:
- 软件中断:CPU花费 11μs (示例估算) 在中断处理和数据搬运上。
- DMA:CPU花费 0μs 在数据搬运上(只有一次可选的完成中断,开销很小)。
因此,DMA为CPU节省了大约11μs(在这个特定估算场景下)的时间去执行其他任务。 这个差值会随着采样次数的增加而线性增大。
5.2 系统影响
5.2.1 软件搬运
软件搬运(特别是高频中断)会显著增加CPU负载,可能导致:
- 主循环执行变慢,系统响应迟钝。
- 其他低优先级任务或中断被延迟或丢失。
- 在
高采样率或多通道采样时,CPU可能不堪重负,无法及时读取数据,导致ADC数据寄存器溢出丢失数据。
5.2.2 DMA优势
- 极低的CPU开销: 释放CPU处理能力。
- 确定性: DMA传输时间更可预测,
不受中断延迟和任务调度影响。 - 适合高速/连续采样: 轻松处理
高采样率、多通道扫描或连续模式的数据流。 - 降低功耗: CPU可以更多时间处于低功耗模式。
5.3 结论
对于STM32的ADC采集,使用DMA搬运数据相比软件搬运(尤其是中断方式)在时间效率上具有压倒性优势。软件中断搬运16次ADC值,CPU本身可能需要花费十几微秒量级的时间(具体取决于CPU速度和代码效率),并且会带来显著的中断开销和系统延迟。而DMA将此开销降低到几乎为零(仅一次可选的传输完成中断),允许CPU专注于其他任务,极大地提高了系统的整体效率和响应能力。在需要连续、高速或多通道ADC采集的应用中,强烈推荐使用DMA。
二、不使用规则组和注入组处理多通道AD采集
问:在不使用规则组和注入组的前提下,如何高速采样和搬运两个adc通道的数据,如果其中一个adc通道设置了连续采样且使用dma搬运,那么另一个adc通道该怎么采样,因为这两个adc通道实际上用的是同一个adc外设和对应的adc数据寄存器。一个通道进行连续采样相当于一直占用这个adc,是不是导致另一个通道无法使用了?每个通道至少采集16次作为滤波
0. 问题分析
规则组其实是最常用的多通道管理方式,突然禁用的话确实有点棘手。当ADC被一个通道的连续采样占用时,另一个通道怎么工作。这里的关键点是ADC的工作机制。STM32的ADC是单次转换的硬件,即使配置为连续模式,也只是在完成一次转换后立刻开始下一次,但同一时间只能处理一个通道。所以如果只用单个ADC实例,连续采样确实会霸占整个外设。接下来需要考虑替代方案。
-
第一种方案是
软件启动ADC+连续扫描规则组模式+ADC触发DMA启动+DMA循环模式搬运2次(自动重装载)。配置规则组两个通道,设置连续扫描+DMA,DMA设置为搬运2次即搬完2个ADC通道的数据后触发DMA中断。由于ADC是一直在连续转换,因此ADC会一直触发DMA搬运ADC数据,并且每搬运完成2次就触发一次DMA搬运完成中断。如果要每个通道都采集16次,这就需要用户设计程序逻辑,记录DMA搬运了16个循环,则表示各个通道采集了16次。规则组扫描模式才是解决多通道的标准方法。 -
第二种方案是用
定时器触发启动AD+单次扫描规则组模式+ADC触发DMA启动+DMA循环搬运2次(自动重装载)。设置TIM触发ADC启动,配置规则组有两个通道,触发一次就启动扫描采集一次AD两个通道,每个ADC通道转换完成后都触发DMA自动搬运2个通道的数据。这样需要ADC工作在单次模式,由外部触发控制启动采集的节奏,DMA自动搬运2个通道的数据。这种方法高效且不占CPU。如果要每个通道都采集16次,这就需要用户设计程序逻辑,记录DMA搬运了16个循环,则表示各个通道采集了16次。规则组扫描模式才是解决多通道的标准方法。- 补充介绍一点DMA的特点:
自动重装载即循环模式和DMA触发方式。开启了自动重装载功能后,每次搬运计数器减到0后会将搬运计数器自动重新装载会初始值即用户设置的DMA一轮的搬运次数,但是,并不是说搬运计数器不为0,DMA就会不停地工作,而是说还要有DMA启动触发信号才可以!比如说,现在ADC设置为连续扫描规则组模式,规则组内有2个ADC通道,那么DMA一轮搬运就需要设置为搬运2次,DMA的启动触发源需要设置为ADC转换完成,那么,ADC启动转换后先转换规则组里的第一个ADC通道,此通道转换完成后产生一个转换完成脉冲给到DMA,DMA则立即去搬运此时ADC数据寄存器的值到目标地址比如SRAM里,然后DMA搬运计数器自动减1(由2变为1),此时DMA就停止工作了,需要等待下一次启动指令。由于ADC为连续模式,因此ADC在通道1转换完成后立即开始通道2的转换,通道2转换完成后同样产生一个转换完成脉冲给到DMA,DMA开始搬运ADC数据寄存器的值到目标地址SRAM里,然后搬运计数器自动减1(由1变为0),DMA停止工作,并且如果DMA目标地址是自增的,那么此时DMA目标地址会恢复为最开始的目标地址,以方便开始下一轮的搬运工作。如果DMA没有设置自动重装载功能,那么DMA此时的搬运计数器为0,那么即使再来了ADC转换完成脉冲触发DMA,DMA也是无法开始工作的。如果DMA设置了自动重装载功能,那么此时搬运计数器自动恢复为0,但是DMA还不能开始工作,要等到ADC转换完成脉冲来到,DMA才能开始新一轮的搬运工作,这一轮的搬运,DMA的各个参数配置都恢复到和前一轮一模一样,包括搬运源地址和目标地址!
- 补充介绍一点DMA的特点:
-
第三种方案是用
软件启动AD+连续扫描规则组模式+定时器触发启动DMA+DMA循环搬运2次(自动重装载)。TIM触发DMA搬运2次数据,ADC设置为连续扫描模式,并且由软件在初始化阶段启动ADC通道采集,这样实现的是DMA定时搬运ADC通道数据,但是谁知道DMA启动时搬运的ADC数据是哪一个通道的呢,毕竟规则组里有多个ADC通道的,DMA是区分不出来的,因此这种方法不可行。 -
第四种方案是
手动软件切换AD通道+单次非扫描单通道模式+ADC触发DMA启动+DMA循环搬运16次(自动重装载)。初始化阶段启动AD单个通道的连续转换,DMA循环搬运16次后在DMA搬运完成中断里停止AD并修改AD通道号,进行下一个ADC通道的采集和搬运。但这样中断频率高,一次数据搬运就消耗十几个周期,在高速采样时切换ADC通道可能来不及,导致数据丢失。比如144kHz采样时中断间隔只有6.9us,而处理一个中断可能就需要1us左右,CPU负载会很高,风险太大。 -
第五种方案是用双ADC协同工作。
- 如果芯片支持,比如F4系列,可以让两个ADC各自独立分别采集不同ADC通道。
- 另一种则是双ADC协同工作提高采样率+扫描规则组+DMA循环搬运。
-
第六种方案是两个通道都用软件轮询。每次切通道启动转换,轮询等待完成。这样虽然能用但效率极低,CPU全耗在等待上,高速采样时不现实。
-
第七种方式是使用MCU的
ADC过采样功能即对于一个ADC通道相当于采集16次自动滤波将数据存到AD数据寄存器,这样的话DMA只需搬运一次即可,而无需采集16次并搬运16次再进行软件滤波。如果是3个ADC通道,DMA则只需搬运3次。
总结下来,最优解其实是方案二:定时器触发ADC启动+单次扫描规则组扫描+DMA或者方案二的改进型:软件触发ADC启动+连续扫描规则组+DMA。规则组扫描是STM32设计用来处理多通道的标准方式。如果不用规则组,方案四的中断切换虽然理论上可行,但速度和稳定性都很差,只能作为备选。如果无法使用规则组,几乎无法实现真正的高速双通道采集。
-
在不使用规则组(Regular Group)和注入组(Inject Group)的前提下,仅使用单个ADC实例高速同步采样两个通道并可靠搬运数据是极其困难甚至不可行的。
-
ADC硬件本身每次转换只能对一个通道进行采样。
当一个通道配置为连续转换模式并使用DMA时,它实质上垄断了ADC资源,使其连续不断地转换该单一通道。另一个通道几乎没有机会被转换(除非手动干预,但这会破坏连续性和高速性)。
1. 为什么“一个连续采样通道”会阻塞另一个通道?
1.1 硬件限制
- ADC内部只有一个采样保持电路(S&H)和一个转换器(SAR等)。同一时间只能对一个通道进行采样和转换。
1.2 连续模式机制
- 当ADC配置为连续转换模式(
CONT=1)时,一旦完成当前转换(无论是由软件启动、外部触发还是定时器触发启动的),它会立即自动启动下一次转换。转换的对象是最近一次配置的通道(或扫描序列中的第一个通道)。
1.3 DMA的角色
- DMA只是在后台搬运
ADC->DR寄存器中的数据,它不影响ADC转换器本身的工作流程。它只是ADC连续转换结果的搬运工。
1.4 结果分析
- ADC永远在忙碌地转换同一个通道(或扫描序列的第一个通道),没有空闲时间片让CPU或其他逻辑去改变通道设置并启动另一个通道的转换。另一个通道被“饿死”。
2. 可行的解决方案
既然禁用规则组和注入组极大限制了灵活性,要同时高速采样两个通道,必须寻求其他方法:
2.1 最优方案:连续转换+规则组扫描+DMA
方案: 使用规则组扫描(Scan Mode) + 连续转换模式(Continuous Mode) + DMA循环搬运。
配置:
- 将需要采样的两个通道(比如Ch0, Ch1)都配置到ADC规则序列中(例如Rank1=Ch0, Rank2=Ch1)。
- 启用ADC扫描模式(
SCAN=1)。 - 启用ADC连续转换模式(
CONT=1)。 - 配置DMA为循环模式(Circular Mode),目标缓冲区大小为2(或2的倍数)。触发源选择ADC外设。
- 启动ADC转换(
ADSTART或通过触发)。
工作原理:
- ADC会按照规则序列(Ch0 -> Ch1)自动连续循环转换,一直转换保证采样率最高。
- 每次序列转换完成(两个通道都转换完),
EOC标志置位(或EOS标志,如果有),触发DMA请求。 - DMA自动将
ADC->DR中的数据(依次是Ch0的值,然后是Ch1的值)搬运到目标内存数组(如adcResults, adcResults)。 - DMA在循环模式下,填满缓冲区后自动回到开头覆盖旧数据。
优点: 最高效,CPU零干预,真正的同步(通道间转换间隔仅由采样时间+转换时间决定),高速采样易实现(受限于ADC时钟和采样时间)。
关键: 这本质上是使用规则组扫描模式,这是STM32 ADC处理多通道的标准且最高效的方式。这是实现需求最直接、最可靠的方法。
2.2 常见方案:定时器触发 + 规则组扫描 + DMA
方案: 与方案1类似,但将连续转换模式(CONT=1)改为由定时器触发(Trigger)。
配置:
- 规则组配置同上(Ch0, Ch1)。
- 启用扫描模式(
SCAN=1)。 - 关闭连续转换(
CONT=0)。 - 选择ADC触发源为特定的定时器通道(如TIMx_CHy, TIMx_TRGO)。
- 配置DMA为循环模式,目标缓冲区大小>=2。
- 启动定时器(配置好所需的采样频率)。
工作原理:
- 定时器以固定频率(采样率)产生触发信号(如更新事件、捕获比较事件)。
- 每次触发信号到达,ADC启动一次规则序列转换(Ch0 -> Ch1)。
- 序列转换完成后,
EOC置位,触发DMA请求搬运两个通道的数据。 - 定时器下一次触发再来,重复上述过程。
- DMA循环搬运数据。
优点: 采样率由定时器精确控制(不受CPU影响),同样CPU零干预,同步性好。
关键: 仍然使用了规则组扫描模式。
2.3 手动切换通道 + 连续模式 + 中断/DMA (高难度,高风险,非主流)
方案: 手动切换通道 + 连续模式 + 中断/DMA (非常不推荐用于高速)。
工作原理:
1.初始化通道A为连续转换模式 + DMA。
2.在每次通道A转换完成中断(或DMA半传输/传输完成中断)中:
- 停止ADC转换 (
ADSTP)。 - 修改ADC通道选择寄存器 (
SQRx或CHSELR,取决于型号) 指向通道B。 - 启动ADC转换 (
ADSTART)。
3.在通道B转换完成中断中:
- 停止ADC转换。
- 修改通道选择寄存器指向通道A。
- 启动ADC转换。
4.如此循环往复。
- DMA需要配置为在每次转换完成时搬运
ADC->DR的数据(可能需要配合中断手动管理DMA目标地址,或者使用双缓冲)。
致命缺点:
- 切换开销巨大: 每次切换通道都需要停止ADC、修改配置、启动ADC。这些操作消耗大量CPU时间(几十到上百个周期)。
- 中断延迟不可控: 中断响应时间受系统负载、更高优先级中断影响,导致采样间隔抖动(Jitter)严重。
- 无法高速采样: 巨大的切换开销和中断延迟使得这种方法根本无法用于真正的高速采样(例如 > 10Ksps)。CPU可能被中断完全占用。
- 同步性差: 两个通道的采样点在时间上是交错的,不是同时的,且间隔不稳定。
- 复杂且易错: 代码逻辑复杂,时序难以保证。
结论:
- 强烈不推荐用于任何要求高速、稳定、同步采样的场景。仅作为理解ADC工作原理或极低速场景下的理论探讨。
2.4 使用双ADC模式 (如果MCU支持):
方案: 如果使用的STM32型号支持双ADC(如F4系列),且两个通道可以分配到不同的ADC实例上(例如ADC1 Ch0, ADC2 Ch0)。虽然每个ADC内部还是单路转换器,但两个ADC可以并行工作。
配置:
- 配置ADC1在连续转换模式+DMA采集通道A。
- 配置ADC2在连续转换模式+DMA采集通道B。
优点: 两个通道真正独立、同步(如果同时启动)且高速采样。
缺点: 占用两个ADC资源;需要硬件支持;同步启动需要配置(如联合模式或使用同一个触发源);DMA配置也需要两套。
关键: 这规避了单个ADC硬件只能转换一个通道的限制,但要求硬件支持和分配通道到不同的ADC上。没有使用规则组/注入组。
2.5 纯软件轮询 (最低效):
方案: 在循环中手动启动通道A单次转换 -> 轮询等待结束 -> 读数据 -> 手动启动通道B单次转换 -> 轮询等待结束 -> 读数据 -> 重复。
缺点: CPU利用率极高(接近100%用于等待和操作),采样率极低,同步性差(通道间有明显延迟)。
结论: 完全不适用于高速采样。
3. 结论
4.1 核心问题:
- 禁用规则组极大地限制了STM32 ADC处理多通道的能力。单个ADC硬件在同一时刻只能采样一个通道。连续转换模式+DMA必然独占ADC用于那个单一通道。
4.2 唯一可行的高效方案是使用规则组扫描模式:
- 方案1(连续扫描+DMA)或方案2(定时器触发扫描+DMA)是工业标准实践,能高效、同步、高速地搬运多个通道(包括2个)的ADC数据,且CPU开销极小。
4.3 规避方案
- 手动切换通道: 中断/延迟开销巨大,无法高速,不稳定。
- 双ADC: 需要硬件支持且占用额外资源。
- 纯软件轮询: 效率最低,仅适用于极低速。
因此,除非有极其特殊且无法妥协的理由,否则务必使用规则组扫描模式配合DMA来实现双通道(或多通道)的高速ADC数据采集。 这是最可靠、最高效、最符合STM32设计初衷的方法。如果坚持不使用规则组,则在单个ADC上实现两个通道的高速同步采样几乎是不可能的。
更多推荐



所有评论(0)