打印
[AT32F403/403A]

关于AT32F403AVGT7双路ADC同步规则采样,无法复位成功问题

[复制链接]
2223|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
速度看看|  楼主 | 2021-6-9 18:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ADC_InitTypeDef ADC_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);       
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC2, ENABLE);       
        RCC_ADCCLKConfig(RCC_PCLK2_Div6);
       
/* ADC1 寄存器配置 */
        ADC_InitStructure.ADC_Mode = ADC_Mode_RegSimult;                                                     //同步规则模式
        ADC_InitStructure.ADC_ScanConvMode = ENABLE;                                                                     //开启扫描模式
        ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;                                                   //关闭连续转换模式
        ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;                //禁止外部触发ADC转换
        ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;                             //对齐方式,ADC为12位,右对齐方式
        ADC_InitStructure.ADC_NbrOfChannel = DMA1_BufferSize;                                                                        //ADC1开启通道数
        ADC_Init(ADC1, &ADC_InitStructure);

        /* ADC1 regular channels configuration */
        ADC_RegularChannelConfig(ADC1, ADC_Channel_16, 1, ADC_SampleTime_28Cycles5);//CPU_Temperature  CPU内部温度采样(说明:ADC1_16通道是温度传感器)
        ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 2, ADC_SampleTime_28Cycles5);        //BAT电压
        ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 3, ADC_SampleTime_28Cycles5);        //GPAI1 电压
        ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 4, ADC_SampleTime_28Cycles5);        //GPAI2 电压
        ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 5, ADC_SampleTime_28Cycles5);        //GPAI3 电压
        ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 6, ADC_SampleTime_28Cycles5);        //GPAI4 电压
        ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 7, ADC_SampleTime_28Cycles5);        //GPAI5 电压

        /* Enable ADC1 DMA */
        ADC_DMACmd(ADC1, ENABLE);

        /* ADC2 configuration */
        ADC_InitStructure.ADC_Mode = ADC_Mode_RegSimult;                                                           //同步规则模式
        ADC_InitStructure.ADC_ScanConvMode = ENABLE;                                                                     //开启扫描模式
        ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;                                                   //关闭连续转换模式
        ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;         //禁止外部触发ADC转换
        ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;                                  //对齐方式,ADC为12位,右对齐方式
        ADC_InitStructure.ADC_NbrOfChannel = DMA1_BufferSize;                                                      //ADC2开启通道个数
        ADC_Init(ADC2, &ADC_InitStructure);

        /* ADC2 regular channels configuration */
        ADC_RegularChannelConfig(ADC2, ADC_Channel_10, 1, ADC_SampleTime_28Cycles5);//
        ADC_RegularChannelConfig(ADC2, ADC_Channel_6, 2, ADC_SampleTime_28Cycles5);        //
        ADC_RegularChannelConfig(ADC2, ADC_Channel_7, 3, ADC_SampleTime_28Cycles5);        //GPAI7 电压
        ADC_RegularChannelConfig(ADC2, ADC_Channel_14, 4, ADC_SampleTime_28Cycles5);        //GPAI8 电压
        ADC_RegularChannelConfig(ADC2, ADC_Channel_15, 5, ADC_SampleTime_28Cycles5);        //TEMP1 电压
        ADC_RegularChannelConfig(ADC2, ADC_Channel_8, 6, ADC_SampleTime_28Cycles5);        //TEMP2 电压
        ADC_RegularChannelConfig(ADC2, ADC_Channel_1, 7, ADC_SampleTime_28Cycles5);        //GPAI1 电压

        /* Enable ADC2 external trigger conversion */
        ADC_ExternalTrigConvCmd(ADC2, ENABLE);                                      //规则组队,同步模式ADC2是由ADC1触发的

        /* Enable ADC1 DMA */
        ADC_DMACmd(ADC1, ENABLE);

        ADC_TempSensorVrefintCmd(ENABLE);                                           //使能温度传感器和Vrefint

        /* 开启ADC,并校准 */
        ADC_Cmd(ADC1, ENABLE);                                                                                                                                                  //使能ADC1

        ADC_ResetCalibration(ADC1);                                                                                                                                              //复位ADC1校准寄存器

        while(ADC_GetResetCalibrationStatus(ADC1));                                                                                                                       //等待ADC1校准寄存器复位完成

        ADC_StartCalibration(ADC1);                                                                                                                                                                      //开始ADC1校准

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

        ADC_Cmd(ADC2, ENABLE);                                                                                                                                                                    //使能ADC2  

        ADC_ResetCalibration(ADC2);                                                                                                                                                    //复位ADC2校准寄存器       

        while(ADC_GetResetCalibrationStatus(ADC2));                                                                                                                              //等待ADC2校准寄存器复位完成

        ADC_StartCalibration(ADC2);                                                                                                                                                                            //开始ADC2校准

        while(ADC_GetCalibrationStatus(ADC2));                                                                                                                                  //等待ADC2校准完成


使用AT32F403AVG单片机直接替换掉STM32F103VE后,其它的可以直接运行,但就是卡在“while(ADC_GetResetCalibrationStatus(ADC1)); ”这里,把ADC初始化屏蔽后可正常运行,另将同步模式改为单独使用一路ADC独立模式采样也正常

使用特权

评论回复
沙发
muyichuan2012| | 2021-6-9 19:43 | 只看该作者
雅特力官网有移植指南,地址如下https://www.arterytek.com/downlo ... F403A_CH_V1.0.9.pdf


我猜测你应该是遇到了如下问题
3.2.15 使用 ADC 双模式时,程序卡在判断 CAL 控制位为零的循环中
 描述:
 在使用ADC双模式时,由于硬件不会清除CAL控制位,可能导致程序会卡在ADC校准函数while(ADC_GetCalibrationStatus(ADC1));
 解决方法: 修改ADC使能和校准函数顺序,如原ADC初始化函数
解决方法:

原ADC初始化函数写法
ADC_Configuration()
{

ADC_Ctrl(ADC1, ENABLE);

while(ADC_GetCalibrationStatus(ADC1));//程序会死在这里

ADC_Ctrl(ADC2, ENABLE);

while(ADC_GetCalibrationStatus(ADC2));

修改方式
ADC_Configuration()
{

ADC_Ctrl(ADC1, ENABLE);

ADC_Ctrl(ADC2, ENABLE);

while(ADC_GetCalibrationStatus(ADC1));
while(ADC_GetCalibrationStatus(ADC2));


}

}



使用特权

评论回复
板凳
lidi911| | 2021-6-9 20:23 | 只看该作者
这个代码肯定不能直接拿来用的

使用特权

评论回复
地板
hoop| | 2021-6-9 23:14 | 只看该作者
双adc模式时,两个adc都使能后再校准

使用特权

评论回复
5
速度看看|  楼主 | 2021-6-10 16:40 | 只看该作者
muyichuan2012 发表于 2021-6-9 19:43
雅特力官网有移植指南,地址如下https://www.arterytek.com/download/MG0007_Migrating_from_SXX32F103_to_ ...

好的,我试下,谢谢。

使用特权

评论回复
6
别看我照片| | 2021-6-10 18:14 | 只看该作者
爽ADC的话,确实很不错的。

使用特权

评论回复
7
chenqianqian| | 2021-6-11 07:36 | 只看该作者
ST的代码拿过来需要修改

使用特权

评论回复
8
勇者无惧你和我| | 2021-6-11 08:29 | 只看该作者
感谢楼主的分享,确实不错的代码,很规整,也很规范的。

使用特权

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

本版积分规则

3

主题

8

帖子

1

粉丝