OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2926|回复: 3

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

[复制链接]

6

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2016-11-24
在线时间
12 小时
发表于 2016-11-25 13:09:07 | 显示全部楼层 |阅读模式
1金钱
大致是这样,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转换完成标志位

最佳答案

查看完整内容[请看2#楼]

试了好久,网上找了找,貌似先关连续转换,等待转换完成 下次启动转换前,再设置连续转换,通道不乱了 /* Disable the selected ADC CONT */ ADCx->CR2 &=~(1
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2016-11-24
在线时间
12 小时
 楼主| 发表于 2016-11-25 13:09:08 | 显示全部楼层
正点原子 发表于 2016-11-26 00:47
貌似有人说和初始化先后顺序有关

试了好久,网上找了找,貌似先关连续转换,等待转换完成
下次启动转换前,再设置连续转换,通道不乱了

/* Disable the selected ADC CONT */
ADCx->CR2 &=~(1 << 1);
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));//等待转换结束

这种转换过程中改变模式应该没什么问题吧。。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2016-11-26 00:47:35 | 显示全部楼层
貌似有人说和初始化先后顺序有关
回复

使用道具 举报

1

主题

43

帖子

0

精华

初级会员

Rank: 2

积分
152
金钱
152
注册时间
2015-10-8
在线时间
32 小时
发表于 2016-12-2 01:50:14 | 显示全部楼层
肯定是你的程序有问题
ADC 连续扫描循环模式. 不停止工作,

DMA 一次搬用2个数据     按键按一次 使能一次.  肯定没问题.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-25 21:45

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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