ADC的配置如下:
void AdcInitial(void)
{
RCC->APB2RSTR |= (1<<9);//Reset ADC1
RCC->APB2RSTR &= ~(1<<9); //Clear ADC1 Reset
RCC->APB2ENR |= (1<<2); //PortA Enable
RCC->APB2ENR |= (1<<0); //AFIO Enable
RCC->APB2ENR |= (1<<9); //ADC1 Enable
RCC->CFGR &= 0xFFFF3FFF;//Clear ADCPRE
RCC->CFGR |= (2<<14); //Set ADCPRE 6 Prescaler
GPIOA->CRL &= 0xFFFFFFF0;//PoartA0 Anolog Input
GPIOA->CRL &= 0xFFFFFF0F;//PoartA1 Anolog Input
GPIOA->CRL &= 0xFFFFF0FF;//PoartA2 Anolog Input
}
void Adc1Set(void)
{
ADC1->CR1 &=0xFFF0FFFF; //DualMod == 0000
ADC1->CR1 |= (1<<8);//Scan Enable
ADC1->CR2 |= (1<<1);//Cont = 1
ADC1->CR2 &=~(1<<20);//Disable ExtTrig
ADC1->CR2 &= ~(1<<11);//Right Align
ADC1->SQR1 &= 0xFF0FFFFF;//Clear Regular Channel Sequence Length
ADC1->SQR1 |= (2<<20);// Set Regular Channel Sequence Length to 3
ADC1->CR2 |= (1<<23);//Temperature and Vrefint Enable
ADC1->CR2 |= (7<<17);//Swstart Mode
ADC1->SMPR2 &=0xFFFFFE00;//SMPR2 1.5cycle
ADC1->SMPR2 |= (7<<0); //239.5Cycle
ADC1->SMPR2 |= (7<<3); //239.5Cycle
ADC1->SMPR2 |= (7<<6); //239.5Cycle
ADC1->SQR3 &= 0xFFFF8000;
ADC1->SQR3 |= (0<<0);
ADC1->SQR3 |= (1<<5);
ADC1->SQR3 |= (2<<10);
ADC1->CR2 |= (1<<0);//Enable Converter
ADC1->CR2 |= (1<<8);//Enable DMA
ADC1->CR2 |= (1<<3); //RstCal
while(ADC1->CR2&(1<<3));
ADC1->CR2 |= (1<<2); //Cal
while(ADC1->CR2&(1<<2));
}
DMA配置如下:
u32 DmaAdcValue[]= {1,2,3};//
void DmaInitial(void)
{
RCC->AHBENR |= (1<<0);
}
void DMA1_Channel1ConfigureSet(void)
{
u32 DRAdress =0;
DMA1_Channel1->CNDTR = 3; //Transfer Count
DRAdress = (u32)(&ADC1->DR);//ADC1->DR;
DMA1_Channel1->CPAR = DRAdress ; //Peripheral Address
DMA1_Channel1->CMAR = (u32)(&DmaAdcValue[0]); //Memory Address
DMA1_Channel1->CCR &= ~(1<<14); //Disable Mem2Mem Bit
DMA1_Channel1->CCR &= 0xCFFF; //Clear Priority
DMA1_Channel1->CCR |= (2<<12); //Hight Priority
DMA1_Channel1->CCR &= 0xF3FF; //Clear Memory Size Bit
DMA1_Channel1->CCR |= (1<<10);//Memory Size 16 Bit
DMA1_Channel1->CCR &= 0xFCFF; //Clear Peripheral Size Bit
DMA1_Channel1->CCR |= (1<<8);//Peripheral Size 16Bit
DMA1_Channel1->CCR |= (1<<7); //Memory Increment Enable
DMA1_Channel1->CCR &= ~(1<<6); //Peripheral Increment Disable
DMA1_Channel1->CCR |= (1<<5); //Circular Enable
DMA1_Channel1->CCR &= ~(1<<4); //Data Transfer From Peripheral
DMA1_Channel1->CCR |= (1<<0);//Enable DMA
}
我的想法是:ADC1扫描,连续转换模式,启动ADC1的DMA。用DMA的第一通道,把ADC1 CH0,CH1,CH2通道的值读到DmaAdcValue[]数组里面。配置好上面的参数,但读DmaAdcValue[]数组里面的值,一直没有更新,好像DMA一直没有启动一样,是否这种的配置正确吗?还是其它的问题导致?
|