stm32f407 ADC+DMA,dma无法正常工作

2019-07-20 22:21发布

adc+dma一路数据的采集,adc可以正常工作,但是数据无法正常传输到上位机,请各位大神帮助。

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "lcd.h"
#include "key.h"
#include "adc.h"
#include "dma.h"



uint16_t fvalue[4096];

//u16 fvalue[4096];
int main(void)
{
        u16 i,t,m;
        float pro;
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//éèÖÃÏμí3ÖD¶ÏóÅÏ輶·Ö×é2
        delay_init(168);    //3õê¼»ˉÑóê±oˉêy
        uart_init(115200);        //3õê¼»ˉ′®¿ú2¨ìØÂêÎa115200
        LED_Init();                                        //3õê¼»ˉLED
        LCD_Init();         //3õê¼»ˉLCD½ó¿ú
        KEY_Init();                                 //°′¼ü3õê¼»ˉ
        Adc_Init();         //3õê¼»ˉADC
       
        MYDMA_Config(DMA2_Stream0,DMA_Channel_0,(u32)&ADC1->DR,(u32)fvalue);//DMA2,STEAM7,CH4,íaéèÎa′®¿ú1,′æ′¢Æ÷ÎaSendBuff,3¤¶èÎa:SEND_BUF_SIZE.
       
         
       
                        ADC_DMACmd(ADC1,ENABLE);                                        
                        MYDMA_Enable(DMA2_Stream0,4096);                                                  
                        ADC_SoftwareStartConv(ADC1);               
                                               
                                               
//fvalue[0]=Get_Adc(10);
//printf("aaa=%d ",fvalue[0]);

while(1)
                {
                                delay_ms(100);

                                          while(pro!=0)
                                                        {                                                                                      
                                                                if(DMA_GetFlagStatus(DMA2_Stream0,DMA_FLAG_TCIF0)!=RESET)
                                                                 {                                                        
                                                                                                printf("ooookkkkk ");                                                                         
                                                                                DMA_ClearFlag(DMA2_Stream0,DMA_FLAG_TCIF0);
                                                                                break;
                                                                        }
                                                                        pro=DMA_GetCurrDataCounter(DMA2_Stream0);//μÃμ½μ±Ç°»1ê£óà¶àéù¸öêy¾Y
                                                                        printf("%d    ",(u16)pro);
                                                                        pro=1-pro/4096;//μÃμ½°ù·Ö±è          
                                                                        pro*=100;                                  //à©′ó100±¶
                                                        }                                                
                                                       
                                        for(t=0;t<4096;t++)
                                                        {
                                                        printf("VolVaule[%d]=%d ",t,fvalue[t]);
                                                        delay_ms(100);
                                                        }

                                }                       
               
                }






#include "adc.h"
#include "delay.h"                 


//3&#245;ê&#188;&#187;ˉADC                                                                                                                          
void  Adc_Init(void)
{   
  GPIO_InitTypeDef  GPIO_InitStructure;
        ADC_CommonInitTypeDef ADC_CommonInitStructure;
        ADC_InitTypeDef       ADC_InitStructure;
       
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);//ê1&#196;üGPIOCê±&#214;ó
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); //ê1&#196;üADC1ê±&#214;ó

  //&#207;è3&#245;ê&#188;&#187;ˉADC1í¨μà5 IO&#191;ú
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;//PC2
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;//&#196;£&#196;aê&#228;è&#235;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;//2&#187;′&#248;é&#207;&#207;&#194;à-
  GPIO_Init(GPIOC, &GPIO_InitStructure);//3&#245;ê&#188;&#187;ˉ  

        RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,ENABLE);          //ADC1&#184;′&#206;&#187;
        RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,DISABLE);        //&#184;′&#206;&#187;&#189;áê&#248;         

       
  ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;//&#182;àá¢&#196;£ê&#189;
  ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;//á&#189;&#184;&#246;2é&#209;ù&#189;×&#182;&#206;&#214;&#174;&#188;&#228;μ&#196;&#209;ó3ù5&#184;&#246;ê±&#214;ó
  ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled; //DMAê§&#196;ü
  ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4;//&#212;¤·&#214;&#198;μ4·&#214;&#198;μ&#161;£ADCCLK=PCLK2/4=84/4=21Mhz,ADCê±&#214;ó×&#238;o&#195;2&#187;òa3&#172;1y36Mhz
  ADC_CommonInit(&ADC_CommonInitStructure);//3&#245;ê&#188;&#187;ˉ
       
  ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;//12&#206;&#187;&#196;£ê&#189;
  ADC_InitStructure.ADC_ScanConvMode = DISABLE;//·&#199;é¨&#195;è&#196;£ê&#189;       
  ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//á&#172;D&#248;×a&#187;&#187;
  ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;//&#189;&#251;&#214;1′¥·¢&#188;ì2a£&#172;ê1ó&#195;èí&#188;t′¥·¢
        ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_T1_CC1;
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//óò&#182;&#212;&#198;&#235;       
  ADC_InitStructure.ADC_NbrOfConversion = 1;//1&#184;&#246;×a&#187;&#187;&#212;ú1&#230;&#212;òDòáD&#214;D ò2&#190;íê&#199;&#214;&#187;×a&#187;&#187;1&#230;&#212;òDòáD1
  ADC_Init(ADC1, &ADC_InitStructure);//ADC3&#245;ê&#188;&#187;ˉ
       
       
        ADC_RegularChannelConfig(ADC1,ADC_Channel_12, 1, ADC_SampleTime_84Cycles );
       
