问答

汇集网友智慧,解决技术难题

21ic问答首页 - APM32F003F4P6休眠后起来重新初始化ADC,无法进行AD转换

ADC AD转换 IO APM32F003 F4 ONFI

APM32F003F4P6休眠后起来重新初始化ADC,无法进行AD转换

zhanxiao2026-04-08
void ADC_Init(void)
{
ADC_Config_T adcConfig;
GPIO_Config_T gpioConfig;
ADC_Reset();/* ADC GPIO configuration *///pd5,pd6 as diff ch3gpioConfig.pin = GPIO_PIN_5|GPIO_PIN_6;//now use and debuggpioConfig.mode = GPIO_MODE_IN_FLOATING;gpioConfig.speed = GPIO_SPEED_10MHz;gpioConfig.intEn=GPIO_EINT_DISABLE;GPIO_Config(GPIOD, &gpioConfig);ADC_ConfigDivider(ADC_DIV_2);//ADC_SetMode(ADC_MODE_SINGLE_END);/* ADC configuration */ADC_ConfigStructInit(&adcConfig);ADC_Config(&adcConfig);
// ADC_EnableInterrupt(ADC_INT_CC);
ADC_ConfigConversionMode(ADC_CONV_MODE_CONTINUOUS);
#if 1
ADC_SetMode(ADC_MODE_DIFF_INPUT);
ADC_SetDiffInputChannel(ADC_DIFF_CHANNEL_VAIN2);
#else
ADC_SetChannel(ADC_CHANNEL_5);
#endif
//
// NVIC_EnableIRQRequest(ADC_IRQn, 0X01);
ADC_Enable();
ADC_StartConversion();
//fg_detect_start=TRUE;
START_TIMER(w_delay_start, TIMER_1MS_3S);
}
上单初始化用这个函数,休眠后起来也用这个函数初始化,发现 if(ADC_ReadStatusFlag(ADC_FLAG_CC) == SET)
这个一直不成立,试过单端模式,也是一样的情况
重新初始化也不行,查看寄存器,配置正常,但是CCF不能被置位,起来后会开启ADC clock
回答 +关注 0
785人浏览 6人回答问题 分享 举报
6 个回答


  • 官方文档里面好像有这么一段,但是CSR找不到
  • zhanxiao 发表于 2026-4-9 09:56
    不休眠正常;不用单通道连续,休眠也正常,用单通道单次触发休眠也正常;
    读adc问题:

    楼主找到原因没?有点奇怪啊,单次可以,连续不行,是不是表象?
  • 不休眠正常;不用单通道连续,休眠也正常,用单通道单次触发休眠也正常;
    读adc问题:

    void ADC_check(void)
    {

                    if(ADC_ReadStatusFlag(ADC_FLAG_CC) == SET)
                    {
                            ADC_ClearStatusFlag(ADC_FLAG_CC);

                    if(fg_detect_start)
                            {
                                    int32_t temp,temp1;
                                   
                                   
                                    temp1= ADC_ReadData();
                                    temp= ((2 * temp1 - 4095) * s_measure_coefficient) /4095;
                                    w_music_val[sample_cnt++] =temp*temp;
                                   
                                            if((sample_cnt>0)&&((sample_cnt%SAMPLE_CNT)==0))
                                            {
                                                    if(sample_cnt==SAMPLE_CNT)
                                                            {
                                                                    fg_need_cal=1;
                                                            }
                                                    else
                                                            {
                                                                    sample_cnt=0;
                                                                    fg_need_cal=2;
                                                            }

                                            }
                                                                           
                            }

                   

        }
    }

  • “ if(ADC_ReadStatusFlag.......” 藏在哪里?

    把“相关”函数也贴出来。 别学崴脚部。
  • 看起来是单通道连续模式的问题,单通道单次采样,没有这个问题
  • 挂载ADC的时钟用的哪个?重新使能看一下?然后把两个GPIO口时钟也重新开启一下试试。

您需要登录后才可以回复 登录 | 注册