OpenEdv-开源电子网

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

关于4路ADC+DMA传输 的问题

[复制链接]

83

主题

349

帖子

1

精华

高级会员

Rank: 4

积分
908
金钱
908
注册时间
2012-8-10
在线时间
13 小时
发表于 2013-11-9 13:05:44 | 显示全部楼层 |阅读模式

             在做多路ADC+DMA实验是发现好多难以解决的问题,我用的是ADC0、1、2、3四路,设置为循环扫描模式;DMA循环模式传输数据到自己定义的数组,原子的mini板,(PA0、ADC0)接GND,(PA1/ADC1)接3v3,(PA2、ADC2)接GND,(PA3/ADC3)接3v3,按理来说应该是采集的数据时0,4095,0,4095才对的,可是串口确实如下显示


DMA配置如下

void MYDMA_Config(DMA_Channel_TypeDef*DMA_CHx,u32 cpar,u32 cmar,u16 cndtr)
{
  RCC->AHBENR|=1<<0;  //开启DMA1时钟
  delay_ms(2);   //等待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;  //外设数据宽度为8位
 DMA_CHx->CCR|=1<<10; //存储器数据宽度8位
 DMA_CHx->CCR|=1<<12; //中等优先级
 DMA_CHx->CCR|=0<<14; //非存储器到存储器模式     
}

ADC配置如下:

