[STM32L1] STM32 ADC 转换完成后为什么EOC标志不置1?

[复制链接]
7512|12
 楼主| wanzhilin88 发表于 2016-1-5 16:32 | 显示全部楼层 |阅读模式
  刚开始用STM32L152系列MCU 用ADC检测电压遇到问题。ADC转换完成后EOC并没有置位。程序无法判断什么时候去读转换数据。请大家指点一下。

ADC初始化程序:
void MX_ADC_Init(void)
{
        ADC_ChannelConfTypeDef sConfig;

        __ADC1_CLK_ENABLE();
        hadc.Instance = ADC1;
        hadc.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1;
        hadc.Init.Resolution = ADC_RESOLUTION12b;
        hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT;
        hadc.Init.ScanConvMode = DISABLE;
        hadc.Init.EOCSelection = ADC_EOC_SEQ_CONV;        //single convertion
        hadc.Init.LowPowerAutoWait = ADC_AUTOWAIT_DISABLE;//no LowPower when wait
        hadc.Init.LowPowerAutoPowerOff = ADC_AUTOPOWEROFF_DISABLE;//
        hadc.Init.ChannelsBank = ADC_CHANNELS_BANK_A;                //BANK A
        hadc.Init.ContinuousConvMode = DISABLE;                //do not continuous convertion
        hadc.Init.NbrOfConversion = 1;                                       
        hadc.Init.DiscontinuousConvMode = DISABLE;
        hadc.Init.ExternalTrigConv = ADC_SOFTWARE_START;        //software trriger
        hadc.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;//no external trriger
        hadc.Init.DMAContinuousRequests = DISABLE;                //no DMA request

        if (HAL_ADC_Init(&hadc) != HAL_OK)
        {
                while(1);
        }

        sConfig.Channel = ADC_CHANNEL_10;
        sConfig.Rank = 1;
        sConfig.SamplingTime = ADC_SAMPLETIME_4CYCLES;
        if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK)
        {
                while(1);
        }       

        HAL_ADC_Start(&hadc);
}


主程序:

int main(void)
{
        HAL_Init();
        SystemClock_Config2();
        MX_GPIO_Init();
        MX_ADC_Init();
       
        while (1)
        {
                __nop();
                __nop();
                __nop();
                __nop();
               
                ADC_State_Temp=HAL_ADC_GetState(&hadc);
               
                if(ADC_State_Temp==HAL_ADC_STATE_EOC)      //读不到标志
                {
                        ADC1_Value_Temp=HAL_ADC_GetState(&hadc);
                        HAL_ADC_Start(&hadc);
                        HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_11);
                }
        }
}
forgot 发表于 2016-1-5 16:56 | 显示全部楼层
可以尝试下用DMA吧
mintspring 发表于 2016-1-5 22:13 | 显示全部楼层
如果只是简单的转换ADC,可以来考虑使用最新的MBED做,简单好玩。
 楼主| wanzhilin88 发表于 2016-1-6 11:58 | 显示全部楼层
forgot 发表于 2016-1-5 16:56
可以尝试下用DMA吧

我现在只想知道出现问题的原因。用不用DMA是后面才考虑的事啦!
 楼主| wanzhilin88 发表于 2016-1-6 11:59 | 显示全部楼层
mintspring 发表于 2016-1-5 22:13
如果只是简单的转换ADC,可以来考虑使用最新的MBED做,简单好玩。

什么是MBED?没听说过啊。请指教:handshake
泰山特曲123 发表于 2016-1-6 12:27 来自手机 | 显示全部楼层
找个开发板或者官方的例程参考下,或者再仔细读一下用户手册
huangcunxiake 发表于 2016-1-6 16:58 | 显示全部楼层
读出来的转换是正确的吗?我之前做过,没有这么弄。
gejigeji521 发表于 2016-1-6 17:08 | 显示全部楼层
ADC_State_Temp=HAL_ADC_GetState(&hadc);
那么这个函数返回了什么?不是这么搞的,你搞错了,启动转换后直接通过while判断 HAL_ADC_STATE_EOC   
Garen2 发表于 2016-1-6 21:16 | 显示全部楼层
EOC标志置1的条件满足了吗
mintspring 发表于 2016-1-6 23:05 | 显示全部楼层
wanzhilin88 发表于 2016-1-6 11:59
什么是MBED?没听说过啊。请指教

你百度搜一下吧,MBED是ARM做的一个基于C++的API框架,把底层全部抽象掉了,再开发代码结构超级简单。
 楼主| wanzhilin88 发表于 2016-8-24 11:46 | 显示全部楼层
gejigeji521 发表于 2016-1-6 17:08
ADC_State_Temp=HAL_ADC_GetState(&hadc);
那么这个函数返回了什么?不是这么搞的,你搞错了,启动转换后 ...

HAL_ADC_STATE_EOC  是个常量啊!如直接判断这个量怎么可以啊。
 楼主| wanzhilin88 发表于 2016-8-24 11:52 | 显示全部楼层
gejigeji521 发表于 2016-1-6 17:08
ADC_State_Temp=HAL_ADC_GetState(&hadc);
那么这个函数返回了什么?不是这么搞的,你搞错了,启动转换后 ...

哦,明白了,是判断hadc.State==HAL_ADC_STATE_EOC.多谢啦!
 楼主| wanzhilin88 发表于 2016-9-20 14:41 | 显示全部楼层
搞了半天,原来单次转换时,是用HAL_ADC_PollForConversion();
这个函数据去轮询转换状态。

若返回值为:HAL_OK则表示转换完成。然后用HAL_ADC_GetValue();
函数去读数据。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

43

主题

127

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部