3ADC的DMA传输实现失败

2019-07-20 22:56发布

如题,我选用的是ADC的规则同步传输模式ADC_TripleMode_RegSimult,ADC的DMA模式选用的是2型(根据资料,1型是ADC1,2,3一个个采然后一个个DMA传输,而三型是只能传输8位或者6位的数据,因此只能选择二型),根据手册,ADC1,2,3的数据应该是轮流出现在ADC->CDR寄存器的高低16位,也就是说第一次采集时,应该是低16位是ADC1的数据,高16位应该是ADC2的数据;在测试过程中低16位读取的数据是对的,但是高16位一直不对,请问是为啥?还是我有关ADC和DMA的模式选择不对吗?
代码如下:
void  Adc_Init(void){      GPIO_InitTypeDef  GPIO_InitStructure;      ADC_CommonInitTypeDefADC_CommonInitStructure;      ADC_InitTypeDef       ADC_InitStructure;


      RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);      RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC,ENABLE);      RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);       RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC2,ENABLE);   RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC3,ENABLE);
  GPIO_InitStructure.GPIO_Pin =GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_4;  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;  GPIO_InitStructure.GPIO_PuPd =GPIO_PuPd_NOPULL ;  GPIO_Init(GPIOA, &GPIO_InitStructure);
      GPIO_InitStructure.GPIO_Pin =GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2;  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;  GPIO_InitStructure.GPIO_PuPd =GPIO_PuPd_NOPULL ;  GPIO_Init(GPIOC, &GPIO_InitStructure);
     GPIO_InitStructure.GPIO_Pin= GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8;  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;  GPIO_InitStructure.GPIO_PuPd =GPIO_PuPd_NOPULL ;  GPIO_Init(GPIOF, &GPIO_InitStructure);
      RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,ENABLE);           RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,DISABLE);      RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC2,ENABLE);           RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC2,DISABLE);      RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC3,ENABLE);           RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC3,DISABLE);  

  ADC_CommonInitStructure.ADC_Mode=ADC_TripleMode_RegSimult;  ADC_CommonInitStructure.ADC_TwoSamplingDelay= ADC_TwoSamplingDelay_5Cycles;  ADC_CommonInitStructure.ADC_DMAAccessMode=  ADC_DMAAccessMode_2;   ADC_CommonInitStructure.ADC_Prescaler =ADC_Prescaler_Div4; ADC_CommonInit(&ADC_CommonInitStructure);
  ADC_InitStructure.ADC_Resolution =ADC_Resolution_12b;  ADC_InitStructure.ADC_ScanConvMode = ENABLE;  ADC_InitStructure.ADC_ContinuousConvMode =ENABLE;  ADC_InitStructure.ADC_ExternalTrigConvEdge =ADC_ExternalTrigConvEdge_None;  ADC_InitStructure.ADC_DataAlign =ADC_DataAlign_Right;  ADC_InitStructure.ADC_NbrOfConversion = 3;  ADC_Init(ADC1, &ADC_InitStructure);      ADC_Init(ADC2, &ADC_InitStructure);
  ADC_DMACmd(ADC1, ENABLE);      ADC_Cmd(ADC1, ENABLE);  ADC_DMACmd(ADC2, ENABLE);      ADC_Cmd(ADC2, ENABLE);  ADC_DMACmd(ADC3, ENABLE);      ADC_Cmd(ADC3, ENABLE);   
      ADC_RegularChannelConfig(ADC1,ADC_Channel_0, 1, ADC_SampleTime_3Cycles);      ADC_RegularChannelConfig(ADC1,ADC_Channel_1, 2, ADC_SampleTime_3Cycles);      ADC_RegularChannelConfig(ADC1,ADC_Channel_4, 3, ADC_SampleTime_3Cycles);      ADC_RegularChannelConfig(ADC2,ADC_Channel_10, 1, ADC_SampleTime_3Cycles);      ADC_RegularChannelConfig(ADC2,ADC_Channel_11, 2, ADC_SampleTime_3Cycles);      ADC_RegularChannelConfig(ADC2,ADC_Channel_12, 3, ADC_SampleTime_3Cycles);      ADC_RegularChannelConfig(ADC3,ADC_Channel_4, 1, ADC_SampleTime_3Cycles);      ADC_RegularChannelConfig(ADC3,ADC_Channel_5, 2, ADC_SampleTime_3Cycles);      ADC_RegularChannelConfig(ADC3,ADC_Channel_6, 3, ADC_SampleTime_3Cycles);


  ADC_SoftwareStartConv(ADC1);       ADC_SoftwareStartConv(ADC2);       ADC_SoftwareStartConv(ADC3);           }         
MYDMA_Config(DMA2_Stream0,DMA_Channel_0,(u32)&ADC->CDR,(u32)&adcx,144);
MYDMA_Enable(DMA2_Stream0,144);



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
16条回答
mengheli
1楼-- · 2019-07-21 04:38
...问题已解决,是这样的,我adc的采样是半字,但是他每次DMA传输的时候是两个数据合成一个传输,也就是字,所以在设定DMA传输模式的时候,要选择从外设:字  到内存:字,之前我一直选择的是半字,所以一直传输失败
mengheli
2楼-- · 2019-07-21 05:12
 精彩回答 2  元偷偷看……
xiaobudonglaosh
3楼-- · 2019-07-21 09:53
帮顶      
mengheli
4楼-- · 2019-07-21 13:16
顶啊,求大神解读
正点原子
5楼-- · 2019-07-21 19:01
帮顶
正点原子
6楼-- · 2019-07-22 00:03
 精彩回答 2  元偷偷看……

一周热门 更多>