[STM32F4]

【f446RE开发板试用】ADC+DMA性能测试

[复制链接]
1626|15
手机看帖
扫描二维码
随时随地手机跟帖
sky.sun.zz|  楼主 | 2015-10-2 22:16 | 显示全部楼层 |阅读模式
本帖最后由 sky.sun.zz 于 2015-10-2 22:20 编辑

    采用ADC3+DMA方式对STM32F446的ADC转换速度进行测试,设置每转换1024个数据后DMA中断,中断函数中对PC10输出取反,通过示波器观察PC10的脉冲宽度得到ADC转换速度。主要代码如下:
void ADC3_CH13_DMA_Config(void)
{ ADC_InitTypeDef        ADC_InitStructure;
  ADC_CommonInitTypeDef  ADC_CommonInitStructure;
  GPIO_InitTypeDef       GPIO_InitStructure;
  NVIC_InitTypeDef NVIC_InitStructure;


  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2 | RCC_AHB1Periph_GPIOC, ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC3, ENABLE);

  DMA_InitStructure.DMA_Channel = DMA_Channel_2;  
  DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC3_DR_ADDRESS;
  DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&uhADC3ConvertedValue;
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
  DMA_InitStructure.DMA_BufferSize = 1024;
  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_FIFOMode = DMA_FIFOMode_Disable;         
  DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
  DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
  DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
  DMA_Init(DMA2_Stream0, &DMA_InitStructure);
  DMA_Cmd(DMA2_Stream0, ENABLE);
    DMA_ITConfig(DMA2_Stream0, DMA_IT_TC, ENABLE);        

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
  NVIC_InitStructure.NVIC_IRQChannel = DMA2_Stream0_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);


  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
  GPIO_Init(GPIOC, &GPIO_InitStructure);


  ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
  ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2;
  ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
  ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;
  ADC_CommonInit(&ADC_CommonInitStructure);

  ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
  ADC_InitStructure.ADC_ScanConvMode = DISABLE;
  ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
  ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
  ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;        
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  ADC_InitStructure.ADC_NbrOfConversion = 1;
  ADC_Init(ADC3, &ADC_InitStructure);
  ADC_RegularChannelConfig(ADC3, ADC_Channel_13, 1, ADC_SampleTime_3Cycles);
  ADC_DMARequestAfterLastTransferCmd(ADC3, ENABLE);
  ADC_DMACmd(ADC3, ENABLE);  
  ADC_Cmd(ADC3, ENABLE);  
}

void DMA2_Stream0_IRQHandler(void)
{
  if(DMA_GetITStatus(DMA2_Stream0,DMA_IT_TCIF0))
         {
        DMA_ClearITPendingBit(DMA2_Stream0,DMA_IT_TCIF0);
        GPIOC->ODR ^=0X0400;
         }
}
实际测试结果ADC转换1024个数据耗时400uS,可见STM32F446是一款性能优秀的MCU.

IMG_1059.JPG





paderboy| | 2015-10-3 00:11 | 显示全部楼层
多谢分享。。。。

使用特权

评论回复
wendysnow| | 2016-7-18 21:11 | 显示全部楼层
楼主有没有完整的工程呀,可以分享一下吗》

使用特权

评论回复
sky.sun.zz|  楼主 | 2016-7-18 22:19 | 显示全部楼层
wendysnow 发表于 2016-7-18 21:11
楼主有没有完整的工程呀,可以分享一下吗》

楼上:最主要的代码都帖上共享了,工程其余部分就不要偷懒敲敲键盘吧,也是个锻炼的机会呀。

使用特权

评论回复
wendysnow| | 2016-7-19 19:33 | 显示全部楼层
sky.sun.zz 发表于 2016-7-18 22:19
楼上:最主要的代码都帖上共享了,工程其余部分就不要偷懒敲敲键盘吧,也是个锻炼的机会呀。 ...

好吧

使用特权

评论回复
wendysnow| | 2016-8-17 20:09 | 显示全部楼层
为什么我用ADC+DMA采集的数据全为零呢,楼主知道这是为什么吗?

使用特权

评论回复
sky.sun.zz|  楼主 | 2016-8-18 13:25 | 显示全部楼层
wendysnow 发表于 2016-8-17 20:09
为什么我用ADC+DMA采集的数据全为零呢,楼主知道这是为什么吗?

你可以检查一下RCC配置中是否已经允许了ADC、DMA时钟。

使用特权

评论回复
wendysnow| | 2016-8-18 20:28 | 显示全部楼层
sky.sun.zz 发表于 2016-8-18 13:25
你可以检查一下RCC配置中是否已经允许了ADC、DMA时钟。

都允许了啊,实在是找不出什么问题,我不用DMA传输也能实现这个,但是感觉精确度好低

使用特权

评论回复
sky.sun.zz|  楼主 | 2016-8-18 20:54 | 显示全部楼层
wendysnow 发表于 2016-8-18 20:28
都允许了啊,实在是找不出什么问题,我不用DMA传输也能实现这个,但是感觉精确度好低 ...

帖子中的代码是运行通过的。你也可参照ST官方例程先下载调试,应该能很快找出原因。

使用特权

评论回复
wendysnow| | 2016-8-18 21:09 | 显示全部楼层
sky.sun.zz 发表于 2016-8-18 20:54
帖子中的代码是运行通过的。你也可参照ST官方例程先下载调试,应该能很快找出原因。 ...

F446和407代码应该不同吧if(DMA_GetITStatus(DMA2_Stream0,DMA_IT_TCIF0)!=RESET)才是进入中断吧,但这样运行并不能进入,写为==RESET才能进入

使用特权

评论回复
sky.sun.zz|  楼主 | 2016-8-19 10:27 | 显示全部楼层
本帖最后由 sky.sun.zz 于 2016-8-19 10:28 编辑

if(DMA_GetITStatus(DMA2_Stream0,DMA_IT_TCIF0))   {
           DMA_ClearITPendingBit(DMA2_Stream0,DMA_IT_TCIF0);
   }

手册上写的很清楚呀: 无标题.jpg

使用特权

评论回复
怎么配置DMA的,在cubeMX。

使用特权

评论回复
sky.sun.zz|  楼主 | 2016-9-9 11:46 | 显示全部楼层
天灵灵地灵灵 发表于 2016-9-9 10:38
怎么配置DMA的,在cubeMX。

ADC_RegularConversion_DMA.rar (63.89 KB)

使用特权

评论回复
travis_li| | 2016-11-9 08:20 | 显示全部楼层
wendysnow 发表于 2016-8-18 20:28
都允许了啊,实在是找不出什么问题,我不用DMA传输也能实现这个,但是感觉精确度好低 ...

我也是这个问题,请问层主解决了吗?

使用特权

评论回复
liaokai| | 2018-10-11 19:48 | 显示全部楼层
多谢分享!

使用特权

评论回复
zhuotuzi| | 2018-10-11 21:57 | 显示全部楼层
看到结构体长长的配置,我就懵了。

使用特权

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

本版积分规则

40

主题

727

帖子

13

粉丝