ADC DMA重启后通道混乱问题怎么解决

2019-10-16 06:13发布

大致是这样,2个通道,按键按一下,重新采集一次数据
ADC工作在多通道连续模式
DMA 正常缓冲模式
我用查询方式等待DMA数据满,然后关DMA,ADC
有按键按下在重启DMA, ADC,刷新数据
问题是两个通道数据总是乱,难道ADC重启后的转换通道接着上次停止的下一个来,不从第一通道重新开始?
怎么办?貌似重新初始化ADC也不行啊

ADC核心配置:
        ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;        //ADC工作模式:ADC1和ADC2工作在独立模式
        ADC_InitStructure.ADC_ScanConvMode = ENABLE;        //多通道扫描模式
        ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;        //连续转换模式
        ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;        //转换由软件而不是外部触发启动
        ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;        //ADC数据右对齐
        ADC_InitStructure.ADC_NbrOfChannel = 2;        //顺序进行规则转换的ADC通道的数目
        ADC_Init(ADC1, &ADC_InitStructure);        //根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器  

DMA核心配置:
       DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;  //工作在正常缓存模式


查询等待转换完成,关闭ADC、DMA:
        DMA_Cmd(DMA1_Channel1, ENABLE); //启动DMA通道
        ADC_SoftwareStartConvCmd(ADC1, ENABLE);                //使能指定的ADC1的软件转换启动功能
        while(!(DMA_GetFlagStatus(DMA1_FLAG_TC1)));//等待DMA1传输完成,即ADC转换完成
        DMA_Cmd(DMA1_Channel1, DISABLE); //关闭DMA通道
        ADC_SoftwareStartConvCmd(ADC1, DISABLE);                //关闭转换
        DMA_ClearFlag(DMA1_FLAG_TC1);//清除DMA转换完成标志位


重启ADC、DMA:
        DMA_SetCurrDataCounter(DMA1_Channel1, N*M);//重设DMA计数长度, 重启DMA
        DMA_Cmd(DMA1_Channel1, ENABLE); //启动DMA通道
        ADC_SoftwareStartConvCmd(ADC1, ENABLE);        //使能指定的ADC1的软件转换启动功能
        while(!(DMA_GetFlagStatus(DMA1_FLAG_TC1)));//等待DMA1传输完成,即ADC转换完成
        DMA_Cmd(DMA1_Channel1, DISABLE); //关闭DMA通道
        ADC_SoftwareStartConvCmd(ADC1, DISABLE);                //关闭转换
        DMA_ClearFlag(DMA1_FLAG_TC1);//清除DMA转换完成标志位

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。