打印
[应用相关]

STM32的ADC1+ADC3 16路采集 DMA传输 数据不错位

[复制链接]
1974|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
磨砂|  楼主 | 2018-11-13 11:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1) ADC多通道采集:(多通道采集必须用扫描模式,扫描模式时规则组的通道共用一个寄存器,so必须用DMA传输;为防止数据错位,不能用连续模式,而应在查询或中断中先关闭ADC转换,再开启ADC转换)so应采用扫描、非连续的方式、DMA正常模式,DMA的EOC中断或查询;

上述的配置下,ADC运行流程如下:

每个规则通道采集之后,每个ADC_DR会更新,这个更新会启动一次DMA,同时会产生EOC,然后DMA会传输此数据,DMA的传输会清除EOC标志,然后DMA的传输量计数器--,so,每一组规则通道转换完成后也不会产生EOC(详情看英文版STM32手册V15版本-Page220,而非V9版本),so利用这个EOC产生ADC中断或查询时,标志位已为RESET,so根本就办不到,但可利用DMA正常模式,DMA_EOC标志被置位在中断或查询中ADC转换先关闭,对应的DMACmd关闭,然后重新写入DMA的传输数据量CNDTR,再打开DMACmd,再清除DMA标志位,再打开ADC转换,同时,存储模拟量的变量或数组需要用volatile修饰

DMA查询的代码如下

   if(DMA_GetFlagStatus(DMA1_FLAG_TC1)!=RESET)       //ÅжÏͨµÀ1´«ÊäÍê³É

   {

            ADC_SoftwareStartConvCmd(ADC1,DISABLE);

            DMA_Cmd(DMA1_Channel1,DISABLE);

                    DMA_SetCurrDataCounter(ADC1_DMA_CHANNLE,ADC1_DMA_BUFFER_SIZE);    DMA_Cmd(DMA1_Channel1,ENABLE);

                   DMA_ClearFlag(DMA1_FLAG_TC1);//

            ADC_SoftwareStartConvCmd(ADC1,ENABLE);

    }

同时也可以ADC1、ADC3同时使用,ADC3利用PF6-9,可复用为Channel4-7,页要为扫描模式,非连续模式;代码如下:

ADC_InitStructure.ADC_NbrOfChannel = 4;

ADC_Init(ADC3, &ADC_InitStructure);

ADC_RegularChannelConfig(ADC3,ADC_Channel_4,1,ADC_SampleTime_239Cycles5);

         ADC_RegularChannelConfig(ADC3,ADC_Channel_5, 2, ADC_SampleTime_239Cycles5 );           ADC_RegularChannelConfig(ADC3,ADC_Channel_6, 3, ADC_SampleTime_239Cycles5 );

ADC_RegularChannelConfig(ADC3, ADC_Channel_7, 4,ADC_SampleTime_239Cycles5 );

         ADC_DMACmd(ADC3, ENABLE);

         ADC_Cmd(ADC3,ENABLE);   

         ADC_ResetCalibration(ADC3);      

         while(ADC_GetResetCalibrationStatus(ADC3));   

         ADC_StartCalibration(ADC3);

         while(ADC_GetCalibrationStatus(ADC3));     



  ADC_SoftwareStartConvCmd(ADC3, ENABLE);  




沙发
mmuuss586| | 2018-12-23 19:59 | 只看该作者
感谢分享;

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

94

主题

4126

帖子

2

粉丝