dma ADC 多次采集

2019-08-14 06:46发布

本帖最后由 neuangel 于 2017-8-1 14:59 编辑

遇到的问题:
只能开机采样一次,然后dma无法多次取得采样结果



/****************ADC_INIT*************************/void Adc1_Init(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        ADC_InitTypeDef ADC_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_ADC1,ENABLE);

        
         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;                                 //PA1端口配置,控制电路被采样部分开始上电
         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;                  //推挽输出
         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 //IO口速度为50MHz
         GPIO_Init(GPIOA, &GPIO_InitStructure);        
        RCC_ADCCLKConfig(RCC_PCLK2_Div6);        
        ADC_DeInit(ADC1);
        ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;

        ADC_InitStructure.ADC_ContinuousConvMode=ENABLE;//DMA循环扫描
        
        ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;
        ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;
        ADC_InitStructure.ADC_NbrOfChannel=1;

        ADC_InitStructure.ADC_ScanConvMode=DISABLE;
        ADC_Init(ADC1,&ADC_InitStructure);
        
        ADC_RegularChannelConfig(ADC1,ADC_Channel_1,1,ADC_SampleTime_239Cycles5);
        ADC_Cmd(ADC1,ENABLE);
        ADC_DMACmd(ADC1,ENABLE);
        
        ADC_ResetCalibration(ADC1);
        while(ADC_GetResetCalibrationStatus(ADC1));
        ADC_StartCalibration(ADC1);        
        while(ADC_GetCalibrationStatus(ADC1));        

        ADC_SoftwareStartConvCmd(ADC1,ENABLE);//启动        
        
}

/***********************DMA_ADC_CONFIG***************************************/


void DMA_ADC_Enable(DMA_Channel_TypeDef* DMA_CHx,u32 cpar,u32 cmar,u16 cndtr)
{
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);        //使能DMA传输
        
    DMA_DeInit(DMA_CHx);   //将DMA的通道1寄存器重设为缺省值
        DMA_InitStructure.DMA_PeripheralBaseAddr                 =                 cpar;  //DMA外设ADC基地址
        DMA_InitStructure.DMA_MemoryBaseAddr                 =                 cmar;;  //DMA内存基地址
        DMA_InitStructure.DMA_DIR                                         =                DMA_DIR_PeripheralSRC;        //外设为源地址
        DMA_InitStructure.DMA_BufferSize                                =                 cndtr;  //DMA通道的DMA缓存的大小
        DMA_InitStructure.DMA_PeripheralInc                         =                 DMA_PeripheralInc_Disable;  //外设地址寄存器不变
        DMA_InitStructure.DMA_MemoryInc                         =                 DMA_MemoryInc_Disable;  //内存地址寄存器递增
        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_High; //DMA通道 x拥有中优先级
        DMA_InitStructure.DMA_M2M                                 =                 DMA_M2M_Disable;  //DMA通道x没有设置为内存到内存传输
        DMA_Init(DMA_CHx, &DMA_InitStructure);  //根据DMA_InitStruct中指定的参数初始化DMA的通道USART1_Tx_DMA_Channel
         DMA_Cmd(DMA_CHx, ENABLE);  //使能USART1 TX DMA1 所指示的通道

}

/**************************MAIN********************************/
vu16 temp_adc1;

int main(void )
{
     Adc1_init();
     DMA_ADC_Enable(DMA1_Channel1,(u32)&ADC1->DR,(u32)&temp_adc1,1);
    while(1)

    {

           printf("temp_adc1_dma  =   %f ",(float)temp_adc1*3.3/4096);
      /*******************************************************************************
          问题:temp_adc1采集到的数值是开机时的数值,不变化,我的想法是,实时采集adc的数据


          我也曾尝试:是不是adc采样一次, 就关闭了,然后按照下面的各种测试,均不可
                      //                DMA_Cmd(DMA1_Channel1, ENABLE);
                      //                delay_ms(10);
                      //                ADC_Cmd(ADC1,ENABLE);
                     //                ADC_SoftwareStartConvCmd(ADC1,ENABLE);



      ***********************************************************************************/

     }
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
neuangel
1楼-- · 2019-08-14 10:38
翼间 发表于 2017-8-2 10:14
DMA_InitStructure.DMA_MemoryInc                         =                 DMA_MemoryInc_Disable;  ...

应该是 disable 吧,我传到指定的temp_adc1这里,固定的地址呢,

//后面是之前的 注释
neuangel
2楼-- · 2019-08-14 15:36
              //                DMA_Cmd(DMA1_Channel1, ENABLE);
                      //                delay_ms(10);
                      //                ADC_Cmd(ADC1,ENABLE);
                     //                ADC_SoftwareStartConvCmd(ADC1,ENABLE);

这几行命令,后面都跟有使能关闭


                     //                DMA_Cmd(DMA1_Channel1, DISABLE);
                      //                delay_ms(10);
                      //                ADC_Cmd(ADC1,DISABLE);
                     //                ADC_SoftwareStartConvCmd(ADC1,DISABLE);
neuangel
3楼-- · 2019-08-14 17:49
 精彩回答 2  元偷偷看……
neuangel
4楼-- · 2019-08-14 20:15
再顶一次
翼间
5楼-- · 2019-08-14 23:39
先初始化DMA,但不要使能DMA,再初始化ADC,开始ADC转换,再使能DMA试试看,目前就这个程序跟我的也就是顺序有点差别而已。但我的正常。
neuangel
6楼-- · 2019-08-15 01:32
翼间 发表于 2017-8-1 16:58
先初始化DMA,但不要使能DMA,再初始化ADC,开始ADC转换,再使能DMA试试看,目前就这个程序跟我的也就是顺 ...

按照你的方法试了,还是不行

一周热门 更多>