打印

ADC与DMA问题

[复制链接]
2209|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
fq1110|  楼主 | 2010-3-12 14:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ADC, DMA, ni, ST, TE
u16 g_ADC_ConvertedValue[2];
我的初始化代码如下:

GPIO_InitTypeDef  GPIO_InitStructure;
ADC_InitTypeDef   ADC_InitStructure;
DMA_InitTypeDef   DMA_InitStructure;
   /* Enable GPIOA clock                                                       */
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
   /* Enable DMA clock                                                         */
   RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
   /* Enable ADC1 clock                                                        */
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
   /* Configure PA1 (ADC Channel1) as analog input                             */
   GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_3|GPIO_Pin_0;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;   
   GPIO_Init(GPIOC, &GPIO_InitStructure);
  /* DMA Channel1 Configuration ----------------------------------------------*/
   DMA_DeInit(DMA1_Channel1);
   DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;
   DMA_InitStructure.DMA_MemoryBaseAddr     = (u32)g_ADC_ConvertedValue;
   DMA_InitStructure.DMA_DIR                = DMA_DIR_PeripheralSRC;
   DMA_InitStructure.DMA_BufferSize         = 2;
   DMA_InitStructure.DMA_PeripheralInc      = DMA_PeripheralInc_Disable;
   DMA_InitStructure.DMA_MemoryInc          = DMA_MemoryInc_Disable;
   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_M2M                = DMA_M2M_Disable;
   DMA_Init(DMA1_Channel1, &DMA_InitStructure);
   /* ADC1 Configuration (ADC1CLK = 18 MHz) -----------------------------------*/
   ADC_InitStructure.ADC_Mode               = ADC_Mode_Independent;
   ADC_InitStructure.ADC_ScanConvMode       = ENABLE;
   ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;        
   ADC_InitStructure.ADC_ExternalTrigConv   = ADC_ExternalTrigConv_None;
   ADC_InitStructure.ADC_DataAlign          = ADC_DataAlign_Right;
   ADC_InitStructure.ADC_NbrOfChannel       = 2;
   ADC_Init(ADC1, &ADC_InitStructure);
   /* ADC1 Regular Channel1 Configuration                                      */
   ADC_RegularChannelConfig(ADC1, ADC_Channel_13, 1, ADC_SampleTime_55Cycles5);
   ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 2, ADC_SampleTime_55Cycles5);
  while(ADC_GetResetCalibrationStatus(ADC1));
   ADC_StartCalibration(ADC1);
// while(ADC_GetCalibrationStatus(ADC1));
   ADC_DMACmd(ADC1, ENABLE);             /* Enable ADC1's DMA interface        */
   ADC_Cmd(ADC1, ENABLE);             /* Enable ADC1                        */
  ADC_SoftwareStartConvCmd(ADC1,ENABLE);/* Start ADC1 Software Conversion     */
    DMA_Cmd(DMA1_Channel1, ENABLE);        /* Enable DMA Channel1                */

现在出现的问题是,通过定时器取g_ADC_ConvertedValue[0],g_ADC_ConvertedValue[1]的值,结果总是在g_ADC_ConvertedValue[0]中,而且两路的值在g_ADC_ConvertedValue[0]中随机变化,g_ADC_ConvertedValue[1]确总是为0。请问是什么原因啊?DMA与两路ADC的值如何与我的缓冲区对应起来?以下是实际数据。
battery ad=2048 temp ad=0
battery ad=3275 temp ad=0
battery ad=3228 temp ad=0
battery ad=3164 temp ad=0
battery ad=3273 temp ad=0
battery ad=2049 temp ad=0
battery ad=3278 temp ad=0
battery ad=3273 temp ad=0
沙发
fq1110|  楼主 | 2010-3-12 15:33 | 只看该作者
怎么没人提示一下啊?

使用特权

评论回复
板凳
ST_ARM| | 2010-3-12 17:13 | 只看该作者
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;
                                                           ^^^^^^^^^^^^^^^^应该为DMA_MemoryInc_Enable

使用特权

评论回复
地板
dfsa| | 2010-3-12 20:37 | 只看该作者
是的,这个要使能

使用特权

评论回复
5
zwll| | 2010-3-12 20:40 | 只看该作者
楼主好粗心啊

使用特权

评论回复
6
fq1110|  楼主 | 2010-3-15 09:22 | 只看该作者
解决了,谢谢大家了啊。
真是个马大哈。。

使用特权

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

本版积分规则

68

主题

530

帖子

1

粉丝