搜索

[AT32F403/403A] 关于AT32F403AVGT7双路ADC同步规则采样,无法复位成功问题

[复制链接]
359|7
速度看看|  楼主 | 2021-6-9 18:33 | 显示全部楼层 |阅读模式
  1. ADC_InitTypeDef ADC_InitStructure;
  2.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);       
  3.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
  4.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC2, ENABLE);       
  5.         RCC_ADCCLKConfig(RCC_PCLK2_Div6);
  6.        
  7. /* ADC1 寄存器配置 */
  8.         ADC_InitStructure.ADC_Mode = ADC_Mode_RegSimult;                                                     //同步规则模式
  9.         ADC_InitStructure.ADC_ScanConvMode = ENABLE;                                                                     //开启扫描模式
  10.         ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;                                                   //关闭连续转换模式
  11.         ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;                //禁止外部触发ADC转换
  12.         ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;                             //对齐方式,ADC为12位,右对齐方式
  13.         ADC_InitStructure.ADC_NbrOfChannel = DMA1_BufferSize;                                                                        //ADC1开启通道数
  14.         ADC_Init(ADC1, &ADC_InitStructure);

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

  23.         /* Enable ADC1 DMA */
  24.         ADC_DMACmd(ADC1, ENABLE);

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

  33.         /* ADC2 regular channels configuration */
  34.         ADC_RegularChannelConfig(ADC2, ADC_Channel_10, 1, ADC_SampleTime_28Cycles5);//
  35.         ADC_RegularChannelConfig(ADC2, ADC_Channel_6, 2, ADC_SampleTime_28Cycles5);        //
  36.         ADC_RegularChannelConfig(ADC2, ADC_Channel_7, 3, ADC_SampleTime_28Cycles5);        //GPAI7 电压
  37.         ADC_RegularChannelConfig(ADC2, ADC_Channel_14, 4, ADC_SampleTime_28Cycles5);        //GPAI8 电压
  38.         ADC_RegularChannelConfig(ADC2, ADC_Channel_15, 5, ADC_SampleTime_28Cycles5);        //TEMP1 电压
  39.         ADC_RegularChannelConfig(ADC2, ADC_Channel_8, 6, ADC_SampleTime_28Cycles5);        //TEMP2 电压
  40.         ADC_RegularChannelConfig(ADC2, ADC_Channel_1, 7, ADC_SampleTime_28Cycles5);        //GPAI1 电压

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

  43.         /* Enable ADC1 DMA */
  44.         ADC_DMACmd(ADC1, ENABLE);

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

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

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

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

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

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

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

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

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

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

  56.         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都使能后再校准

使用特权

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

好的,我试下,谢谢。

使用特权

评论回复
别看我照片| | 2021-6-10 18:14 | 显示全部楼层
爽ADC的话,确实很不错的。

使用特权

评论回复
chenqianqian| | 2021-6-11 07:36 | 显示全部楼层
ST的代码拿过来需要修改

使用特权

评论回复
感谢楼主的分享,确实不错的代码,很规整,也很规范的。

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 我要提问 投诉建议 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

本版热帖

本版活跃用户

优质原创写原创,赢大奖

编辑推荐

  • 1 wolfe_yu 得到打赏 ¥180.00
  • 2 最美葫芦娃 得到打赏 ¥155.00
  • 3 hk386 得到打赏 ¥75.00
  • 4 火星国务卿 得到打赏 ¥63.00
  • 5 两只袜子 得到打赏 ¥56.00
  • 6 laocuo1142 得到打赏 ¥50.00
  • 7 linghz 得到打赏 ¥45.00
  • 8 gaon2 得到打赏 ¥45.00
  • 9 ezcui 得到打赏 ¥45.00
  • 10 jlc317 得到打赏 ¥40.00
在线客服 快速回复 返回顶部 返回列表