GD32与STM32的ADC差距?

[复制链接]
 楼主| 发表于 2013-8-27 21:47 | 显示全部楼层 |阅读模式
ADC, hz, RS, AC
不知道大家在使用GD32的ADC的时候,是否有遇到过问题?我在STM芯片上运行正常的代码,修改HSE_STARTUP_TIMEOUT后,下载到GD的片子,ADC功能就不正常了。发现AD转换后的值全部都为0了,包括内部温度传感器和内部参考。找了GD的AN003,
QQ图片20130827213856.jpg 下面56MHz的ADC Prescaler应该为4。
GD32的ADC conversion rates up to 1 MHz。
而ST的ADC使用时,分频值可以为2的。ADC conversion time:– STM32F103xx performance line devices: 1 μs at 56 MHz (1.17 μs at 72 MHz)

我把ADC分频改为8以后,发现结果还是不正确。

是不是GD32的ADC与STM32的ADC还是有些性能差距的?
发表于 2013-8-27 23:20 | 显示全部楼层
这个ADC还没有测试呢。
发表于 2013-8-27 23:27 | 显示全部楼层
仅供参考:
关于GD到STM32的移植,主要在修改“#define HSE_STARTUP_TIMEOUT”,大部分的情况下是可以直接运行的。
GD&STM32虽然使用同样的ARM框架内核、同样的管脚定义做到PIN-TO-PIN,但由于内部结构存在差异,尤其是GD芯片执行效率和速度的提高(for循环或while循环做精确定时的,定时时间会由于代码执行速度加快而使循环的时间变短),存在时序上的差异,还需在特定场景应用下做适当的延时。

关于GD32--STM32的延时,亟待高手指点
发表于 2013-8-27 23:30 | 显示全部楼层
修改HSE_STARTUP_TIMEOUT后,后面程序是否一直调用头文件?是否另作单独定义?这个都是需要检查的
 楼主| 发表于 2013-8-28 08:56 | 显示全部楼层
tonydong 发表于 2013-8-27 23:30
修改HSE_STARTUP_TIMEOUT后,后面程序是否一直调用头文件?是否另作单独定义?这个都是需要检查的 ...

我检查过了,ADC这块没有调用HSE_STARTUP_TIMEOUT宏定义的。
 楼主| 发表于 2013-8-28 08:56 | 显示全部楼层
求官方解释GD32与STM32的ADC差异
发表于 2013-8-28 09:15 | 显示全部楼层
zhxi 发表于 2013-8-28 08:56
我检查过了,ADC这块没有调用HSE_STARTUP_TIMEOUT宏定义的。

那就必须做延时.....
发表于 2013-8-28 09:32 | 显示全部楼层

关于 ADC 有三点需要注意,在 ADC APP DOC 里面有介绍。

1.在ADC ADON 置为 1 后需要等待一段时间,具体请看文档(楼主遇到的估计就是该问题)。

2.GD的ADC 在使用软件触发时,需要手动清 EOC。


3.采样时间和外部输入阻抗计算方法与ST不同。
发表于 2013-8-28 09:42 | 显示全部楼层
发表于 2013-8-28 09:50 | 显示全部楼层
系统时钟多少?
ADON后需要加延时
 楼主| 发表于 2013-8-28 11:01 | 显示全部楼层
