OpenEdv-开源电子网

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

AD转换用扫描模式的时候,发现有时候会顺序出错

[复制链接]

4

主题

9

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2012-9-8
在线时间
0 小时
发表于 2013-8-24 09:08:21 | 显示全部楼层 |阅读模式
 问题现象:

AD转换我采用扫描方式,数据采集好后,我采用DMA,搬走数据,发现平时都是好好的,只要旁边有变频器等干扰,数据往往会错位,
比如:
正常:
通道0->ADBUFF[0]
通道1->ADBUFF[1] 
通道2->ADBUFF[2] 
通道3->ADBUFF[3] 
通道4->ADBUFF[4] 
通道5->ADBUFF[5] 
通道6->ADBUFF[6] 
通道7->ADBUFF[7] 

受干扰后变为:
通道0->ADBUFF[1]
通道1->ADBUFF[2] 
通道2->ADBUFF[3] 
通道3->ADBUFF[4] 
通道4->ADBUFF[5] 
通道5->ADBUFF[6] 
通道6->ADBUFF[7] 
通道7->ADBUFF[0]  

我的问题具体是:
是DMA出错,搬错了,还是A/D扫描错位了?
如果是其中一个,如何健壮他?



ad配置的码:

void  Adc_Init(void)
{    
//先初始化IO口
  RCC->APB2ENR|=1<<2;    //使能PORTA口时钟 
//GPIOA->CRL&=0XFFFFfff0;//PA0 anolog输入,为0000的时候为模拟输入
//通道10/11设置  
RCC->APB2ENR|=1<<9;    //ADC1时钟使能  
RCC->APB2RSTR|=1<<9;   //ADC1复位
RCC->APB2RSTR&=~(1<<9);//复位结束
   
RCC->CFGR&=~(3<<14);   //分频因子清零  15:14 adcpre=10;
  RCC->CFGR|=2<<14; 
//SYSCLK/DIV2=12M ADC时钟设置为12M,ADC最大时钟不能超过14M!
//否则将导致ADC准确度下降! 
 // ADC1->CR1=000-0,000-0,00,0-0,000-0,111,-0,001-,000,0-0000    
  ADC1->CR1=0x0000e100;
  ADC1->CR2=0x001e0101;    
  ADC1->SQR1=0x00700000;
  ADC1->SQR2=0x000000e6;
  ADC1->SQR3=0x0a418820;
//通道顺序:通道0,通道1,通道2,通道3,通道4,通道5,通道6,通道7,结束,

  
//设置通道0~7的采样时间
ADC1->SMPR1=0X00924924;      //通道0,-7采样时间100  41.5周期
        ADC1->SMPR2=0x24924924;        
 

ADC1->CR2|=1<<0;    //开启AD转换器  
ADC1->CR2|=1<<3;        //使能复位校准  
while(ADC1->CR2&1<<3);  //等待校准结束  
       //该位由软件设置并由硬件清除。在校准寄存器被初始化后该位将被清除。  
ADC1->CR2|=1<<2;        //开启AD校准   
while(ADC1->CR2&1<<2);  //等待校准结束
//该位由软件设置以开始校准,并在校准结束时由硬件清除  
}

//启动转换序列
void  adbegin(void)
{
ADC1->CR2|=1<<22;       //启动规则转换通道 


//dma配置的码:
//DMA1的各通道配置
//这里的传输形式是固定的,这点要根据不同的情况来修改
//从存储器->外设模式/8位数据宽度/存储器增量模式
//DMA_CHxMA通道CHx
//cpar:外设地址
//cmar:存储器地址
//cndtr:数据传输量  
void MYDMA_Config(DMA_Channel_TypeDef*DMA_CHx,u32 cpar,u32 cmar,u16 cndtr)
{
  RCC->AHBENR|=1<<0; //开启DMA1时钟
delaynop(60000);        //等待DMA时钟稳定
  DMA_CHx->CPAR=cpar;   //DMA1 外设地址 
DMA_CHx->CMAR=(u32)cmar;//DMA1,存储器地址
DMA1_MEM_LEN=cndtr;     //保存DMA传输数据量
DMA_CHx->CNDTR=cndtr;   //DMA1,传输数据量
DMA_CHx->CCR=0X00000000;//复位
DMA_CHx->CCR|=0<<4;  //从外设读
DMA_CHx->CCR|=0<<5;  //不执行循环操作  以后可以执行循环操作,
DMA_CHx->CCR|=0<<6;  //外设地址非增量模式
DMA_CHx->CCR|=1<<7;  //存储器增量模式
DMA_CHx->CCR|=1<<8;  //外设数据宽度为16位
DMA_CHx->CCR|=1<<10; //存储器数据宽度16位
DMA_CHx->CCR|=1<<12; //中等优先级
DMA_CHx->CCR|=0<<14; //非存储器到存储器模式  
//开启一次DMA传输
void MYDMA_Enable(DMA_Channel_TypeDef*DMA_CHx)
{
DMA_CHx->CCR&=~(1<<0);       //关闭DMA传输 
DMA_CHx->CNDTR=DMA1_MEM_LEN; //DMA1,传输数据量 
DMA_CHx->CCR|=1<<0;          //开启DMA传输
}






































正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

9

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2012-9-8
在线时间
0 小时
 楼主| 发表于 2013-8-29 09:24:45 | 显示全部楼层
已解决,部分DMA初始化要不断刷新,就可以保证DMA不会搬运错位,
回复 支持 反对

使用道具 举报

9

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
97
金钱
97
注册时间
2013-3-30
在线时间
3 小时
发表于 2013-11-3 19:46:46 | 显示全部楼层
回复【2楼】wojiate:
---------------------------------
DMA搬运错位,怎么DMA不断刷新,才能保证不搬运错误!
回复 支持 反对

使用道具 举报

2

主题

1446

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2256
金钱
2256
注册时间
2010-12-16
在线时间
206 小时
发表于 2013-11-4 22:15:29 | 显示全部楼层
先开DMA,再开ADC.

否则开启ADC后,在开启DMA前,已经转换若干个数据了,DMA才开始接受触发,就会对不齐.
技术讨论请发帖 , 需要我回复请点左下的 < 回复 > 让系统通知我 . 本人不通过其他方式返回任何参数.
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-9 20:38

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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