// ADC_ContinuousModeCmd(ADC1,ENABLE);
        ADC_Cmd(ADC1, ENABLE);//&#191;a&#198;&#244;AD×a&#187;&#187;&#198;÷       
       
       
  ADC_DMACmd(ADC1, ENABLE);   
        ADC_DMARequestAfterLastTransferCmd(ADC1, ENABLE);

}                                  
//&#187;&#241;μ&#195;ADC&#214;μ
//ch: @ref ADC_channels
//í¨μà&#214;μ 0~16è&#161;&#214;μ·&#182;&#206;§&#206;a£oADC_Channel_0~ADC_Channel_16
//·μ&#187;&#216;&#214;μ:×a&#187;&#187;&#189;á1&#251;
u16 Get_Adc(u8 ch)   
{
                  //éè&#214;&#195;&#214;&#184;&#182;¨ADCμ&#196;1&#230;&#212;ò×éí¨μà£&#172;ò&#187;&#184;&#246;DòáD£&#172;2é&#209;ùê±&#188;&#228;
        ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_28Cycles );        //ADC1,ADCí¨μà,480&#184;&#246;&#214;ü&#198;ú,ìá&#184;&#223;2é&#209;ùê±&#188;&#228;&#191;éò&#212;ìá&#184;&#223;&#190;&#171;è·&#182;è                            

        ADC_SoftwareStartConv(ADC1);                //ê1&#196;ü&#214;&#184;&#182;¨μ&#196;ADC1μ&#196;èí&#188;t×a&#187;&#187;&#198;&#244;&#182;ˉ1|&#196;ü       
         
        while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//μè′y×a&#187;&#187;&#189;áê&#248;

        return ADC_GetConversionValue(ADC1);        //·μ&#187;&#216;×&#238;&#189;üò&#187;′&#206;ADC11&#230;&#212;ò×éμ&#196;×a&#187;&#187;&#189;á1&#251;
}
//&#187;&#241;è&#161;í¨μàchμ&#196;×a&#187;&#187;&#214;μ£&#172;è&#161;times′&#206;,è&#187;oó&#198;&#189;&#190;ù
//ch:í¨μà±ào&#197;
//times:&#187;&#241;è&#161;′&#206;êy
//·μ&#187;&#216;&#214;μ:í¨μàchμ&#196;times′&#206;×a&#187;&#187;&#189;á1&#251;&#198;&#189;&#190;ù&#214;μ
u16 Get_Adc_Average(u8 ch,u8 times)
{
        u32 temp_val=0;
        u8 t;
        for(t=0;t<times;t++)
        {
                temp_val+=Get_Adc(ch);
                delay_ms(5);
        }
        return temp_val/times;
}




#include "dma.h"                                                                                                                                                     
#include "delay.h"                 


