Stm32f4:DMA + ADC传输暂停

时间:2016-09-12 14:53:11

标签: microcontroller stm32 cortex-m3 firmware

在Stm32f4-Discovery板上我配置了三重ADC交错模式,DMA在循环模式下写入ADC数据2.一切正常,但我无法正常暂停传输以传输数据通过USART在缓冲区中(转换在外部中断转换函数内执行)。我正在尝试实现这样的算法:

  1. 初始化DMA和ADC
  2. 等待外部中断
  3. 暂停DMA传输
  4. 通过USART发送缓冲数据
  5. 恢复DMA传输,转到步骤2
  6. 我尝试过的一件事是

    DMA_Cmd(DMA2_Stream0, DISABLE);
    ADC_Cmd(ADC1, DISABLE); ADC_Cmd(ADC2, DISABLE); ADC_Cmd(ADC3, DISABLE);
    ... Send the buffered data over USART ...
    ADC_Cmd(ADC1, ENABLE); ADC_Cmd(ADC2, ENABLE); ADC_Cmd(ADC3, ENABLE);
    DMA_Cmd(DMA2_Stream0, ENABLE);
    

    那很好,但是在某些时候,DMA只是停留在第一位并且没有"移动"通过所有缓冲区数组。我还尝试过停止ADC的RCC时钟

     RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, DISABLE); //So on for ADC2 and ADC3
    

    但它也是如此,唯一的区别是第一种方法在某个时刻停止DMA传输(因此,有时它会暂停DMA),而第二种方法则停止DMA永远不会正常工作。

    我还在参考手册中读到了

      

    如果转换序列中断(例如,当发生DMA传输结束时),   必须首先在独立模式下配置多ADC序列发生器(位   在重新编程交错模式之前,DUAL [4:0] = 00000)。

    我已经尝试在暂停时将ADC设置为独立模式,然后在上述两种方法中将ADC设置为三重交错模式,但这并没有改变这种情况。

    所以,问题是 - 暂停DMA传输的正确方式是什么,以便我尝试通过USART发送的缓冲数据不会改变?

0 个答案:

没有答案