[STM32F1] stm32 dma与adc的问题

[复制链接]
 楼主| ivrings 发表于 2013-11-29 18:50 | 显示全部楼层 |阅读模式
本帖最后由 ivrings 于 2013-11-30 17:08 编辑

求大神帮看一下 多通道AD转换
用ADC_GetConversionValue得到的ad值是正确的
但是dma传输后得到的值只能测得0或者3.3v
        
        #define ADC1_DR_Address    ((u32)0x40012400+0x4c)
        uint ADC_ConvertedValue[6];
        ADC_InitTypeDef ADC_InitStructure;
        DMA_InitTypeDef DMA_InitStructure;
        DMA_DeInit(DMA1_Channel1);
        DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;         
        DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue;
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
        DMA_InitStructure.DMA_BufferSize = 6;
        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_M2M = DMA_M2M_Disable;
        DMA_Init(DMA1_Channel1, &DMA_InitStructure);
               DMA_Cmd(DMA1_Channel1, ENABLE);
        
        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 = 6;                 
        ADC_Init(ADC1, &ADC_InitStructure);
        
        RCC_ADCCLKConfig(RCC_PCLK2_Div8);
        ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_239Cycles5);
        ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 2, ADC_SampleTime_239Cycles5);
        ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 3, ADC_SampleTime_239Cycles5);
        ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 4, ADC_SampleTime_239Cycles5);
        ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 5, ADC_SampleTime_239Cycles5);
        ADC_RegularChannelConfig(ADC1, ADC_Channel_6, 6, ADC_SampleTime_239Cycles5);
        
               
        ADC_DMACmd(ADC1, ENABLE);
        
        /* Enable ADC1 */
        ADC_Cmd(ADC1, ENABLE);
        
         
        ADC_ResetCalibration(ADC1);
        
        while(ADC_GetResetCalibrationStatus(ADC1));
        
        
        ADC_StartCalibration(ADC1);
        
        while(ADC_GetCalibrationStatus(ADC1));
        

        ADC_SoftwareStartConvCmd(ADC1, ENABLE);
        
      
fengdingkusong 发表于 2013-11-30 15:14 | 显示全部楼层
DMA配置完后DMA_Cmd(DMA1_Channel1, ENABLE);?
 楼主| ivrings 发表于 2013-11-30 17:09 | 显示全部楼层
fengdingkusong 发表于 2013-11-30 15:14
DMA配置完后DMA_Cmd(DMA1_Channel1, ENABLE);?

那个东西是有的 不好意思没打上来
east森林 发表于 2013-11-30 20:55 | 显示全部楼层
DMA真没用过,太高深
51xlf 发表于 2013-11-30 21:09 | 显示全部楼层
使能时钟的
黄晨 发表于 2013-11-30 21:19 | 显示全部楼层
暂时没用到
huangfeng33 发表于 2013-11-30 21:19 | 显示全部楼层
看来用DMA功能的人不多呀,我帮顶
fangxingyi 发表于 2013-11-30 22:14 | 显示全部楼层
不错
lzmm 发表于 2013-11-30 22:19 | 显示全部楼层
时钟的问题?
122541325 发表于 2013-12-1 22:03 | 显示全部楼层
时钟配置好了么,   把ADC_Cmd(ADC1, ENABLE)放到ADC_Init(ADC1, &ADC_InitStructure)后,试试看
香水城 发表于 2013-12-2 12:22 | 显示全部楼层
第一:什么芯片
第二:貌似从F1固件库的ADC-DMA demo改过来的。

尝试不要circular转换,而是normal转换。一次性转换6个通道,然后DMA传输到数组,看看是否乱序。
huzi2099 发表于 2013-12-2 13:45 | 显示全部楼层
DMA->CNT有没有在变
azurysky 发表于 2013-12-2 14:59 | 显示全部楼层
你的问题可以说的再具体点吗?我前天调试DMA与ADC 发现按大家的写法  DMA只能得到低字节的ADC数据,高字节的没有到DMA中,后来在地址空间+1 解决了问题。
也就是把 #define ADC1_DR_Address    ((u32)0x40012400+0x4c) 写成  #define ADC1_DR_Address    ((u32)0x40012400+0x4c+1)

原因是地址未指对,我记得以前在哪看到过,stm32的数据字节和字,双字的对齐方式可以选择,所以可能是默认的状态和别人的例程不一样造成的,我也没有仔细检查。

我没有弄清你的具体问题,但我当时就是ADC数据寄存器数据正确吗,但DMA中的数据部正确。


graycker 发表于 2015-4-12 22:36 | 显示全部楼层
azurysky 发表于 2013-12-2 14:59
你的问题可以说的再具体点吗?我前天调试DMA与ADC 发现按大家的写法  DMA只能得到低字节的ADC数据,高字节 ...

我也遇到这样的问题,可是改了地址还是一样的,现在都不知道怎么办
虽然老贴了,还是顶顶吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

2

帖子

0

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