多通道ADC转换,出现了两个问题,这里我就用了一个通道来转换,我设想的是重复一个通道转换完成后DMA发送出去,
第一个问题:adcVolValue这个数组前5个没有数据,只有5~9内有转换的数据,也就是只转换了5次,结果导致平均值就缩水了一半了,(这里我就是的通道5的PA5采样3.3V电压值)这是第一个问题。
第二个问题:转换完10次后(虽然只转换了5次),不在继续转换,不知道是什么情况,我把寄存器设了一遍了,实在是找不到原因了,求各位指点。[mw_shl_code=applescript,true]u8 mpudata[128] __attribute__((at(0X20002000))); //¶¨òåò»¸öêy×é
int main(void)
{
u16 temp;
float dec;
u8 num,i,x=10,y=10;
Stm32_Clock_Init(432,25,2,9); //éèÖÃê±Öó,216Mhz
delay_init(216); //Ñóê±3õê¼»ˉ
MPU_Memory_Protection();
LED_Init(); //3õê¼»ˉóëLEDᬽóμÄó2¼t½ó¿ú
sdramInit();
lcdInit();
dmaInit();
adcInit();
my_mem_init(SRAMIN);
my_mem_init(SRAMEX);
lcdPointerColor = RED;
lcdShowString(10,10,242,40,"Digital Value:",14,32,0);
lcdShowString(10,50,242,90,"Analog Vol:",11,32,0);
while(1)
{
while(!(DMA2->LISR &(1<<5)));
DMA2->LIFCR &= ~(1<<5);
for(i=0;i<10;i++)
{
temp+=adcVolValue;
}
temp /= 10;
lcdShowNumber(242,10,400,40,temp,32,0);
for(i=10;i<20;i++)
{
temp+=adcVolValue;
}
temp /= 10;
lcdShowNumber(242,50,300,90,temp,32,0);
// ADC1->CR2 |= 1<<30;
// if(DMA2_Stream0->NDTR == 1)
// {
// lcdShowString(242,50,300,90,"secess",6,32,0);
ADC1->SR = 0;
DMA2_Stream0->CR &= ~(1<<0);
ADC1->CR2 &= ~(1<<0);
ADC1->CR2 &= ~(1<<8);
while(DMA2_Stream0->CR &0x01);
DMA2_Stream0->M0AR = (u32)adcVolValue;
DMA2_Stream0->CR |= 1<<0;
ADC1->CR2 |= 1<<0;
ADC1->CR2 |= 1<<8;
ADC1->CR2 |= 1<<30;
// }
// dec = (float)temp * (3.6/4096);
// temp = dec;
// lcdShowNumber(192,50,temp,32,0);
// lcdShowChar(208,50,'.',32,0);
// dec -= (float)temp;
// dec*=1000;
// temp = dec;
// lcdShowNumber(226,50,temp,32,0);
delay_ms(500);
}
}[/mw_shl_code]
[mw_shl_code=applescript,true]u16 adcVolValue[20];
void dmaInit()
{
RCC->AHB1ENR |= 1<<22;
ADC1->CR2 &= ~(1<<8);
DMA2_Stream0->CR &= ~(0x01);
while(DMA2_Stream0->CR &0x01);
DMA2->LIFCR = (1<<0)|(0x1F<<2) | (15<<8)|(1<<16)|(0x1F<<18)|(15<<24);
DMA2->HIFCR = (1<<0)|(0x1F<<2) | (15<<8)|(1<<16)|(0x1F<<18)|(15<<24);
DMA2_Stream0->PAR = (u32)&ADC1->DR;//íaéèμØÖ·
DMA2_Stream0->M0AR = (u32)adcVolValue;//Äú′æμØÖ·
DMA2_Stream0->NDTR = 20;//êy¾Yá¿
DMA2_Stream0->CR = 0;
DMA2_Stream0->CR |= 0<<25;//Ñ¡Ôñí¨μà0
DMA2_Stream0->CR |= 1<<16;//óÅÏ輶ÖDμè
// DMA2_Stream0->FCR |= 7<<0;
DMA2_Stream0->CR |= 1<<10;//′æ′¢Æ÷μØÖ·×Ô¶ˉ¼ó1£¬μú9λÎa0êÇíaéèμØÖ·1춨
//μúÆßλÎa0£¬±íê¾êy¾Y′«êä·½Ïò£oíaéèμ½′æ′¢Æ÷
DMA2_Stream0->CR |= 1<<13;//Äú′æêy¾Y¿í¶è
DMA2_Stream0->CR |= 1<<11;//íaéèêy¾Y¿í¶è
DMA2_Stream0->CR |= 1<<8;//Ñ-»·Ä£ê½
// DMA2_Stream0->FCR &= ~(1<<2);
DMA2_Stream0->CR |= 1<<0;//ê1ÄüDMA
}
void adcInit()
{
RCC->AHB1ENR |= 1<<0;//ê1ÄüADC1ê±Öó
RCC->APB2ENR |= 1<<8;//ê1ÄüGPIOAê±Öó
// GPIO_Set(GPIOA,PIN5 | PIN7,GPIO_MODE_AIN,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PD);//¸′óÃGPIOA
GPIO_Set(GPIOA,PIN0 | PIN1,GPIO_MODE_AIN,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PD);
ADC->CCR = 0;
// ADC->CCR |= 15<<8;
// ADC->CCR |= 3<<13;//Ö»òa·¢éú±ä»ˉ£¬¾í·¢3öDMAÇëÇó
// ADC->CCR |= 1<<14;//ê1ÄüDMAÄ£ê½1
ADC->CCR |= 1<<16;//ADC1Ô¤·ÖÆμ
// ADC->CCR |= 6<<0;//3£1æí¨μàí¬2½Ä£ê½
ADC1->CR1 = 0;
ADC1->CR1 |= 1<<8;//é¨ÃèÄ£ê½
ADC1->CR2 = 0;
ADC1->CR2 |= 1<<1;//á¬Dø×a»»Ä£ê½
ADC1->CR2 |= 1<<9;//Ö»òa·¢éú×a»»£¬¾í·¢3ödmAÇëÇó
ADC1->SQR1 = 0;
ADC1->SQR1 = 1<<20;//á½′Î×a»»
ADC1->SMPR2 = 0;
ADC1->SMPR2 |= 2<<0;//í¨μà02éÑùê±¼ä
ADC1->SMPR2 |= 2<<3;//í¨μà12éÑùê±¼ä
ADC1->SQR3 |= 0;//í¨μà5μúò»′Î×a»»
ADC1->SQR3 |= 1<<5;//í¨μà7μú¶t′Î×a»»
ADC1->CR2 |= 1<<8;//ê1ÄüDMAÄ£ê½
ADC1->CR2 |= 1<<0;//ê1ÄüADC
ADC1->CR2 |= 1<<30;//¿aê¼í¨μà×a»»
// DMA2_Stream0->CR |= 1<<0;//ê1ÄüDMA
}
[/mw_shl_code]
一周热门 更多>