关于STM32 AD转换的ADC_FLAG_EOC标志位问题

2019-03-23 18:47发布

小弟最近再写STM32的ADC,看了很多网的例程都是用DMA接数据,但是我想直接用AD读到寄存器,再拿出来处理。
在写程序的时候发现个问题,while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)); 这个while循环总是过不去,真心很郁闷……有哪位大神遇到过类似的问题吗? 求帮忙解决下  下面附上我的初始化以及读ADC程序
/************************ADC初始化***************************/
void ADC_Config(void)       
{
        ADC_InitTypeDef ADC_InitStruct;
        GPIO_InitTypeDef GPIO_InitStruct;

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOC, ENABLE);                                           //使能ADC1时钟

        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN;                                                                   //配置对应的ADC通道IO口
        GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3;
        GPIO_Init(GPIOC,&GPIO_InitStruct);

        ADC_DeInit(ADC1);                                                                                                                        //将ADC所有寄存器值恢复默认
        ADC_InitStruct.ADC_Mode = ADC_Mode_Independent;                                                                //ADC1与ADC2工作在独立工作模式
        ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;                                                        //ADC数据右对齐
        ADC_InitStruct.ADC_ContinuousConvMode = ENABLE;                                                        //DISABLE工作在单次模式;ENABLE工作在连续模式
        ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;                                //定义触发方式,此处为软件触发
        ADC_InitStruct.ADC_NbrOfChannel = 1;                                                                                //ADC通道数目
        ADC_InitStruct.ADC_ScanConvMode = ENABLE;                                                                        //ADC工作在单通道还是多通道模式

        ADC_ITConfig(ADC1,ADC_IT_EOC,DISABLE);
        ADC_ClearFlag(ADC1,ADC_FLAG_EOC);
        ADC_Init(ADC1,&ADC_InitStruct);

/***************设置指定ADC的规则组通道,设置它们的转化顺序和采样时间****************/
/***************使能ADC的通道13,采样序列号为1,采样周期为71.5周期*******************/
        ADC_RegularChannelConfig(ADC1,ADC_Channel_11,1,ADC_SampleTime_71Cycles5);
        ADC_Cmd(ADC1,ENABLE);
        ADC_ResetCalibration(ADC1);                                                                                                        //重置ADC的校准寄存器
        while(ADC_GetResetCalibrationStatus(ADC1));                                                                        //获取ADC重置校准寄存器状态,直到校准寄存器重设完成
        ADC_StartCalibration(ADC1);                                                                                                        //开始指定ADC的校准
        while(ADC_GetCalibrationStatus(ADC1));                                                                            //获取指定ADC的校准程序,直到校准完成
        ADC_SoftwareStartConvCmd(ADC1, ENABLE);                                                                            //使能ADC1的软件转换启动功能
               
}

/***********读ADC程序*********************/
void Read_ADC(void)
{
        unsigned short result = 0;
        unsigned short id;
        unsigned char a,b,c,d,i;
        for(i=0;i<1;i++)
        {
                ADC_SoftwareStartConvCmd(ADC1,ENABLE);                                        //启动ADC1转换
/*                do{
                        id = ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC);                        //读取转换标志
                  }while(!id);*/       
                while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));        
                                         
                ADC_SoftwareStartConvCmd(ADC1,DISABLE);                  
                result += ADC_GetConversionValue(ADC1);       
                Delay_ARMJISHU(8000000);
        }
        result = result>>3;                                                                                //取8次平均值
        result = (unsigned int)(((unsigned long)result)*3300>>12);  //把采集到的数值转换成电压数据

        a = result / 1000;
        b = (result - a*1000)/100;
        c = (result - a*1000 - b*100)/10;
        d = result - a*1000 - b*100 - c*10;

        while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
        USART_SendData(USART1, 0x56);
        while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
        while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
        USART_SendData(USART1, 0x3d);
        while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
        while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
        USART_SendData(USART1, a+48);
        while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
        while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
        USART_SendData(USART1,0x2e);
        while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
        while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
        USART_SendData(USART1, b+48);
        while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
        while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
        USART_SendData(USART1, c+48);
        while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
        while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
        USART_SendData(USART1, d+48);
        while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
        while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
        USART_SendData(USART1,0x56);
        while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);       
        while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
        USART_SendData(USART1, 0x0d);
        while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
        while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
        USART_SendData(USART1,0x0a);
        while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);               
} 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。