搜索
bottom↓
回复: 23

STM32 ADC使用DMA到缓冲区,同时MCU去读;是否存在冲突

[复制链接]

出0入8汤圆

发表于 2020-10-20 09:40:07 | 显示全部楼层 |阅读模式
STM32 ADC使用DMA一直传输到缓冲区,同时MCU不定时去读缓冲区;是否存在冲突?
比如缓冲区是uint16_t类型的,MCU读了8 bits时DMA重新写入数据了,接着MCU读剩余的8 bits;会出现这种情况吗?

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出330入0汤圆

发表于 2020-10-20 09:46:01 来自手机 | 显示全部楼层
在读之前查一下DMA的状态即可避免冲突

出0入0汤圆

发表于 2020-10-20 10:32:33 | 显示全部楼层
直接读有风险

出20入0汤圆

发表于 2020-10-20 10:37:21 | 显示全部楼层
为什么有风险呢?
除非你读的时候,数据还没写入缓冲区,是无效数据,又或者你读的那一个地址刚好DMA操作

出0入4汤圆

发表于 2020-10-20 12:57:38 | 显示全部楼层
有总线仲裁的。。。

出0入0汤圆

发表于 2020-10-20 13:22:15 | 显示全部楼层
如果你是读正在写入的当前单元,那是写软件的问题。。。 不然哪来的冲突。

出20入186汤圆

发表于 2020-10-20 13:24:05 | 显示全部楼层
没有任何问题,可以放心读,

出425入0汤圆

发表于 2020-10-20 14:19:17 | 显示全部楼层
我是这么操作的。就是开着DMA后,CPU就不再参与了,需要数据就去缓冲区读取。没有发现问题。

出0入0汤圆

发表于 2020-10-20 14:26:21 | 显示全部楼层
双缓冲交替读写

出15入178汤圆

发表于 2020-10-20 16:39:20 | 显示全部楼层
有概率,出现了也不会有问题,ADC采样值变化不会很大(如果是拿来取平均用的话)

出0入4汤圆

发表于 2020-10-20 16:42:13 | 显示全部楼层
应该是没有问题的。如果担心的话可以内存里面用2个u16, DMA循环模式。读的时候读前一个。

出0入0汤圆

发表于 2020-10-20 17:33:07 | 显示全部楼层
不会有冲突,只要确保ADC数据位 与 DMA数据宽度要一致。
1. ADC 启动序列转换 并 开DMA中断
2. DMA中断 置位信号量(确保数据完整)
3. 轮询信号量,取出缓冲区数据使用。

出0入8汤圆

 楼主| 发表于 2020-10-20 22:49:21 | 显示全部楼层
直接在DMA完成中断拷贝一份到缓冲区去

出0入0汤圆

发表于 2020-10-21 07:40:56 | 显示全部楼层
有总线仲裁,不会有问题的

出0入4汤圆

发表于 2020-10-21 09:11:03 | 显示全部楼层
没有任何问题,可以放心读,+1

出0入0汤圆

发表于 2020-10-21 09:30:08 | 显示全部楼层
一次不能直接读16位吗

出0入4汤圆

发表于 2020-10-21 09:46:59 | 显示全部楼层
STM32是一次性读32位的,不会有问题,经常这样用。

出0入0汤圆

发表于 2020-10-22 00:31:46 | 显示全部楼层
没事的,跑了好几年的了

出0入0汤圆

发表于 2020-10-24 10:10:25 | 显示全部楼层
之前一直用STM32F0DMA从没遇到过问题。最近用STM32F103Z,DMA一开起来,跑着跑着就hardfault,看了report,老是提示bus fault.奇怪的很。各位知道啥情况不。

出0入0汤圆

发表于 2020-10-24 10:16:01 | 显示全部楼层
本帖最后由 Frank.Dong 于 2020-10-24 10:17 编辑

还有给问题,ADC多通道 DMA开起来,内存存放不是按配置摆放吗?  实际有错位的情况,不知道是不是我理解有问题。
    ADC_RegularChannelConfig(ADC1, ADC_Channel_10,1, ADC_SampleTime_239Cycles5);//Motor C2       按我理解应该放在内存第0个位置,实际放在内存第1个位置
    ADC_RegularChannelConfig(ADC1, ADC_Channel_11,2, ADC_SampleTime_239Cycles5);//Motor D1       按我理解应该放在内存第1个位置,实际放在内存第2个位置
    ADC_RegularChannelConfig(ADC1, ADC_Channel_12,3, ADC_SampleTime_239Cycles5);//Motor D2
    ADC_RegularChannelConfig(ADC1, ADC_Channel_13,4, ADC_SampleTime_239Cycles5);//Motor E1
    ADC_RegularChannelConfig(ADC1, ADC_Channel_0 ,5, ADC_SampleTime_239Cycles5);//Motor E2        按我理解应该放在内存第4个位置,实际放在内存第0个位置

出0入0汤圆

发表于 2020-10-24 10:37:13 | 显示全部楼层
没任何风险,只是数据可能老旧,不过大多数时候这不是问题

出0入8汤圆

 楼主| 发表于 2020-10-24 10:41:23 | 显示全部楼层
谢谢各位的指点

出0入0汤圆

发表于 2020-10-24 11:10:08 | 显示全部楼层
拆分的总线操作会存在潜在的问题,原子操作不会有这个问题

以前就有过讨论,cm3的位带操作寄存器,是拆分总线操作完成的,并且没有锁住总线
而外设更新寄存器就可能插入在这个操作中间,就会导致问题,这个是真正bug

出0入0汤圆

发表于 2020-10-24 18:12:57 | 显示全部楼层
直接读没问题的,不放心可以读两遍对比,不同再读一遍
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-27 00:14

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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