//DMAxμ&#196;&#184;÷í¨μà&#197;&#228;&#214;&#195;
//&#213;aà&#239;μ&#196;′&#171;ê&#228;D&#206;ê&#189;ê&#199;1ì&#182;¨μ&#196;,&#213;aμ&#227;òa&#184;ù&#190;Y2&#187;í&#172;μ&#196;&#199;é&#191;&#246;à′DT&#184;&#196;
//′ó′&#230;′¢&#198;÷->íaéè&#196;£ê&#189;/8&#206;&#187;êy&#190;Y&#191;í&#182;è/′&#230;′¢&#198;÷&#212;&#246;á&#191;&#196;£ê&#189;
//DMA_StreamxMAêy&#190;Yá÷,DMA1_Stream0~7/DMA2_Stream0~7
//chxMAí¨μà&#209;&#161;&#212;&#241;,@ref DMA_channel DMA_Channel_0~DMA_Channel_7
//par:íaéèμ&#216;&#214;·
//mar:′&#230;′¢&#198;÷μ&#216;&#214;·
//ndtr:êy&#190;Y′&#171;ê&#228;á&#191;  
void MYDMA_Config(DMA_Stream_TypeDef *DMA_Streamx,u32 chx,u32 par,u32 mar)
{

        DMA_InitTypeDef  DMA_InitStructure;
       
        if((u32)DMA_Streamx>(u32)DMA2)//μ&#195;μ&#189;μ±&#199;°streamê&#199;ê&#244;óúDMA2&#187;1ê&#199;DMA1
        {
          RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2,ENABLE);//DMA2ê±&#214;óê1&#196;ü
               
        }else
        {
          RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1,ENABLE);//DMA1ê±&#214;óê1&#196;ü
        }
  DMA_DeInit(DMA_Streamx);
       
        while (DMA_GetCmdStatus(DMA_Streamx) != DISABLE){}//μè′yDMA&#191;é&#197;&#228;&#214;&#195;
       
  /* &#197;&#228;&#214;&#195; DMA Stream */
  DMA_InitStructure.DMA_Channel = chx;  //í¨μà&#209;&#161;&#212;&#241;
  DMA_InitStructure.DMA_PeripheralBaseAddr = par;//DMAíaéèμ&#216;&#214;·
  DMA_InitStructure.DMA_Memory0BaseAddr = mar;//DMA ′&#230;′¢&#198;÷0μ&#216;&#214;·
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;//íaéèμ&#189;′&#230;′¢&#198;÷
  DMA_InitStructure.DMA_BufferSize = 4096;//êy&#190;Y′&#171;ê&#228;á&#191;
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//íaéè·&#199;&#212;&#246;á&#191;&#196;£ê&#189;
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//íaéèêy&#190;Y3¤&#182;è:16&#206;&#187;
  DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_HalfWord;//′&#230;′¢&#198;÷êy&#190;Y3¤&#182;è:16&#206;&#187;
  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;// ê1ó&#195;&#209;-&#187;·&#196;£ê&#189;
  DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;//&#214;Dμèó&#197;&#207;è                                    
  DMA_Init(DMA_Streamx, &DMA_InitStructure);//3&#245;ê&#188;&#187;ˉDMA Stream   

}
//&#191;a&#198;&#244;ò&#187;′&#206;DMA′&#171;ê&#228;
//DMA_StreamxMAêy&#190;Yá÷,DMA1_Stream0~7/DMA2_Stream0~7
//ndtr:êy&#190;Y′&#171;ê&#228;á&#191;  
void MYDMA_Enable(DMA_Stream_TypeDef *DMA_Streamx,u16 ndtr)
{

        DMA_Cmd(DMA_Streamx, DISABLE);                      //1&#216;±&#213;DMA′&#171;ê&#228;
       
        while (DMA_GetCmdStatus(DMA_Streamx) != DISABLE){}        //è·±£DMA&#191;éò&#212;±&#187;éè&#214;&#195;  
               
        DMA_SetCurrDataCounter(DMA_Streamx,ndtr);          //êy&#190;Y′&#171;ê&#228;á&#191;  //éè&#214;&#195;′&#171;ê&#228;êy&#190;Yá&#191; &#191;aê&#188;′&#171;ê&#228;

        DMA_Cmd(DMA_Streamx, ENABLE);                      //&#191;a&#198;&#244;DMA′&#171;ê&#228;
}          

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。