微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > ARM技术讨论 > 关于stm32ADC的DMA采样,求大神看程序

关于stm32ADC的DMA采样,求大神看程序

时间:10-02 整理:3721RD 点击:
为什么我的采样老是有问题啊?求大神帮忙看看程序
用的是循环方式采样adc两个通道的值(10跟12), 通过dma来传输两个值。最后通过串口打印出来
void ADC_Configuration(void)
{
    ADC_InitTypeDef ADC_InitStructure;
    RCC_ADCCLKConfig(RCC_PCLK2_Div6);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
    ADC_DeInit(ADC1);
    ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;//ADC1 工作在独立模式
    ADC_InitStructure.ADC_ScanConvMode=ENABLE;// 规定了模数转换工作在扫描模式(多通道)还是单次(单通道)模式
    ADC_InitStructure.ADC_ContinuousConvMode=ENABLE; //规定了模数转换工作在连续还是单次模式
    ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;//转换由软件而不是外部触发启动
    ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;//ADC数据右对
    ADC_InitStructure.ADC_NbrOfChannel=2;  //the number of the channel is 2,
    ADC_Init(ADC1, &ADC_InitStructure);//init dac1
    ADC_DMACmd(ADC1, ENABLE);     
    ADC_RegularChannelConfig(ADC1,ADC_Channel_10,1,ADC_SampleTime_239Cycles5);
    ADC_RegularChannelConfig(ADC1,ADC_Channel_12,2,ADC_SampleTime_239Cycles5);
    ADC_Cmd(ADC1,ENABLE);//使能adc1
    ADC_ResetCalibration(ADC1);     //     重置adc校准寄存器
    while(ADC_GetResetCalibrationStatus(ADC1)==SET);//得到重置校准寄存器状态
    ADC_StartCalibration(ADC1);    // 开始校准
    while(ADC_GetCalibrationStatus(ADC1)); // 得到校准的寄存器的状态
    ADC_SoftwareStartConvCmd(ADC1,ENABLE); //启动软件转换
}

void DMA_Configuration(void)
{
    DMA_InitTypeDef  DMA_InitStructure;
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);//打开DMA1的时钟
    DMA_DeInit(DMA1_Channel1);   
    DMA_InitStructure.DMA_PeripheralBaseAddr=(u32)0x4001244C;
    DMA_InitStructure.DMA_MemoryBaseAddr=(u32)&ADC1_ConvertValue;
    DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralSRC;//配置为外设作为数据的源头
   DMA_InitStructure.DMA_BufferSize=2;//配置DMA通道的DMA缓存的值.感觉这里有问题,什么是dma缓存?如何确定大小?
    DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;//外设地址寄存器不变
    DMA_InitStructure.DMA_MemoryInc=DMA_PeripheralInc_Enable;//内存地址寄存器不变
    DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_HalfWord;
                                            //这里跟寄存器的大小有关系,是16位,故为半字
    DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_HalfWord;
    DMA_InitStructure.DMA_Mode=DMA_Mode_Circular;//循环缓存模式
    DMA_InitStructure.DMA_Priority=DMA_Priority_Medium;//中优先级
    DMA_InitStructure.DMA_M2M=DMA_M2M_Disable;//不设置为内存到内存的传输,外设到内存
   
    DMA_Init(DMA1_Channel1, &DMA_InitStructure); //初始化通道1
    DMA_Cmd(DMA1_Channel1,ENABLE);//使能DMA1通道1
}


    RCC_Configuration();
    GPIO_Configuration();
    Usart_Configuration();
    TIM4_Configuration();
    DMA_Configuration();
    NVIC_Configuration();
    ADC_Configuration();//这部分的配置应该没有问题,问题可能出在主函数和adc和dma的配置中
    printf("\r\n");
    GPIO_WriteBit(GPIOA,GPIO_Pin_1,(BitAction)0xff);
    while(1)
    {
        printf("%d   %d",ADC1_ConvertValue[0],ADC1_ConvertValue[1]);
        printf("\r\n");
        delay_ms(1000);//延时1s
    }                       
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top