问答

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

21ic问答首页 - AT32F403A 使用ADC时候出的问题。

ADC DMA DM ni

AT32F403A 使用ADC时候出的问题。

SWJ212021-01-07
使用ADC 双模式时,程序卡在判断CAL 控制位为零的循环中,在使用ADC双模式时,由于硬件不会清除CAL控制位,可能导致程序会卡在ADC校准函数
while(ADC_GetCalibrationStatus(ADC1));

我没有双使用ADC,还事卡住。

#define Channel_Num  2
#define Sample_Num   1

u16 ADC_ConvertedValue[Sample_Num][Channel_Num];
void ADC_DMA_Config(void)
{

     DMA_InitTypeDef DMA_InitStructure;

     RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

     DMA_DeInit(DMA1_Channel1);

     DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR;

     DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue;

     DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;

     DMA_InitStructure.DMA_BufferSize = Sample_Num*Channel_Num;

     DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外设地址不变

     DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//内存地址递增

     DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;

     DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;

     DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;

     DMA_InitStructure.DMA_Priority = DMA_Priority_High;

     DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;

     DMA_Init(DMA1_Channel1, &DMA_InitStructure);

     //DMA_Cmd(DMA1_Channel1,ENABLE);
     DMA_ClearITPendingBit(DMA1_IT_TC1);//清除DMA通道x中断待处理标志位
     DMA_ITConfig(DMA1_Channel1,DMA_IT_TC, ENABLE);
}

//ADC配置函数
void ADC_Configuration(void)
{
     u16 i;
     ADC_InitTypeDef ADC_InitStructure;

     RCC_ADCCLKConfig(RCC_PCLK2_Div6);   //第二步:设置分频因子 ADC最大速率14M 72/6=12M

     ADC_DeInit(ADC1);  //将外设 ADC1 的全部寄存器重设为默认值
     //配置ADC1
     ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;  //独立模式
     ADC_InitStructure.ADC_ScanConvMode=ENABLE;        //扫描
     ADC_InitStructure.ADC_ContinuousConvMode=ENABLE;
     //ADC_InitStructure.ADC_ContinuousConvMode=DISABLE;
     ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;//无外部触发,即软件触发
     ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;
     ADC_InitStructure.ADC_NbrOfChannel=Channel_Num;//规则转换通道数量
     ADC_Init(ADC1,&ADC_InitStructure);

     //ADC1通道采样配置,使用规则通道1-3
     //测试使用中断方式读数据,采样周期不能太小.实际使用时考虑加DMA处理
     ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_41Cycles5);//ADC8配置为通道1,周期239.5+12.5
     ADC_RegularChannelConfig(ADC1,ADC_Channel_3,2,ADC_SampleTime_41Cycles5);//ADC8配置为通道1,周期239.5+12.5


     //初始化AD缓冲
     for(i=0;i<4;i++)
     {
        AD_value[i]=0;
     }
     //使能ADC1的DMA模式
      ADC_DMACmd(ADC1,ENABLE);
     /* Enable ADC1 */
     ADC_Cmd(ADC1,ENABLE);
     DELAY_1ms();//14*ADCCLK
     ADC_ExternalTrigConvCmd(ADC1, DISABLE); //禁止外部出发ADC转换
     //清除ADC1校准值
     ADC_ResetCalibration(ADC1);
     //等待清除完成
     while(ADC_GetResetCalibrationStatus(ADC1));

     //开始ADC1校准
     ADC_StartCalibration(ADC1);
     //等待校准完成
     //while(ADC_GetCalibrationStatus(ADC1));

     DELAY_10ms();
     DELAY_10ms();

     DMA_Cmd(DMA1_Channel1,ENABLE);
     //开始ADC1转换
     ADC_SoftwareStartConvCmd(ADC1,ENABLE);

  //  ADC_ClearFlag(ADC1,ADC_FLAG_EOC);//清除中断标志
  //  ADC_ITConfig(ADC1,ADC_IT_EOC,ENABLE);//使能中断
}

回答 +关注 17
2207人浏览 2人回答问题 分享 举报
2 个回答

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