void Adc_Init(void)
{
 RCC->APB2ENR|=1<<2;//引脚时钟使能
 GPIOA->CRL&=0XFFFF0000;//配置PA0.1.2.3模拟输入


 RCC->APB2ENR|=1<<9;    //ADC1时钟使能
 __nop();
 __nop();     
 RCC->APB2RSTR|=1<<9;   //ADC1复位
 RCC->APB2RSTR&=~(1<<9);//复位结束
 RCC->CFGR|=2<<14;

 ADC1->CR1&=0XF0FFFF;   //独立工作模式
 ADC1->CR1|=1<<8;       //扫描模式   
 ADC1->CR2|=1<<1;       //连续转换模式 
 ADC1->CR2|=0x000E0000; //软件控制转换 由bit21控制
 ADC1->CR2|=1<<20;      //使用用外部触发(SWSTART)!!! 必须使用一个事件来触发
 ADC1->CR2&=~(1<<11);   //右对齐

 ADC1->SQR1&=~(0XF<<20);
 ADC1->SQR1|=3<<20;     //4个转换在规则序列中

 ADC1->SQR3&=0XFFFFFC00;//规则序列 通道0、1
 ADC1->SQR3|=0X00000020; //0、1
 ADC1->SQR2&=0XFFFFFFE0;//规则序列 通道ch
 ADC1->SQR2|=0X00000002; //2
 ADC1->SQR1&=0XFFFFFFE0;//规则序列 通道ch
 ADC1->SQR1|=0X00000003; //3

 ADC1->SMPR2&=0XFFFFF000;     //通道10的转换时间为:239.5+12.5个ADC时钟周期
 ADC1->SMPR2|=7<<9;            //通道0  239.5周期,提高采样时间可以提高精确度
 ADC1->SMPR2|=7<<6;    //通道89的转换时间为:239.5+12.5个ADC时钟周期
 ADC1->SMPR2|=7<<3;      //通道89  239.5周期,提高采样时间可以提高精确度
 ADC1->SMPR2|=7<<0;  

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

主函数:

u16 SendBuff[4];

int main(void)
{
 u8 i;
 u32 count=0;
 Stm32_Clock_Init(9);
 delay_init(72);
 uart_init(72,9600);
 LED_Init();

 Adc_Init();
 ADC1->CR2|=1<<8;    //开启ADC DMA转换
 MYDMA_Config(DMA1_Channel1,(u32)&ADC1->DR,(u32)SendBuff,4);
 MYDMA_Enable(DMA1_Channel1);
 ADC1->CR2|=1<<0;  //开启ADC转换
 while(1)
 {
  if(DMA1->ISR&(1<<1))
  {
   for(i=0;i<4;i++)
   {
    printf("adc=%d\n",SendBuff);
    delay_ms(20);
   }
   
   printf("count。。。。。。。=%d\n\n\n",count);    /*调试代码用,可屏蔽*/
   count++;
   DMA1->IFCR|=1<<1;
   MYDMA_Enable(DMA1_Channel1);
  } 
  LED1=~LED1;
  delay_ms(200);
 }


}

DMA_3.rar

405.45 KB, 下载次数: 45

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

使用道具 举报

38

主题

2061

帖子

6

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3273
金钱
3273
注册时间
2012-1-16
在线时间
37 小时
发表于 2013-11-9 13:45:02 | 显示全部楼层
回复【楼主位】电子狼:
---------------------------------
“ADC1->CR2|=1<<1;       //连续转换模式 ”将这个设置为单次转换模式。因为DMA是有数据就搬运,如果一个通道采集了两次再接着下个通道采集,就会出错。
站在巨人的肩膀上不断的前进。。。
回复 支持 反对

使用道具 举报

10

主题

93

帖子

0

精华

初级会员

Rank: 2

积分
188
金钱
188
注册时间
2012-11-16
在线时间
6 小时
发表于 2013-11-9 17:33:21 | 显示全部楼层
应该是这个地方出错
ADC1->SQR3&=0XFFFFFC00;//规则序列 通道0、1
  ADC1->SQR3|=0X00000020; //0、1 
  ADC1->SQR2&=0XFFFFFFE0;//规则序列 通道ch
  ADC1->SQR2|=0X00000002; //2
  ADC1->SQR1&=0XFFFFFFE0;//规则序列 通道ch
  ADC1->SQR1|=0X00000003; //3 

PA0,1,2,3的通道应该都在ADC1->SQR3上设置。
ADC1->SQR3=0<<0|1<<5|2<<10|3<<15,    0,1,2,3,是通道。后面的0,5,10,15是转换的顺序
回复 支持 反对

使用道具 举报

83

主题

349

帖子

1

精华

高级会员

Rank: 4

积分
908
金钱
908
注册时间
2012-8-10
在线时间
13 小时
 楼主| 发表于 2013-11-10 17:01:13 | 显示全部楼层
回复【3楼】a2696026:
---------------------------------
SQx[]的位是用来设置通道编号的,ADC_SQR3里面配置的是某个通道(ADC有18个通道)的转换顺序
ADC1->SQR3&=0XFFFFFC00;//规则序列 通道0、1      转换顺序为第一个  第二个转换
ADC1->SQR3|=0X00000020; //0、1 
ADC1->SQR2&=0XFFFFFFE0;//规则序列 通道2       转换顺序为第七个转换
ADC1->SQR2|=0X00000002; //2
ADC1->SQR1&=0XFFFFFFE0;//规则序列 通道3      转换顺序为第13个转换
ADC1->SQR1|=0X00000003; //3
回复 支持 反对

使用道具 举报

83

主题

349

帖子

1

精华

高级会员

Rank: 4

积分
908
金钱
908
注册时间
2012-8-10
在线时间
13 小时
 楼主| 发表于 2013-11-10 17:08:47 | 显示全部楼层
回复【2楼】xiaoyan:
---------------------------------
设置为单次模式后还是出错,下载完程序后,串口没数据,必须按复位键之后,才有一次数据的传输即只有4个数据量,数据还是跟我上面的截图一样
回复 支持 反对

使用道具 举报

38

主题

2061

帖子

6

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3273
金钱
3273
注册时间
2012-1-16
在线时间
37 小时
发表于 2013-11-11 10:07:53 | 显示全部楼层
2楼正解,测试结果:



DMA_3.rar

352.7 KB, 下载次数: 93

站在巨人的肩膀上不断的前进。。。
回复 支持 反对

使用道具 举报

83

主题

349

帖子

1

精华

高级会员

Rank: 4

积分
908
金钱
908
注册时间
2012-8-10
在线时间
13 小时
 楼主| 发表于 2013-11-11 11:28:47 | 显示全部楼层
回复【6楼】xiaoyan:
---------------------------------
多谢版主,小弟感激不尽
回复 支持 反对

使用道具 举报

83

主题

349

帖子

1

精华

高级会员

Rank: 4

积分
908
金钱
908
注册时间
2012-8-10
在线时间
13 小时
 楼主| 发表于 2013-11-12 14:47:05 | 显示全部楼层
回复【3楼】a2696026:
---------------------------------如果想把通道2设置为第7个转换,应该怎么配置
是这样么   ADC->SRR2|=2<<0;  ?
回复 支持 反对

使用道具 举报

7

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2012-10-14
在线时间
0 小时
发表于 2013-11-13 14:59:51 | 显示全部楼层
回复【楼主位】电子狼:
---------------------------------
 ADC1->SQR1&=~(0XF<<20);
 ADC1->SQR1|=3<<20;     //4个转换在规则序列中 

我想问一下,为什么ADC初始化中这两句是4个转换在规则序列中呢?不是3个转换么?
回复 支持 反对

使用道具 举报

10

主题

93

帖子

0

精华

初级会员

Rank: 2

积分
188
金钱
188
注册时间
2012-11-16
在线时间
6 小时
发表于 2013-11-13 17:06:59 | 显示全部楼层
回复【8楼】电子狼:

回复【3楼】a2696026:
---------------------------------如果想把通道2设置为第7个转换,应该怎么配置
是这样么   ADC->SRR2|=2<<0;  ?

---------------------------------
你可以试试:
ADC1->SQR2=2<<0;
SQR3有SQ1-SQ6的转换  SQR2就应该在SQ7开始,
回复 支持 反对

使用道具 举报

83

主题

349

帖子

1

精华

高级会员

Rank: 4

积分
908
金钱
908
注册时间
2012-8-10
在线时间
13 小时
 楼主| 发表于 2013-11-13 17:15:33 | 显示全部楼层
            


3代表二进制的0011======4个转换
回复 支持 反对

使用道具 举报

83

主题

349

帖子

1

精华

高级会员

Rank: 4

积分
908
金钱
908
注册时间
2012-8-10
在线时间
13 小时
 楼主| 发表于 2013-11-13 17:16:02 | 显示全部楼层
回复【11楼】电子狼:

             
3代表二进制的0011======4个转换

---------------------------------
回复【9楼】fgq369:
---------------------------------
回复 支持 反对

使用道具 举报

83

主题

349

帖子

1

精华

高级会员

Rank: 4

积分
908
金钱
908
注册时间
2012-8-10
在线时间
13 小时
 楼主| 发表于 2013-11-13 17:16:40 | 显示全部楼层
回复【10楼】a2696026:
---------------------------------嗯嗯,好的 ,我试试哈
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-9 08:08

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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