我使用的是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]
---------------------------------
我刚刚测试,貌似是ADC溢出了,数据手册里有讲:
“尽管如此,如果数据丢失(溢出),则会将 ADC_SR 寄存器中的 OVR 位置 1 并生成一个中 断(如果 OVRIE 使能位已置 1)。随后会禁止 DMA 传输并且不再接受 DMA 请求”
但是为什么会溢出呢数据,我就不知道了,不知道,怎么搞,应是不用将DDS位置1
一周热门 更多>