转换速度与ST的是不是也不同的?
 楼主| 发表于 2013-8-28 11:08 | 显示全部楼层
  1. void Temp_Init(void)
  2. {
  3.         ADC_InitTypeDef ADC_InitStructure;
  4.         GPIO_InitTypeDef GPIO_InitStructure;
  5.         DMA_InitTypeDef DMA_InitStructure;
  6.         /* ADCCLK = PCLK2/2 */
  7.         RCC_ADCCLKConfig(RCC_PCLK2_Div8);
  8.         /* Enable peripheral clocks ------------------------------------------------*/
  9.         /* Enable DMA1 clock */
  10.         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

  11.         /* Enable ADC1 and GPIOC clock */
  12.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOA, ENABLE);

  13.         /* Configure PA.00 PA.01(ADC Channel0 1) as analog input -------------------------*/
  14.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
  15.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  16.         GPIO_Init(GPIOA, &GPIO_InitStructure);

  17.         /* DMA1 channel1 configuration ----------------------------------------------*/
  18.         DMA_DeInit(DMA1_Channel1);
  19.         DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;
  20.         DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)ADCConvertedValue;
  21.         DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
  22.         DMA_InitStructure.DMA_BufferSize = ADC1_Buf_Len*4;
  23.         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  24.         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  25.         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
  26.         DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
  27.         DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
  28.         DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  29.         DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
  30.         DMA_Init(DMA1_Channel1, &DMA_InitStructure);

  31.         /* Enable DMA1 channel1 */
  32.         DMA_Cmd(DMA1_Channel1, ENABLE);

  33.         /* ADC1 configuration ------------------------------------------------------*/
  34.         ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
  35.         ADC_InitStructure.ADC_ScanConvMode = ENABLE;
  36.         ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
  37.         ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
  38.         ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  39.         ADC_InitStructure.ADC_NbrOfChannel = 4;
  40.         ADC_Init(ADC1, &ADC_InitStructure);

  41.         ADC_TempSensorVrefintCmd(ENABLE);

  42.         /* ADC1 regular channel0 1 configuration */
  43.         ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5);
  44.         ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_55Cycles5);
  45.         ADC_RegularChannelConfig(ADC1, ADC_Channel_16, 3, ADC_SampleTime_55Cycles5);
  46.         ADC_RegularChannelConfig(ADC1, ADC_Channel_17, 4, ADC_SampleTime_55Cycles5);

  47.         /* Enable ADC1 DMA */
  48.         ADC_DMACmd(ADC1, ENABLE);

  49.         /* Enable ADC1 */
  50.         ADC_Cmd(ADC1, ENABLE);

  51.         /* Enable ADC1 reset calibration register */   
  52.         ADC_ResetCalibration(ADC1);
  53.         /* Check the end of ADC1 reset calibration register */
  54.         while(ADC_GetResetCalibrationStatus(ADC1));

  55.         /* Start ADC1 calibration */
  56.         ADC_StartCalibration(ADC1);
  57.         /* Check the end of ADC1 calibration */
  58.         while(ADC_GetCalibrationStatus(ADC1));
  59.        
  60.         /* Start ADC1 Software Conversion */
  61.         ADC_SoftwareStartConvCmd(ADC1, ENABLE);
  62. }

 楼主| 发表于 2013-8-28 11:08 | 显示全部楼层
在“ADC_Cmd(ADC1, ENABLE);”后增加延时?
 楼主| 发表于 2013-8-28 11:10 | 显示全部楼层
在“ADC_SoftwareStartConvCmd(ADC1, ENABLE);”增加“ADC_ClearFlag(ADC1,ADC_FLAG_EOC);”?
发表于 2013-8-28 11:13 | 显示全部楼层
Ln59之后加延时

Ln52,Ln53:采样时间应该为17.1us
 楼主| 发表于 2013-8-28 14:19 | 显示全部楼层
需要增加“ADC_ClearFlag(ADC1,ADC_FLAG_EOC);”语句吗?
发表于 2013-8-28 15:22 | 显示全部楼层
从已经贴出的代码来看,无法确定是否需要增加ADC_ClearFlag,因与之无关。

已有代码经过前述3处修改之后,程序运行有结果了吗?
 楼主| 发表于 2013-8-28 15:40 | 显示全部楼层
还没试,晚上好好试试。谢谢各位
发表于 2013-8-28 16:35 | 显示全部楼层
GD32-ADC文档,仅供参考

GD32F10xxx - AN003 ADC Application Note.pdf

196.7 KB, 下载次数: 701

 楼主| 发表于 2013-8-28 20:00 | 显示全部楼层
tonydong 发表于 2013-8-28 16:35
GD32-ADC文档,仅供参考

谢谢楼上的,这个文件我已经有了。希望对其他用户有帮助。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

34

主题

146

帖子

1

粉丝
快速回复 返回顶部 返回列表