大致是这样,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转换完成标志位
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
试了好久,网上找了找,貌似先关连续转换,等待转换完成
下次启动转换前,再设置连续转换,通道不乱了
/* Disable the selected ADC CONT */
ADCx->CR2 &=~(1 << 1);
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));//等待转换结束
这种转换过程中改变模式应该没什么问题吧。。
一周热门 更多>