求助!!STM32 ADC DMA方式,为什么读不到数据??

2019-07-14 20:34发布

#include "STM32f10x.h"
#include "misc.h"
#include "stm32f10x_usart.h"
#include "stm32f10x_adc.h"
#include "stm32f10x_dma.h"
#include "stdio.h"
#include "delay.h"
u16 ADC_Data[50];
void RCC_Configuration(void);
void GPIO_Configuration(void);
void USART_Configuration(void);
void NVIC_Configuration(void);
void ADC_Configuration(void);
void DMA_Configuration(void);
int fputc(int ch,FILE *f);

int main(void)
{
        u32 data;
        u8 i;
        RCC_Configuration();
        GPIO_Configuration();
        USART_Configuration();
        NVIC_Configuration();
        ADC_Configuration();
        DMA_Configuration();

  while (1)
        {
                data=0;
                for(i=0;i<50;i++)
                  {
                          data=data+ADC_Data[i];
                        }
                  data=data/50;
                        printf("当前数值:%.3f ",(3.3/4095)*data);
                        delay_ms(1000);
                        delay_ms(1000);
                        delay_ms(1000);
                        delay_ms(1000);
  }
}

void RCC_Configuration(void)
{
  SystemInit();//72MHz
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);  
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
        RCC_ADCCLKConfig(RCC_PCLK2_Div6);//6分频,12MHz
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);

}

void GPIO_Configuration(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        //TX
     GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
        GPIO_Init(GPIOA,&GPIO_InitStructure);
       
        //RX
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3;
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;//¸¡¿ÕÊäÈë
        GPIO_Init(GPIOA,&GPIO_InitStructure);
     //PC0;ADC1
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;
        GPIO_Init(GPIOC,&GPIO_InitStructure);
}

void NVIC_Configuration(void)
{
    NVIC_InitTypeDef NVIC_InitStructure;
       
          NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
                NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
                NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
                NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
                NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
                NVIC_Init(&NVIC_InitStructure);
}

void USART_Configuration(void)
{
    USART_InitTypeDef USART_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(USART2,&USART_InitStructure);         
          USART_Cmd(USART2,ENABLE);//´
          USART_ClearFlag(USART1,USART_FLAG_TC);
       
}

int fputc(int ch,FILE *f)
{
    USART_SendData(USART2,(u8)ch);
          while(USART_GetFlagStatus(USART2,USART_FLAG_TXE)==RESET);
          return ch;
}

void ADC_Configuration(void)
{
    ADC_InitTypeDef ADC_InitStructure;
          ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
          ADC_InitStructure.ADC_ScanConvMode = DISABLE;
          ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
          ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
          ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
          ADC_InitStructure.ADC_NbrOfChannel = 1;
          ADC_Init(ADC1, &ADC_InitStructure);
       
          ADC_RegularChannelConfig(ADC1,ADC_Channel_10,1,ADC_SampleTime_239Cycles5);
          ADC_DMACmd(ADC1,ENABLE);
          ADC_Cmd(ADC1,ENABLE);
          ADC_ResetCalibration(ADC1);
          while(ADC_GetResetCalibrationStatus(ADC1));
          ADC_StartCalibration(ADC1);//¿ªÊ¼Ð£×¼
          while(ADC_GetCalibrationStatus(ADC1));
          ADC_SoftwareStartConvCmd(ADC1,ENABLE);//Æô¶¯
}

void DMA_Configuration(void)
{
    DMA_InitTypeDef DMA_InitStructure;
    DMA_DeInit(DMA1_Channel1);
          DMA_InitStructure.DMA_PeripheralBaseAddr=(u32)&ADC1->DR;
          DMA_InitStructure.DMA_MemoryBaseAddr=(u32)ADC_Data;
          DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralSRC;
          DMA_InitStructure.DMA_BufferSize=50;
          DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;
          DMA_InitStructure.DMA_MemoryInc=DMA_PeripheralInc_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);
}


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