ADC采集两路数据通过DMA传送,buffersize大小限制问题

2019-07-24 13:12发布

1、ADC采集两路模拟电压,通过DMA传送,但是当DMA_InitStructure.DMA_BufferSize=2*TIMES中的TIMES大于19后得到的数值就不准确了。请高手帮忙分析。
2、程序代码:
#include "dma.h"
#include "adc.h"
#include "delay.h"
#define  TIMES  30

u16  PA_DATE[TIMES][2]={0};
u16 PA_DATE_AVE[2]={0};
u16 PA_DATE_AVE1[2]={0};
float PA_DATE_AVE_VOL1[2]={0};

void Dma_Init(void)
{
  DMA_InitTypeDef DMA_InitStructure;
/*******************使能DMA1时钟*******************/
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);
       
        DMA_DeInit(DMA1_Channel1);//复位DMA1通道1
        DMA_InitStructure.DMA_BufferSize=2*TIMES;           //缓存数据个数
        DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralSRC; //以外设为数据源
        DMA_InitStructure.DMA_M2M=DMA_M2M_Disable;       //不使用内存到内存
        DMA_InitStructure.DMA_MemoryBaseAddr=(u32)PA_DATE; //内存中存储DMA传过来的数据基地址
        DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_HalfWord; //内存数据为半字(ADC精度为12)
        DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;             //内存地址要增加
        DMA_InitStructure.DMA_Mode=DMA_Mode_Circular;                     //DMA模式为循环模式
        DMA_InitStructure.DMA_PeripheralBaseAddr=(u32)&ADC1->DR;          //数据源地址,ADC数据寄存器地址
        DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_HalfWord; //外设数据宽度
        DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;    //外设地址不增加
        DMA_InitStructure.DMA_Priority=DMA_Priority_High;                 //DMA优先级高
        DMA_Init(DMA1_Channel1,&DMA_InitStructure);                       //初始化DMA1通道1
       
        DMA_Cmd(DMA1_Channel1,ENABLE);          //使能DMA1通道1
       
}


void Average(void)
{
        u8 i,j;
       
       
        for(i=0;i<2;i++)
        {
                for(j=0;j<TIMES;j++)
                PA_DATE_AVE[i]+=PA_DATE[j][i];
                PA_DATE_AVE[i]/=TIMES;
                PA_DATE_AVE1[i]=PA_DATE_AVE[i];
                PA_DATE_AVE[i]=0;
        }
        for(i=0;i<2;i++)
           PA_DATE_AVE_VOL1[i]=PA_DATE_AVE1[i]*3.28/4096;
       
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。