本帖最后由 **kfu 于 2013-6-5 11:53 编辑  
hxb20122012 发表于 2013-6-4 21:48   
不知道版主的问题和我的是否一样,我的问题已经解决了。 
总结:(1)一定要配置好ADC之后,才使能DMA 
(2) ...  
什么叫  “一定要配置好ADC之后,才使能DMA”。可否上具体代码看看。 
 
我是参考按照如下的官方的demo code做的,没有发现错位现象。我用F107 
- /**
 
 - *  Main program
 
 - * @param None
 
 - * @retval None
 
 - */
 
 - int main(void)
 
 - {
 
 - /*!< At this stage the microcontroller clock setting is already configured, 
 
 - this is done through SystemInit() function which is called from startup
 
 - file (startup_stm32f10x_xx.s) before to branch to application main.
 
 - To reconfigure the default setting of SystemInit() function, refer to
 
 - system_stm32f10x.c file
 
 - */ 
 
  
- /* System clocks configuration ---------------------------------------------*/
 
 - RCC_Configuration();
 
  
- /* GPIO configuration ------------------------------------------------------*/
 
 - GPIO_Configuration();
 
  
- /* DMA1 channel1 configuration ----------------------------------------------*/
 
 - DMA_DeInit(DMA1_Channel1);
 
 - DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;
 
 - DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&ADCConvertedValue;
 
 - DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
 
 - DMA_InitStructure.DMA_BufferSize = 1;
 
 - 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);
 
  
- /* Enable DMA1 channel1 */
 
 - DMA_Cmd(DMA1_Channel1, ENABLE);
 
  
- /* ADC1 configuration ------------------------------------------------------*/
 
 - 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 = 1;
 
 - ADC_Init(ADC1, &ADC_InitStructure);
 
  
- /* ADC1 regular channel14 configuration */ 
 
 - ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 1, ADC_SampleTime_55Cycles5);
 
  
- /* Enable ADC1 DMA */
 
 - ADC_DMACmd(ADC1, ENABLE);
 
  
- /* Enable ADC1 */
 
 - ADC_Cmd(ADC1, ENABLE);
 
  
- /* Enable ADC1 reset calibration register */ 
 
 - ADC_ResetCalibration(ADC1);
 
 - /* Check the end of ADC1 reset calibration register */
 
 - while(ADC_GetResetCalibrationStatus(ADC1));
 
  
- /* Start ADC1 calibration */
 
 - ADC_StartCalibration(ADC1);
 
 - /* Check the end of ADC1 calibration */
 
 - while(ADC_GetCalibrationStatus(ADC1));
 
  
- /* Start ADC1 Software Conversion */ 
 
 - ADC_SoftwareStartConvCmd(ADC1, ENABLE);
 
  
- while (1)
 
 - {
 
 - }
 
 - }
 
  
这个是我的完整的一个工程,调试通过,没有发现错位现象。 
 
说明:  ADC1,8通道ADC采集,采用DMA1通道1传送数据,然后通过串口1 输出到超级终端 
采用systick产生1ms时基,每隔100ms输出一次数据。 
 
 
 
八通道ADC1_DMA_Printf.rar
(1.69 MB, 下载次数: 115)
 
 
 
 
  |