[STM32] 关于stm32用DMA传输ADC的问题请教

[复制链接]
 楼主| 涵潇舒雅 发表于 2013-11-29 19:11 | 显示全部楼层 |阅读模式
本帖最后由 涵潇舒雅 于 2013-11-29 19:15 编辑

首先介绍一下大体功能,我用的是adc1 通道1,2,3.利用DMA将采集到的数据保存到下面的二维数组里面;
vu16 ADC_RCVTab[10][3] ;//保存ADC的转换值
这是DMA的配置
  1. RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);        //开启DMA时钟
  2.         
  3.         DMA_DeInit(DMA1_Channel1);         //将DMA的通道1寄存器重设为缺省值

  4.         Dma_InitStructure.DMA_PeripheralBaseAddr = (u32)&ADC1->DR;//ADC1_DR_Address;  //DMA外设ADC基地址
  5.         Dma_InitStructure.DMA_MemoryBaseAddr = (u32)ADC_RCVTab;  //DMA内存基地址
  6.         Dma_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;  //数据传输方向,从外设读取发送到内存
  7.         Dma_InitStructure.DMA_BufferSize = 30;  //DMA通道的DMA缓存的大小
  8.         Dma_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;  //外设地址寄存器不变
  9.         Dma_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;  //内存地址寄存器递增
  10.         Dma_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;  //外设数据宽度为16位
  11.         Dma_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; //内存数据宽度为16位
  12.         Dma_InitStructure.DMA_Mode = DMA_Mode_Circular;  //工作在循环模式
  13.         Dma_InitStructure.DMA_Priority = DMA_Priority_High; //DMA通道 x拥有高优先级
  14.         Dma_InitStructure.DMA_M2M = DMA_M2M_Disable;  //DMA通道x没有设置为内存到内存传输
  15.         DMA_Init(DMA1_Channel1, &Dma_InitStructure);  //根据DMA_InitStruct中付ǖ牟问跏蓟疍MA的通道USART1_Tx_DMA_Channel所标识的寄存器
  16.         DMA_Cmd(DMA1_Channel1, ENABLE);
  1. ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;        //ADC工作模式:ADC1和ADC2工作在独立模式
  2.         ADC_InitStructure.ADC_ScanConvMode = ENABLE;        //工作在扫描模式
  3.         ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;        //模数转换工作在连续转换模式
  4.         ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T2_CC2;        //定时器TIM2_CH2触发
  5.         ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;        //ADC数据右对齐
  6.         ADC_InitStructure.ADC_NbrOfChannel = 3;        //顺序进行规则转换的ADC通道的数目
  7.         ADC_Init(ADC1, &ADC_InitStructure);        //根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器   
  8.         
  9.         ADC_RegularChannelConfig(ADC1, ADC_Channel_1 , 1, ADC_SampleTime_239Cycles5);
  10.         ADC_RegularChannelConfig(ADC1, ADC_Channel_2 , 2, ADC_SampleTime_239Cycles5);
  11.         ADC_RegularChannelConfig(ADC1, ADC_Channel_3 , 3, ADC_SampleTime_239Cycles5);

因为我想对三条通道采样10次,然后求其最大值和最小值,以通道1为例 ADC_RCVTab[x][0]这是通道1十次采样的数据,存在的问题:在采样期间ADC_RCVTab[0][0] 发生变化理论上说应该是每十次采样之后,才发生一次变化,但是实际运行的时候,有时候采样2或3最多是4次 就发生变化了;
 楼主| 涵潇舒雅 发表于 2013-11-30 08:50 | 显示全部楼层
没有顶贴的 啊
 楼主| 涵潇舒雅 发表于 2013-11-30 08:56 | 显示全部楼层
求好心人啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

26

主题

164

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部

26

主题

164

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部