OpenEdv-开源电子网

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

ADC+DMA两路传输问题

[复制链接]

16

主题

85

帖子

0

精华

初级会员

Rank: 2

积分
170
金钱
170
注册时间
2013-5-15
在线时间
0 小时
发表于 2013-8-17 14:34:34 | 显示全部楼层 |阅读模式

//开启一次DMA传输
 
//单次DMA转换之后,必须把DMA关闭,再次启动,才能实现第二次DMA传输!!!
 
void MYDMA_GOnes(DMA_Channel_TypeDef*DMA_CHx)
 
{    
 
 DMA_CHx->CCR&=~(1<<0);  //关闭DMA传输   
 DMA_CHx->CNDTR=DMA1_MEM_LEN;  //DMA1,传输数据量  
 DMA_CHx->CCR|=1<<0;  //开启DMA传输
 

 
这里我定义了

u16 ADC_Buf[16];
#define DMA1_MEM_LEN 16

整个功能是为了测试两路adc用dma传输,ch2是角度传感器的adc值,ch16是内部温度传感器
 

问:我采集的是通道2和通道16的adc值,在从ADC1_DR到ADC_Buf的过程中,是采集一次CH2,再采集一次CH16(按照我预先设定的顺序依次存放),直到采集16次为止么?还是说跟我设置的adc1的工作模式有关?

还有就是我用CH2和CH16,那SQR怎么设置?

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

ADC1->SQR3&=0XFFFFFC00;  
ADC1->SQR3|=2<<0;
ADC1->SQR3|=16<<5;
ADC1->CR2|=1<<22;       //启动规则转换通道


我是这么设置,但总觉得有问题。。求解,谢谢

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-17 17:18:33 | 显示全部楼层
要2个通道的话,设置规则序列长度为2,然后设置SQR规则序列1为你的CH2,规则序列2为你的CH16,然后设置DMA传输,就可以了。
具体的,论坛有好些网友发过参考代码了,ADC+DMA的,单通道的,多通道的都有,你可以搜索他们的参考下。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

16

主题

85

帖子

0

精华

初级会员

Rank: 2

积分
170
金钱
170
注册时间
2013-5-15
在线时间
0 小时
 楼主| 发表于 2013-8-17 20:57:08 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
这采集到的两个数据发送给内存ADC_Buf的时候,是依次按CH2,CH16的顺序发么?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-17 21:03:01 | 显示全部楼层
是的
回复 支持 反对

使用道具 举报

16

主题

85

帖子

0

精华

初级会员

Rank: 2

积分
170
金钱
170
注册时间
2013-5-15
在线时间
0 小时
 楼主| 发表于 2013-8-18 11:09:21 | 显示全部楼层
            


回复 支持 反对

使用道具 举报

16

主题

85

帖子

0

精华

初级会员

Rank: 2

积分
170
金钱
170
注册时间
2013-5-15
在线时间
0 小时
 楼主| 发表于 2013-8-18 11:16:25 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
DMA传输正常,但是只能显示SQ1的值,这又是啥情况?图在楼上。。
DMA一次往buf里发送2个数据,#define DMA1_MEM_LEN 2

/***************************ADC部分代码**************************/
         ADC1->CR2|=1<<23;      //使能温度传感器

ADC1->SQR1&=~(0XF<<20);
ADC1->SQR1&=1<<20;     //2个转换在规则序列中 也就是转换规则序列1,2 

ADC1->SQR3&=0XFFFFFC00;//规则序列1.2
ADC1->SQR3|=2<<0;    //SQ1为CH2
ADC1->SQR3|=16<<5;    //SQ2为CH16        
ADC1->CR2|=1<<22;       //启动规则转换通道

/***************************主函数部分代码***********************************/
while (1) 
 
    {
  if(DMA1->ISR&(1<<1))
{
 DMA1->IFCR|=1<<1;//清除通道1传输完成标志
 MYDMA_GOnes(DMA1_Channel1);
 LED0=!LED0;   //调试用

 adcx1=ADC_Buf[0];  //用dma读adc
 OLED_ShowNum(48,32,adcx1,4,16);


 adcx2=ADC_Buf[1];    //dma读
 OLED_ShowNum(48,48,adcx2,4,16);
 delay_ms(50);
     OLED_Refresh_Gram();
}


}
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-18 15:07:39 | 显示全部楼层
回复【6楼】 红烧螺丝钉 :
---------------------------------
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2013-8-10
在线时间
0 小时
发表于 2013-8-20 09:29:24 | 显示全部楼层
回复【7楼】正点原子:
---------------------------------
用DMA传输时,ADC采集的值要不要使用ADC_GetConversionValue(ADC1)函数获取ADC的值。我看了几个历程,都没有用ADC_GetConversionValue(ADC1)。 难么到底是怎样获得 ADC采集的值的。谢谢!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-20 10:48:08 | 显示全部楼层
回复【8楼】啊文520035:
---------------------------------
不需要
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-14 23:10

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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