STM32F072--ADC-DMA多路采集数据混乱

2019-07-21 03:33发布

没路单独测试偶没有问题,连续采集就会出现数据混乱,求指教!!! unsigned int after_value[5];
unsigned int average_value[5]; #define ADC1_DR_ADDRESS     ((uint32_t)0x40012440)
void ADC_DMA_Config(void)

      GPIO_InitTypeDef  GPIO_InitStructure;
      ADC_InitTypeDef   ADC_InitStructure;
      DMA_InitTypeDef   DMA_InitStructure;
 
      ADC_DeInit(ADC1);
      /* RCC Config */
      RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
      RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
      RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
  
      /* GPIO Config */
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_3|GPIO_Pin_6|GPIO_Pin_7;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
      GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
      GPIO_Init(GPIOA, &GPIO_InitStructure);
 
 
       /* DMA1 Config */
       DMA_DeInit(DMA1_Channel1);
       DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC1_DR_ADDRESS;
       DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&after_value;
       DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
       DMA_InitStructure.DMA_BufferSize = 5;
       DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
       DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
       DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
       DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
       DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
       DMA_InitStructure.DMA_Priority = DMA_Priority_High;
       DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
       DMA_Init(DMA1_Channel1, &DMA_InitStructure);
  
       DMA_Cmd(DMA1_Channel1, ENABLE);
  
       ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular);
  
       ADC_DMACmd(ADC1, ENABLE);//Enable ADC_DMA
  
       /* ADC1 Config */
       ADC_StructInit(&ADC_InitStructure);
       ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
       ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
       ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
       //ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_TRGO;
       ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
       ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Upward;
       ADC_Init(ADC1, &ADC_InitStructure); 
  
       ADC_ChannelConfig(ADC1, ADC_Channel_0, ADC_SampleTime_239_5Cycles);
       ADC_ChannelConfig(ADC1, ADC_Channel_1, ADC_SampleTime_239_5Cycles);
       ADC_ChannelConfig(ADC1, ADC_Channel_3, ADC_SampleTime_239_5Cycles);
       ADC_ChannelConfig(ADC1, ADC_Channel_6, ADC_SampleTime_239_5Cycles);
       ADC_ChannelConfig(ADC1, ADC_Channel_7, ADC_SampleTime_239_5Cycles);
   
       ADC_GetCalibrationFactor(ADC1);
      
       ADC_Cmd(ADC1, ENABLE);
  
       while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADRDY));
  
       ADC_StartOfConversion(ADC1);
}
void Read_ADC(void)
{
    unsigned char a,b,c,d,i;
 
    for(i=0;i<M;i++)
    {      
       while((DMA_GetFlagStatus(DMA1_FLAG_TC1)) == RESET);//Test DMA1 TC flag 
       DMA_ClearFlag(DMA1_FLAG_TC1);//Clear DMA TC flag      
       average_value = (unsigned int)((after_value*3342)/0x0FFF); 
    
       a = average_value/1000;
       b = (average_value - a*1000)/100;
       c = (average_value - a*1000 - b*100)/10;
       d = average_value - a*1000 - b*100 - c*10;
       USART_Put_Char(0x56);//"V"
       USART_Put_Char(i+48);
       USART_Put_Char(0x3D);//"="
       USART_Put_Char(a+48);
       USART_Put_Char(0x2e);//"."
       USART_Put_Char(b+48);
       USART_Put_Char(c+48);
       USART_Put_Char(d+48);
       USART_Put_Char(0x56);//"V"
       USART_Put_Char(0xD);
       USART_Put_Char(0xA);   
  }
}

void USART_Config()
{
  GPIO_InitTypeDef   GPIO_InitStructure;
  USART_InitTypeDef USART_InitStructure;
 
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
 
  GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_1);
  GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_1);
 
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_10;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA,&GPIO_InitStructure);
 
  USART_InitStructure.USART_BaudRate = 9600;
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  USART_InitStructure.USART_StopBits = USART_StopBits_1;
  USART_InitStructure.USART_Parity = USART_Parity_No;
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//
  USART_InitStructure.USART_Mode = USART_Mode_Rx|USART_Mode_Tx;
  USART_Init(USART1,&USART_InitStructure);//?®??????
  //USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
  USART_Cmd(USART1,ENABLE);
}
void USART_Put_Char(unsigned char ch)
{
   USART_SendData(USART1,ch);
  while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
}

int main(void)
{
   ADC_DMA_Config();
   USART_Config();
 
    while(1)
  {     
        delay_s(1);
        Read_ADC(); 
        USART_Put_Char(0xD);
        USART_Put_Char(0xA);
  }
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
11条回答
goodgft
1楼-- · 2019-07-21 23:16
原子哥在吗,帮忙看看,谢谢了!!!
shenhao7752376
2楼-- · 2019-07-22 01:23
哥们我寄存器的可以看懂库函数有点不懂我有多路采集的但是寄存器的 需要告诉我
dajin1234
3楼-- · 2019-07-22 04:43
ADC_DeInit(ADC1);
ADC_StructInit(&ADC_InitStructure);
配置之前加入以上两个函数,应该会解决数据错乱, 但是我在使用stm32f0时遇到,adc校准无效,和没有校准一个效果,gnd都会飘十几个值
Mrjiang
4楼-- · 2019-07-22 08:54
 精彩回答 2  元偷偷看……
简易c51
5楼-- · 2019-07-22 11:20
请问你最后怎么解决这个问题的?

一周热门 更多>