OpenEdv-开源电子网

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

ADC1的DMA采集,采集四个通道,不成功,求救(F407板子)

[复制链接]

18

主题

70

帖子

0

精华

高级会员

Rank: 4

积分
593
金钱
593
注册时间
2015-4-14
在线时间
47 小时
发表于 2015-6-28 09:52:27 | 显示全部楼层 |阅读模式
5金钱
我使用的是ADC1的通道0~3四个通道,对应的IO口是GPIOA0~GPIOA3,我设置成DMA模式,存储器数组ADC_RCVTab[16](仅仅用到前四个元素),我发现我程序运行之后ADC的值貌似只能是第一次传到该数组中,仅仅是一次,不能实时得一直ADC转换一直传输,ADC初始化部分应该是没有问题的,我直接用读取的办法试了是可以读取的,使用DMA之后就仅仅只能传输一次,不知道是为啥?后来我看到ADC1->CR2|这个寄存器中的第九位,DDS位,技术手册的描述如下:
位 9 DDS:DMA 禁止选择(对于单一 ADC 模式) (DMA disable selection (for single ADC mode))
此位由软件置 1 和清零。
0:最后一次传输后不发出新的 DMA 请求(在 DMA 控制器中进行配置)
1:只要发生数据转换且 DMA = 1,便会发出 DAM 请求
我看不懂是什么意思,我就试着把这个位写为1:ADC1->CR2|=1<<9;但是发现这个时候那个四个数组的数据开始一直变化飘动,我以为可以了,但是实际上我把对应的通道接到VCC3.3或者GND时候,他还是在乱跑,不是4095上下,或者是0左右。不知道是什么原因,这个位到底要不要写为1呢?还是不用,问题不是出在这里,希望高手给我看看……
原子哥,你也看看吧……好急好急……
[mw_shl_code=c,true]下面给出串口调试助手中的图片

[/mw_shl_code] [mw_shl_code=c,true]最右边数据是第四路,看看数据可以知道数据非常稳定,根本不动,说明后面的数据没有传过来,一直显示的是第一次的值,我刚开始将A3也就是第四路接GND,后来接了VCC3.3也是不管用[/mw_shl_code] [mw_shl_code=c,true]当我把那个CR2寄存器的第九位DDS位置位之后就会数据非常票,请看图:

[/mw_shl_code] [mw_shl_code=c,true]这个时候是第四路是一直接的GND啊,可是数据竟然是这么乱[/mw_shl_code]


