找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1411|回复: 18
打印 上一主题 下一主题
收起左侧

关于ADC+DMA的理解

  [复制链接]
跳转到指定楼层
楼主
ID:966089 发表于 2023-3-5 21:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
关于STM32单片机芯片 各位大佬,我对ADC的理解是所有的通道最终转换结果只能放到一个转换结果寄存器里,为了适应多通道ADC采样,一种方法是开启ADC中断,因为每一个通道转换结束都会触发中断,这样的话我只需要在每次中断里把本次通道转换的结果取出来就行,这样可以满足工作要求,但是频繁中断会降低CPU的运行效率,所以另一种方法使用DMA,不使用ADC中断,假设有3个规则通道,那么在通道1转换结束,DMA将结果转移到目标地址,然后依次循环到通道3结束,如果开启了DMA传输完成中断,DMA则进入中断处理采样数据。如果按照上述的理解,是不是说多通道里面ADC只需要DMA就好了,甚至数据处理也可以放到DMA中断进行,那么ADC中断是不是显得没有必要,ADC中断的意义是不是没有那么大?希望大佬们能解决我的疑惑,批评指正!
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:71233 发表于 2023-3-6 08:53 | 只看该作者
DMA不只是用于ADC,如果用户认为其他模块使用DMA,ADC仍然使用中断(中断优先级为后),那该怎么办?ADC中断应该不能删除吧,我认为。
回复

使用道具 举报

板凳
ID:384109 发表于 2023-3-6 09:23 | 只看该作者
DMA没那么神奇,DMA只是一个传输通道而已,很多情况下使用DMA和不使用DMA效果没什么不同,DMA只是在一些特定的应用里使用才会体现效果
回复

使用道具 举报

地板
ID:123289 发表于 2023-3-6 11:24 | 只看该作者
你对DMA的目的及实现的方案(与ADC无关),还需进一步了解,其后就明白了。
CPU中增加DMA功能是为了什么呢?
回复

使用道具 举报

5#
ID:966089 发表于 2023-3-6 11:30 | 只看该作者
lmn2005 发表于 2023-3-6 08:53
DMA不只是用于ADC,如果用户认为其他模块使用DMA,ADC仍然使用中断(中断优先级为后),那该怎么办?ADC中 ...

感谢您的回复!
回复

使用道具 举报

6#
ID:966089 发表于 2023-3-6 11:31 | 只看该作者
人中狼 发表于 2023-3-6 09:23
DMA没那么神奇,DMA只是一个传输通道而已,很多情况下使用DMA和不使用DMA效果没什么不同,DMA只是在一些特 ...

感谢您的回复!
回复

使用道具 举报

7#
ID:401564 发表于 2023-3-6 13:03 | 只看该作者
DMA和中断是两个不同的东西
DMA是不占用主程序的时间,你做你的,我做我的
中断是可以打断主程序的操作,有些事件是很重要的事件,它必需要有很高的等级,这个时候就要用到中断了
回复

使用道具 举报

8#
ID:586261 发表于 2023-3-7 11:58 | 只看该作者
ADC规则通道序列的某一通道转换结束,转换结果被写入数据寄存器,DMA检测到有新数据产生,就按照配置信息把数据传送到设定存储器,如果配置了DMA完成中断,则产生中断,CPU转入DMA中断处理程序。中断处理程序应当是快进快出的。
回复

使用道具 举报

9#
ID:883242 发表于 2023-3-7 22:06 | 只看该作者
DMA可以自动的把数据从ADC结果寄存器搬运到RAM里面,至于处理数据也能用DMA完成那是你想得太多了。
回复

使用道具 举报

10#
ID:525244 发表于 2023-3-8 13:12 来自手机 | 只看该作者
ADC中断读取,每读取100次,15个通道。MCU一共进入1500次中断。如果速度不快,或者是没有用到其它高频率的定时器,没问题。如果有高频次中断,单片机就会频繁进入各种中断,导致单片机效率不高!如果用DMA,只需要设置DMA读取ADC。所有通道都读完了(前边的1500次),并且算出平均值,DNA申请一次中断,MCU只需要取出所有通道ADC的平均值,直接使用就行!就像两个CPU,一个处理你的任务,一个帮助调度单片机硬件。
回复

使用道具 举报

11#
ID:469589 发表于 2023-3-8 13:43 | 只看该作者
不对!
DMA传输的ADC,实际上换是需要ADC中断处理的,即使DMA中断是打开的,也不能在DMA中断中处理结果,只能在ADC完成中断中处理!!!
这个我做过试验。好像DMA中断没有用,但实际也不能关闭,否则ADC也无法进行。
回复

使用道具 举报

12#
ID:94031 发表于 2023-3-8 14:37 | 只看该作者
单片机要有DMA功能,里面要加很多电路,实现的难度与成本会增加,所以不是每种单片机都有DMA_ADC功能,所以不可能不要ADC中断,另外实时性DMA_ADC也不如ADC中断。
回复

使用道具 举报

13#
ID:644039 发表于 2023-3-8 15:48 | 只看该作者
在dma通道有限的情况下,adc中断就起到了作用
回复

使用道具 举报

14#
ID:401564 发表于 2023-3-8 21:52 | 只看该作者
GlenXu 发表于 2023-3-8 13:43
不对!
DMA传输的ADC,实际上换是需要ADC中断处理的,即使DMA中断是打开的,也不能在DMA中断中处理结果, ...

不需要!设定好缓冲地址,DMA的结果就会一直是最近几次的结果
回复

使用道具 举报

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

使用道具 举报

16#
ID:146878 发表于 2023-3-9 12:48 | 只看该作者
如果需要多通道轮询采样,那DMA没什么必要,要切换通道必须要CPU去做。
回复

使用道具 举报

17#
ID:668004 发表于 2023-3-14 18:44 | 只看该作者
yuxuesuixing 发表于 2023-3-9 11:04
DMA你还没仔细理解透彻,他是相当于独立于cpu外的一个传输数据的外设,你可以理解为他只能传输数据的独立CP ...

这位兄弟   大师级别
回复

使用道具 举报

18#
ID:966089 发表于 2023-3-16 09:55 | 只看该作者
yuxuesuixing 发表于 2023-3-9 11:04
DMA你还没仔细理解透彻,他是相当于独立于cpu外的一个传输数据的外设,你可以理解为他只能传输数据的独立CP ...

感谢您的回复
回复

使用道具 举报

19#
ID:966089 发表于 2023-3-16 09:58 | 只看该作者
Hephaestus 发表于 2023-3-7 22:06
DMA可以自动的把数据从ADC结果寄存器搬运到RAM里面,至于处理数据也能用DMA完成那是你想得太多了。

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

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表