STM32F106C6T6 ADC+DMA数据转换错位?
[复制链接]
STM32F106C6T6 ADC+DMA数据转换错位?我转换3个外部通道,一个内部温度。仿真时复位——运行——复位,出现错误的概率在30%。好奇怪,DMA1在其余部分也有用,代码余下: void ADCInit_DMA(void) { GPIO_InitTypeDef GPIO_InitStructure; // Configure P1.1.2.3 as analog input GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_Init(GPIOA, &GPIO_InitStructure); RCC_ADCCLKConfig(RCC_PCLK2_Div4); // cofigure ADC clock = PCLK2/4, PLLCLK /4 // DMA1 channel1 configuration DMA_DeInit(DMA1_Channel1); DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address; DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADCConvertBuf; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; DMA_InitStructure.DMA_BufferSize = 40; 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_Low; 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 = 4; ADC_Init(ADC1, &ADC_InitStructure); // Enables the temperature sensor and Vrefint channel ADC_TempSensorVrefintCmd( ENABLE ); // ADC1 regular channel 1,2,3,16 configuration ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_239Cycles5); // co ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 2, ADC_SampleTime_239Cycles5); // smoke ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 3, ADC_SampleTime_239Cycles5); // batter ADC_RegularChannelConfig(ADC1, ADC_Channel_16,4, ADC_SampleTime_239Cycles5); // internel temperature sensor // Enable ADC1 DMA ADC_DMACmd(ADC1, ENABLE); // Enable ADC1 ADC_Cmd(ADC1, ENABLE); // Enable ADC1 reset calibaration register ADC_ResetCalibration(ADC1); // Check the end of ADC1 reset calibration register while(ADC_GetResetCalibrationStatus(ADC1)); // Start ADC1 calibaration ADC_StartCalibration(ADC1); // Check the end of ADC1 calibration while(ADC_GetCalibrationStatus(ADC1)); // Test on DMA1 channel1 transfer complete flag while(!DMA_GetFlagStatus(DMA1_FLAG_TC1)); // Clear DMA1 channel1 transfer complete flag DMA_ClearFlag(DMA1_FLAG_TC1); // Start ADC1 Software Conversion ADC_SoftwareStartConvCmd(ADC1, ENABLE); }
|