久芯网

STM32F42X ADC连续采样与DMA传输是否会与CPU读取冲突

avatar Bug_Mkaer 提问时间: 2023-07-23 14:12:09 / 未解决
若使能ADC的连续采样并使用DMA传递到指定数组,若CPU在进行同一个数据地址的读取时,恰好碰上DMA正在传输,导致此时读取出来的数据出现错误?
5个回答
  • avatar 网络孤客
    回答时间: 2023-07-23 14:44:23

    会,要采取一定措施。 如:DMA后,把数据立即转存;传递前半段,只允许范围后半段,半传递后,则只允许范围前半段。

  • avatar yklstudent
    回答时间: 2023-07-23 15:01:46

    接收完数据,可以触发中断关闭ADC+DMA,处理数据后再打开ADC+DMA

  • avatar xmshao
    回答时间: 2023-07-23 15:19:31

    因为CPU和DMA共同访问相关内存区发生访问竞争是正常的,你这里说的读取出来的数据出现错 误 如果是指因为发生访问竞争 导致读取的数据莫名地改变而发生错误是不会的, 但是 有可能发生读到的数据跟最新数据不一致的情况。那就要靠你的程序逻辑来保证了。

  • avatar butterflyspring
    回答时间: 2023-07-23 15:38:44

    这是个逻辑问题。通常在DMA半完成或完成中断里或中断后去读取数据。 当然如果不这样做,就有可能遇到CPU和DMA去同时访问一个地址,这时候会有仲裁。只是你的软件不会立刻知道当前的数据是新的还是旧的。

  • avatar Bug_Mkaer
    回答时间: 2023-07-23 15:59:36

    嗯嗯,关于处理数据时暂时关闭DMA这个动作没问题的,我的问题其实不是不知道怎么处理这个问题。主要是文档里没看到明确说明这一块的总线访问竞争机制,所以好奇。例如说原本的旧数据是0x12345678,现在DMA要更新0x9abcdef,如果CPU的读取与DMA的传输刚好撞上,数据总线响应哪一个?如果DMA传输了一般数据后,CPU要求读取数据,是CPU读取挂起等待DMA传完后再读取还是把当前数据读走?同理,DMA要求传输数据时撞上CPU正在读取或者写,那DMA是挂起等待还是直接开始传输?

会员中心 微信客服
客服
回到顶部