打印
[AT32F403/403A]

AT32F403A 使用ADC时候出的问题。

[复制链接]
1891|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
SWJ21|  楼主 | 2021-1-7 18:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ADC, DMA, DM, ni
使用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);//使能中断
}

使用特权

评论回复
沙发
WXX菜鸡| | 2021-3-18 10:20 | 只看该作者

AT32F403A 使用ADC时候出的问题。

会不会是这句有问题


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

使用特权

评论回复
评论
WXX菜鸡 2021-3-18 10:31 回复TA
触发 会不会是这句 ADC_ExternalTrigConvCmd(ADC1, DISABLE); //禁止外部出发ADC转换 
板凳
WXX菜鸡| | 2021-3-18 11:09 | 只看该作者

AT32F403A 使用ADC时候出的问题。

ADC_ExternalTrigConvCtrl(ADC1, ENABLE);//外部触发使能—注意,软触发也算外部触发,也需要使能外部触发。

使用特权

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

本版积分规则

1

主题

2

帖子

0

粉丝