标题: 关于ADC+DMA的理解 [打印本页]

作者: 菜菜的周某人    时间: 2023-3-5 21:34
标题: 关于ADC+DMA的理解
关于STM32单片机芯片 各位大佬,我对ADC的理解是所有的通道最终转换结果只能放到一个转换结果寄存器里,为了适应多通道ADC采样,一种方法是开启ADC中断,因为每一个通道转换结束都会触发中断,这样的话我只需要在每次中断里把本次通道转换的结果取出来就行,这样可以满足工作要求,但是频繁中断会降低CPU的运行效率,所以另一种方法使用DMA,不使用ADC中断,假设有3个规则通道,那么在通道1转换结束,DMA将结果转移到目标地址,然后依次循环到通道3结束,如果开启了DMA传输完成中断,DMA则进入中断处理采样数据。如果按照上述的理解,是不是说多通道里面ADC只需要DMA就好了,甚至数据处理也可以放到DMA中断进行,那么ADC中断是不是显得没有必要,ADC中断的意义是不是没有那么大?希望大佬们能解决我的疑惑,批评指正!

作者: lmn2005    时间: 2023-3-6 08:53
DMA不只是用于ADC,如果用户认为其他模块使用DMA,ADC仍然使用中断(中断优先级为后),那该怎么办?ADC中断应该不能删除吧,我认为。
作者: 人中狼    时间: 2023-3-6 09:23
DMA没那么神奇,DMA只是一个传输通道而已,很多情况下使用DMA和不使用DMA效果没什么不同,DMA只是在一些特定的应用里使用才会体现效果
作者: yzwzfyz    时间: 2023-3-6 11:24
你对DMA的目的及实现的方案(与ADC无关),还需进一步了解,其后就明白了。
CPU中增加DMA功能是为了什么呢?
作者: 菜菜的周某人    时间: 2023-3-6 11:30
lmn2005 发表于 2023-3-6 08:53
DMA不只是用于ADC,如果用户认为其他模块使用DMA,ADC仍然使用中断(中断优先级为后),那该怎么办?ADC中 ...

感谢您的回复!
作者: 菜菜的周某人    时间: 2023-3-6 11:31
人中狼 发表于 2023-3-6 09:23
DMA没那么神奇,DMA只是一个传输通道而已,很多情况下使用DMA和不使用DMA效果没什么不同,DMA只是在一些特 ...

感谢您的回复!
作者: Y_G_G    时间: 2023-3-6 13:03
DMA和中断是两个不同的东西
DMA是不占用主程序的时间,你做你的,我做我的
中断是可以打断主程序的操作,有些事件是很重要的事件,它必需要有很高的等级,这个时候就要用到中断了
作者: renstone    时间: 2023-3-7 11:58
ADC规则通道序列的某一通道转换结束,转换结果被写入数据寄存器,DMA检测到有新数据产生,就按照配置信息把数据传送到设定存储器,如果配置了DMA完成中断,则产生中断,CPU转入DMA中断处理程序。中断处理程序应当是快进快出的。
作者: Hephaestus    时间: 2023-3-7 22:06
DMA可以自动的把数据从ADC结果寄存器搬运到RAM里面,至于处理数据也能用DMA完成那是你想得太多了。
作者: zgrfox110    时间: 2023-3-8 13:12
ADC中断读取,每读取100次,15个通道。MCU一共进入1500次中断。如果速度不快,或者是没有用到其它高频率的定时器,没问题。如果有高频次中断,单片机就会频繁进入各种中断,导致单片机效率不高!如果用DMA,只需要设置DMA读取ADC。所有通道都读完了(前边的1500次),并且算出平均值,DNA申请一次中断,MCU只需要取出所有通道ADC的平均值,直接使用就行!就像两个CPU,一个处理你的任务,一个帮助调度单片机硬件。
作者: GlenXu    时间: 2023-3-8 13:43
不对!
DMA传输的ADC,实际上换是需要ADC中断处理的,即使DMA中断是打开的,也不能在DMA中断中处理结果,只能在ADC完成中断中处理!!!
这个我做过试验。好像DMA中断没有用,但实际也不能关闭,否则ADC也无法进行。
作者: xuyaqi    时间: 2023-3-8 14:37
单片机要有DMA功能,里面要加很多电路,实现的难度与成本会增加,所以不是每种单片机都有DMA_ADC功能,所以不可能不要ADC中断,另外实时性DMA_ADC也不如ADC中断。
作者: 多少积分    时间: 2023-3-8 15:48
在dma通道有限的情况下,adc中断就起到了作用
作者: Y_G_G    时间: 2023-3-8 21:52
GlenXu 发表于 2023-3-8 13:43
不对!
DMA传输的ADC,实际上换是需要ADC中断处理的,即使DMA中断是打开的,也不能在DMA中断中处理结果, ...

不需要!设定好缓冲地址,DMA的结果就会一直是最近几次的结果
作者: yuxuesuixing    时间: 2023-3-9 11:04
DMA你还没仔细理解透彻,他是相当于独立于cpu外的一个传输数据的外设,你可以理解为他只能传输数据的独立CPU,你设定好了他就自己传输数据。
它仅适合大量数据传输,数据量越大他效果越明显,你一个字节从串口搬到内存,也不过十几个时钟周期,并不浪费时间,但是量一大就明显了,频繁的中断入栈出栈消耗太多cpu时间,使用DMA主要就是节约这部分时间(中断出入栈)。
假设外设自带fifo,比如spi可以一次存1K的数据,你给屏幕写数据,就一次性写到spi里,大约消耗 2K个时钟周期就够了,这个硬件fifo就相当于不能编程的dma了,而现在你有了一个可以任意设置方向缓存大小的dma,是不是更完美了呢? 有的人说我喜欢硬件fifo,给我装上!好的 四十个外设每人1Kfifo好 还是把这40k放到主内存里,外设用dma操控好?
少量的数据也能用dma,只是编程更复杂而已,也没啥问题

作者: pdwdzz    时间: 2023-3-9 12:48
如果需要多通道轮询采样,那DMA没什么必要,要切换通道必须要CPU去做。
作者: QWE4562012    时间: 2023-3-14 18:44
yuxuesuixing 发表于 2023-3-9 11:04
DMA你还没仔细理解透彻,他是相当于独立于cpu外的一个传输数据的外设,你可以理解为他只能传输数据的独立CP ...

这位兄弟   大师级别
作者: 菜菜的周某人    时间: 2023-3-16 09:55
yuxuesuixing 发表于 2023-3-9 11:04
DMA你还没仔细理解透彻,他是相当于独立于cpu外的一个传输数据的外设,你可以理解为他只能传输数据的独立CP ...

感谢您的回复
作者: 菜菜的周某人    时间: 2023-3-16 09:58
Hephaestus 发表于 2023-3-7 22:06
DMA可以自动的把数据从ADC结果寄存器搬运到RAM里面,至于处理数据也能用DMA完成那是你想得太多了。

老哥,我说的是在DMA中断程序里让CPU切入进行处理采样数据,DMA传输中当然不能处理数据了,这个我知道,你看错了。感谢您的回复!




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1