SWJ21 发表于 2021-1-7 18:04

AT32F403A 使用ADC时候出的问题。

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

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

#define Channel_Num2
#define Sample_Num   1

u16 ADC_ConvertedValue;
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=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);//使能中断
}

WXX菜鸡 发表于 2021-3-18 10:20

AT32F403A 使用ADC时候出的问题。

会不会是这句有问题


ADC_InitStructure.ADC_NbrOfChannel=Channel_Num;//规则转换通道数量

WXX菜鸡 发表于 2021-3-18 11:09

AT32F403A 使用ADC时候出的问题。

ADC_ExternalTrigConvCtrl(ADC1, ENABLE);//外部触发使能—注意,软触发也算外部触发,也需要使能外部触发。
页: [1]
查看完整版本: AT32F403A 使用ADC时候出的问题。