ADC两路转换,遇到两个问题

2019-07-20 10:22发布

多通道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éèμ&#216;&#214;·
        DMA2_Stream0->M0AR = (u32)adcVolValue;//&#196;ú′&#230;μ&#216;&#214;·
        DMA2_Stream0->NDTR = 20;//êy&#190;Yá&#191;
       
        DMA2_Stream0->CR = 0;
        DMA2_Stream0->CR |= 0<<25;//&#209;&#161;&#212;&#241;í¨μà0
        DMA2_Stream0->CR |= 1<<16;//ó&#197;&#207;è&#188;&#182;&#214;Dμè
//        DMA2_Stream0->FCR |= 7<<0;
        DMA2_Stream0->CR |= 1<<10;//′&#230;′¢&#198;÷μ&#216;&#214;·×&#212;&#182;ˉ&#188;ó1£&#172;μú9&#206;&#187;&#206;a0ê&#199;íaéèμ&#216;&#214;·1ì&#182;¨
//μú&#198;&#223;&#206;&#187;&#206;a0£&#172;±íê&#190;êy&#190;Y′&#171;ê&#228;·&#189;&#207;ò£oíaéèμ&#189;′&#230;′¢&#198;÷
        DMA2_Stream0->CR |= 1<<13;//&#196;ú′&#230;êy&#190;Y&#191;í&#182;è
        DMA2_Stream0->CR |= 1<<11;//íaéèêy&#190;Y&#191;í&#182;è
        DMA2_Stream0->CR |= 1<<8;//&#209;-&#187;·&#196;£ê&#189;
       
//        DMA2_Stream0->FCR &= ~(1<<2);
        DMA2_Stream0->CR |= 1<<0;//ê1&#196;üDMA
}
void adcInit()
{
        RCC->AHB1ENR |= 1<<0;//ê1&#196;üADC1ê±&#214;ó
        RCC->APB2ENR |= 1<<8;//ê1&#196;üGPIOAê±&#214;ó
       
//        GPIO_Set(GPIOA,PIN5 | PIN7,GPIO_MODE_AIN,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PD);//&#184;′ó&#195;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;//&#214;&#187;òa·¢éú±&#228;&#187;ˉ£&#172;&#190;í·¢3&#246;DMA&#199;&#235;&#199;ó
//        ADC->CCR |= 1<<14;//ê1&#196;üDMA&#196;£ê&#189;1
        ADC->CCR |= 1<<16;//ADC1&#212;¤·&#214;&#198;μ
//        ADC->CCR |= 6<<0;//3£1&#230;í¨μàí&#172;2&#189;&#196;£ê&#189;
       
        ADC1->CR1 = 0;
        ADC1->CR1 |= 1<<8;//é¨&#195;è&#196;£ê&#189;
       
        ADC1->CR2 = 0;
        ADC1->CR2 |= 1<<1;//á&#172;D&#248;×a&#187;&#187;&#196;£ê&#189;
        ADC1->CR2 |= 1<<9;//&#214;&#187;òa·¢éú×a&#187;&#187;£&#172;&#190;í·¢3&#246;dmA&#199;&#235;&#199;ó
        ADC1->SQR1 = 0;
        ADC1->SQR1 = 1<<20;//á&#189;′&#206;×a&#187;&#187;
        ADC1->SMPR2 = 0;

        ADC1->SMPR2 |= 2<<0;//í¨μà02é&#209;ùê±&#188;&#228;
        ADC1->SMPR2 |= 2<<3;//í¨μà12é&#209;ùê±&#188;&#228;

        ADC1->SQR3 |= 0;//í¨μà5μúò&#187;′&#206;×a&#187;&#187;
        ADC1->SQR3 |= 1<<5;//í¨μà7μú&#182;t′&#206;×a&#187;&#187;
       

        ADC1->CR2 |= 1<<8;//ê1&#196;üDMA&#196;£ê&#189;
        ADC1->CR2 |= 1<<0;//ê1&#196;üADC
        ADC1->CR2 |= 1<<30;//&#191;aê&#188;í¨μà×a&#187;&#187;
//        DMA2_Stream0->CR |= 1<<0;//ê1&#196;üDMA       
       
}
[/mw_shl_code]
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。