打印
[STM32L1]

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

[复制链接]
6801|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是后面才考虑的事啦!

使用特权

评论回复
5
wanzhilin88|  楼主 | 2016-1-6 11:59 | 只看该作者
mintspring 发表于 2016-1-5 22:13
如果只是简单的转换ADC,可以来考虑使用最新的MBED做,简单好玩。

什么是MBED?没听说过啊。请指教:handshake

使用特权

评论回复
6
泰山特曲123| | 2016-1-6 12:27 | 只看该作者
找个开发板或者官方的例程参考下,或者再仔细读一下用户手册

使用特权

评论回复
7
huangcunxiake| | 2016-1-6 16:58 | 只看该作者
读出来的转换是正确的吗?我之前做过,没有这么弄。

使用特权

评论回复
8
gejigeji521| | 2016-1-6 17:08 | 只看该作者
ADC_State_Temp=HAL_ADC_GetState(&hadc);
那么这个函数返回了什么?不是这么搞的,你搞错了,启动转换后直接通过while判断 HAL_ADC_STATE_EOC   

使用特权

评论回复
9
Garen2| | 2016-1-6 21:16 | 只看该作者
EOC标志置1的条件满足了吗

使用特权

评论回复
10
mintspring| | 2016-1-6 23:05 | 只看该作者
wanzhilin88 发表于 2016-1-6 11:59
什么是MBED?没听说过啊。请指教

你百度搜一下吧,MBED是ARM做的一个基于C++的API框架,把底层全部抽象掉了,再开发代码结构超级简单。

使用特权

评论回复
11
wanzhilin88|  楼主 | 2016-8-24 11:46 | 只看该作者
gejigeji521 发表于 2016-1-6 17:08
ADC_State_Temp=HAL_ADC_GetState(&hadc);
那么这个函数返回了什么?不是这么搞的,你搞错了,启动转换后 ...

HAL_ADC_STATE_EOC  是个常量啊!如直接判断这个量怎么可以啊。

使用特权

评论回复
12
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.多谢啦!

使用特权

评论回复
13
wanzhilin88|  楼主 | 2016-9-20 14:41 | 只看该作者
搞了半天,原来单次转换时,是用HAL_ADC_PollForConversion();
这个函数据去轮询转换状态。

若返回值为:HAL_OK则表示转换完成。然后用HAL_ADC_GetValue();
函数去读数据。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

42

主题

122

帖子

3

粉丝