打印
[STM32F4]

STM32F429的AD转换程序有时会死在while

[复制链接]
670|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
onlycook|  楼主 | 2024-1-26 10:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ADC程序如下:
void ADCInit(void)
{
  GPIO_InitTypeDef  GPIO_InitStructure;
  ADC_CommonInitTypeDef ADC_CommonInitStructure;
  ADC_InitTypeDef       ADC_InitStructure;
        
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
        
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,ENABLE);         
  RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,DISABLE);        

  ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
  ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;
  ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
  ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4;
  ADC_CommonInit(&ADC_CommonInitStructure);
        
  ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
  ADC_InitStructure.ADC_ScanConvMode = DISABLE;
  ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
  ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  ADC_InitStructure.ADC_NbrOfConversion = 1;
  ADC_Init(ADC1, &ADC_InitStructure);
        
  ADC_Cmd(ADC1, ENABLE);
}


u16 Get_Adc(u8 ch)   
{
        ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_480Cycles );                    

        ADC_SoftwareStartConv(ADC1);
         
        while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));
        
        return (ADC_GetConversionValue(ADC1));        
}


程序有时会死在while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ))中,大家有没有遇到这个问题。通过仿真看到ADC_SR值为0x00000030,表示发生溢出。

使用特权

评论回复
沙发
yzzly| | 2024-1-26 17:16 | 只看该作者
没有及时读取转换结果吧!

使用特权

评论回复
板凳
米多0036| | 2024-1-27 02:13 | 只看该作者
看起来你的ADC程序在等待转换完成时可能会陷入死循环,导致程序无法继续执行。
可能是ADC转换时发生了溢出引起的。
可以在while循环之前添加一个超时计数器,那样可以确定时间内退出循环,避免死锁。
#define MAX_ADC_WAIT_COUNT 10000  // 设置一个最大等待次数,防止死循环

u16 Get_Adc(u8 ch)   
{
    ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_480Cycles );                    
    ADC_SoftwareStartConv(ADC1);
   
    uint32_t waitCount = 0;
   
    while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ) && (waitCount < MAX_ADC_WAIT_COUNT))
    {
        waitCount++;
    }
   
    if(waitCount >= MAX_ADC_WAIT_COUNT)
    {
        // 添加处理超时的代码,例如打印一条调试信息
        // 可以尝试重新初始化ADC,或者查找其他解决方法
    }
   
    return ADC_GetConversionValue(ADC1);        
}

尝试修改来一下,可以试试是否行得通。

使用特权

评论回复
地板
jcky001| | 2024-1-27 13:18 | 只看该作者
可能硬件问题

使用特权

评论回复
5
两只袜子| | 2024-1-27 13:18 | 只看该作者
检查ADC的配置

使用特权

评论回复
6
cr315| | 2024-1-27 13:19 | 只看该作者
检查ADC初始化代码

使用特权

评论回复
7
elephant00| | 2024-1-27 13:19 | 只看该作者
固件/库问题

使用特权

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

本版积分规则

438

主题

1657

帖子

3

粉丝