搜索
bottom↓
回复: 4

多通道ADC+DMA转换数据为零的疑惑

[复制链接]

出0入0汤圆

发表于 2011-7-28 15:57:25 | 显示全部楼层 |阅读模式
我采用4通道ADC,使用DMA传输,DMA传输完成DMA1_IT_TC1中断正常,就是DAC转换的结果全部为零。感觉是ADC的原因,或者是ADC与DMA的设置搭配不正常,单通道ADC采集正确,多通道加DMA数据就全为零了。有没有哪位大哥说说原因在哪,我的程序如下:

1、DMA中断程序:
void DMA1_Channel1_IRQHandler(void)
{
        if(DMA_GetITStatus(DMA1_IT_TC1))
        {       
                ADC_DMA_TRSMIT_OK = 1;
                DMA_ClearITPendingBit(DMA1_IT_GL1);
        }
}


2、DMA配置程序:
void DMA_Configuration(void)
{
        DMA_InitTypeDef DMA_InitStucture;

        /* DMA通道1配置 */
        DMA_DeInit(DMA1_Channel1);
        DMA_InitStucture.DMA_PeripheralBaseAddr         = ((u32)0x4001244C);/* 在本应用中外设基地址是ADC的数据寄存器地址 */
        DMA_InitStucture.DMA_MemoryBaseAddr                         = (u32)GuiAdcValue;        /* 在本应用中内存地址是自定义的数组地址 */
        DMA_InitStucture.DMA_DIR                                                                         = DMA_DIR_PeripheralSRC;/* 指定外设为数据源(指定了数据传输方向) */
        DMA_InitStucture.DMA_BufferSize                                         = (ADC_VONVERTOR_CNT * ADC_INPUT_CHN_NUM);/* DMA拷贝长度 */
        DMA_InitStucture.DMA_PeripheralInc                                 = DMA_PeripheralInc_Disable;/* 外设地址增加禁止 */
        DMA_InitStucture.DMA_MemoryInc                                                 = DMA_MemoryInc_Enable;/* 内存地址增加使能 */
        DMA_InitStucture.DMA_PeripheralDataSize         = DMA_PeripheralDataSize_HalfWord;/* 外设数据半字访问 */
        DMA_InitStucture.DMA_MemoryDataSize                         = DMA_MemoryDataSize_HalfWord;/* 内存数据半字访问        */
        DMA_InitStucture.DMA_Mode                                                                 = DMA_Mode_Circular;/* 工作在循环缓存模式 */
        DMA_InitStucture.DMA_Priority                                                 = DMA_Priority_High;
        DMA_InitStucture.DMA_M2M                                                                         = DMA_M2M_Disable;/* 内存向内存拷贝禁止 */
        DMA_Init(DMA1_Channel1 , &DMA_InitStucture);
       
        DMA_ITConfig(DMA1_Channel1 , DMA_IT_TC , ENABLE);
        /* 允许DMA通道1*/
        DMA_Cmd(DMA1_Channel1 , ENABLE);
}


3、ADC配置程序:
void ADC_Configuration(void)
{
        ADC_InitTypeDef ADC_InitStructure;

        ADC_InitStructure.ADC_Mode                                                                 = ADC_Mode_Independent;/* ADC独立模式(非多个ADC控制器) */
        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                                 = 4;/* 4路ADC通道进行转换 */
        ADC_Init(ADC1,&ADC_InitStructure);


        /* ADC1通道10、11、12、13配置为规则通道 */
        ADC_RegularChannelConfig(ADC1 , ADC_Channel_10 , 1 , ADC_SampleTime_55Cycles5);
        ADC_RegularChannelConfig(ADC1 , ADC_Channel_11 , 2 , ADC_SampleTime_55Cycles5);
        ADC_RegularChannelConfig(ADC1 , ADC_Channel_12 , 3 , ADC_SampleTime_55Cycles5);
        ADC_RegularChannelConfig(ADC1 , ADC_Channel_13 , 4 , ADC_SampleTime_55Cycles5);

        /* 允许 ADC1 进行 DMA 传输 (注:开启ADC的DMA功能时,需要DMA使能) */
        ADC_DMACmd(ADC1 , ENABLE);         

        /* 使能 ADC1 */
        ADC_Cmd(ADC1 , ENABLE);                         

        /* 允许 ADC1 复位校准寄存器 */
        ADC_ResetCalibration(ADC1);
        while(ADC_GetResetCalibrationStatus(ADC1));

        /* 启动 ADC1 校准 */
        ADC_StartCalibration(ADC1);
        while(ADC_GetCalibrationStatus(ADC1));

        /* 软件使能 ADC1 开始转换 */
        ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}

4、中断配置程序:
void NVIC_Configuration(void)
{       
        NVIC_InitTypeDef NVIC_InitStructure;

  /* Configure the NVIC Preemption Priority Bits */  
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
  
  /* Enable the USART1 Interrupt */
  NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel1_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}


5、时钟使能程序:
void RCC_Config(void)
{
        SystemInit();

        /* 使能GPIO(A~C)|ADC1|USART1 时钟 */
        RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB
                                                                                                     | RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO
                                                                                                | RCC_APB2Periph_ADC1  | RCC_APB2Periph_USART1
                                                                                                , ENABLE );
        /* 使能CAN时钟 */
//RCC_APB1PeriphClockCmd( RCC_APB1Periph_CAN1 , ENABLE );
               
        /* 使能DMA时钟 */
        RCC_AHBPeriphClockCmd( RCC_AHBPeriph_DMA1 , ENABLE );
}


以上就是我的程序,我感觉配置的没有问题,可是工作就是不正常,在主函数的处理就不给出了,无非是查看中断标志之类的。现在我不知道原因在哪,已经整整1天半了,望哪位高手指明错误。

阿莫论坛20周年了!感谢大家的支持与爱护!!

你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。

出0入0汤圆

 楼主| 发表于 2011-7-28 16:58:46 | 显示全部楼层
解决了,我的显示有问题!再也没有这么2的一天了!

出0入0汤圆

 楼主| 发表于 2011-7-28 17:08:20 | 显示全部楼层
STM32的DMA功能真是个好东西啊,速度极快。很有成就感,4个通道都OK了。

出0入0汤圆

发表于 2011-8-1 00:00:31 | 显示全部楼层
楼主能把源码发给我一份么?现在刚学习STM32,谢谢了!zyb7978@163.com

出0入0汤圆

发表于 2013-10-25 18:33:15 | 显示全部楼层
lgcHR你好!我目前正被STM32F103的多通道ADC DMA采样所困扰,看到你的帖子,恳请能发一份你调试成功的多通道DMA采样程序给我!我的邮箱:397328040@qq.com,感谢!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-10-1 03:22

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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