程序中ADC与DMA的初始化在一个函数中,我贴在下面:
这个是初始化函数
[mw_shl_code=c,true]
[mw_shl_code=c,true]#define ADC1_DR_Address ((uint32_t)0x4001204C) //ADC1???????????÷???· //?¨????×é????????ADC???????? u16 ADC_RCVTab[16]; //ADC??????????GPIOA?? void ADC_DMA_Init(void) { RCC->APB2ENR|=1<<8; //????ADC1?±?? RCC->AHB1ENR|=1<<0; //????PORTA?±?? GPIO_Set(GPIOA,PIN0|PIN1|PIN2|PIN3|PIN4|PIN5|PIN6|PIN7,GPIO_MODE_AIN,0,0,GPIO_PUPD_PU); //PA5,????????,???? RCC->APB2RSTR|=1<<8; //ADCs???? RCC->APB2RSTR&=~(1<<8); //?????á?? ADC->CCR=0<<16; //?è????2·???????????72MHz ADCCLK=PCLK2/4=84/4=21Mhz,ADC?±??×???????????36Mhz //ADC1????????DMA2???¨??0 RCC->AHB1ENR|=1<<22; //????DMA2?±?? DMA2_Stream0->CR &= ~(1<<0);//?????÷???? while(DMA2_Stream0->CR&0x01);//?????????÷?????????÷?????????????????÷?????????????????????? DMA2->HIFCR |= 0xffff;//??1????×????????÷?????? DMA2->LIFCR |= 0xffff;//??1????×????????÷?????? DMA2_Stream0->AR = ADC1_DR_Address;//?¨??DMA???è?ù???·??ADC1 DMA2_Stream0->M0AR = (uint32_t)&ADC_RCVTab;//?¨??DMA?????ù???· DMA2_Stream0->NDTR = 4;//????????????????×??? DMA2_Stream0->CR &=~(0x7<<25);//?????¨??0 //±??????¨??0???????÷0????ADC1???¨?? DMA2_Stream0->CR &=~(1<<5);//PFCTRL????????±ê??DMA???÷?????÷??????±ê?????è???÷?????÷ DMA2_Stream0->CR &=~(0x3<<6);//DIR[1:0]????????·??ò???????è??00±ê?????è???????÷ DMA2_Stream0->CR |=(1<<8);//????CIRC???·???? DMA2_Stream0->CR &=~(1<<9);//???è???·???????¨PINC DMA2_Stream0->CR |=(1<<10);//MINC?????????ó?????÷???????????????ó????MSIZE DMA2_Stream0->CR |=(1<<11);//PSIZE DMA2_Stream0->CR &=~(1<<12);//11??12?????????????è?????ó??16?? DMA2_Stream0->CR |=(1<<13);//MSIZE DMA2_Stream0->CR &=~(1<<14);//13??14???????????????÷?????ó??16?? //15?????±?????????????? DMA2_Stream0->CR |=(0x3<<16);//??????×??? DMA2_Stream0->CR &=~(1<<18);//?????á???????????????? //19?????????????? //??·????????????????????????? DMA2_Stream0->FCR |=(0x3<<0);//FIFO·§?????????????ê?????? DMA2_Stream0->FCR &=~(1<<2);//?????±?????? DMA2_Stream0->CR |= 1<<0;//????DMA?????÷???? //??????ADC???????? ADC1->CR1=0; //CR1?è?????? ADC1->CR2=0; //CR2?è?????? ADC1->CR1 &=~(0x3<<24); //12?????? ADC1->CR1|=1<<8; //?¨?è???? ADC1->CR2|=1<<1; //????×??????? ADC1->CR2&=~(1<<11); //?????? ADC1->CR2|=0<<28; //?í????·? ??? ADC1->SQR1|=(0x4<<20);//?????¨???è?? ADC1->SQR1&=~(1<<20); //4??×????????ò?ò???? ADC1->SQR1&=~(1<<21); //4??×????????ò?ò???? ADC1->SQR1&=~(1<<23); //4??×????????ò?ò???? ADC1->SMPR2 =0;//???ù?????????÷?????????ù?????è????×???3?????? // ADC1->SMPR2 |=0x7;//???ù????×??¤ ADC1->CR2|=1<<8;//????DMA×??????? // ADC1->CR2|=1<<9;//DDS ADC1->CR2|=1<<0; //????AD×????÷?????????????á??ADC???????????? ADC1->SQR3&=0x0;// //??SQ1??SQ4???÷???????? //??????×??????¨??0 ADC1->SQR3|=0x1<<5; //??????×??????¨??1 ADC1->SQR3|=0x2<<10; //??????×??????¨??2 ADC1->SQR3|=0x3<<15; //??????×??????¨??3 ADC1->CR2|=1<<30; //?í?????????ò×????¨?? }[/mw_shl_code] [mw_shl_code=c,true]主函数:循环如下[/mw_shl_code] [mw_shl_code=c,true]
[mw_shl_code=c,true] while(1) { printf("\r\n"); printf("%d",ADC_RCVTab[0]); printf("\t"); printf("%d",ADC_RCVTab[1]); printf("\t"); printf("%d",ADC_RCVTab[2]); printf("\t"); printf("%d",ADC_RCVTab[3]); printf("\t"); LED0=!LED0; delay_ms(250); } [/mw_shl_code]

[/mw_shl_code]
[/mw_shl_code]

最佳答案

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

搞定了,请看: http://www.openedv.com/posts/list/54779.htm
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

18

主题

70

帖子

0

精华

高级会员

Rank: 4

积分
593
金钱
593
注册时间
2015-4-14
在线时间
47 小时
 楼主| 发表于 2015-6-28 09:52:28 | 显示全部楼层
搞定了,请看:
http://www.openedv.com/posts/list/54779.htm
回复

使用道具 举报

18

主题

70

帖子

0

精华

高级会员

Rank: 4

积分
593
金钱
593
注册时间
2015-4-14
在线时间
47 小时
 楼主| 发表于 2015-6-28 10:37:47 | 显示全部楼层
我发现当我DDS位为1的时候是数组四个元素轮流成为通道四的采样值,为什么啊?但是如果不置位DDS就是只转一次啊
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2015-6-28 10:43:53 | 显示全部楼层
我也没搞过,帮顶下。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

18

主题

70

帖子

0

精华

高级会员

Rank: 4

积分
593
金钱
593
注册时间
2015-4-14
在线时间
47 小时
 楼主| 发表于 2015-6-28 10:59:54 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
我刚刚测试,貌似是ADC溢出了,数据手册里有讲:
“尽管如此,如果数据丢失(溢出),则会将 ADC_SR 寄存器中的 OVR 位置 1 并生成一个中 断(如果 OVRIE 使能位已置 1)。随后会禁止 DMA 传输并且不再接受 DMA 请求”
但是为什么会溢出呢数据,我就不知道了,不知道,怎么搞,应是不用将DDS位置1
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-24 21:28

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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