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

2019-07-21 02:30发布

我使用的是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(" "); printf("%d",ADC_RCVTab[0]); printf(" "); printf("%d",ADC_RCVTab[1]); printf(" "); printf("%d",ADC_RCVTab[2]); printf(" "); printf("%d",ADC_RCVTab[3]); printf(" "); LED0=!LED0; delay_ms(250); } [/mw_shl_code]
[/mw_shl_code] [/mw_shl_code]
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
坏男孩
1楼-- · 2019-07-21 04:31
搞定了,请看:
http://www.openedv.com/posts/list/54779.htm
坏男孩
2楼-- · 2019-07-21 09:59
我发现当我DDS位为1的时候是数组四个元素轮流成为通道四的采样值,为什么啊?但是如果不置位DDS就是只转一次啊
正点原子
3楼-- · 2019-07-21 13:46
我也没搞过,帮顶下。
坏男孩
4楼-- · 2019-07-21 15:08
回复【3楼】正点原子:
---------------------------------
我刚刚测试,貌似是ADC溢出了,数据手册里有讲:
“尽管如此,如果数据丢失(溢出),则会将 ADC_SR 寄存器中的 OVR 位置 1 并生成一个中 断(如果 OVRIE 使能位已置 1)。随后会禁止 DMA 传输并且不再接受 DMA 请求”
但是为什么会溢出呢数据,我就不知道了,不知道,怎么搞,应是不用将DDS位置1

一周热门 更多>