#include "stm32f4xx.h" uint16_t ADC3ConvertedValue[2] = {0,0}; float PC0_Voltage; float PC1_Voltage; void ADC3_Channel_10_11_DMA2_configure(void); int main(void){ ADC3_Channel_10_11_DMA2_configure(); while(1){ PC0_Voltage = (ADC3ConvertedValue[0]*1.0/4095)*3.3; PC1_Voltage = (ADC3ConvertedValue[1]*1.0/4095)*3.3; } } /******************************************************************************/ void ADC3_Channel_10_11_DMA2_configure(){ ADC_InitTypeDef ADC_InitStruct; ADC_CommonInitTypeDef ADC_CommonInitStruct; DMA_InitTypeDef DMA_InitStruct; GPIO_InitTypeDef GPIO_InitStruct; /* Enable ADC3, DMA2 and GPIO clocks ****************************************/ RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2 | RCC_AHB1Periph_GPIOC , ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC3, ENABLE);//ADC3 is connected to the APB2 peripheral bus /* DMA2 Stream0 channel0 configuration **************************************/ DMA_InitStruct.DMA_Channel = DMA_Channel_2; DMA_InitStruct.DMA_PeripheralBaseAddr = (uint32_t)&ADC3->DR; //ADC3's data register DMA_InitStruct.DMA_Memory0BaseAddr = (uint32_t)&ADC3ConvertedValue[0]; DMA_InitStruct.DMA_DIR = DMA_DIR_PeripheralToMemory; DMA_InitStruct.DMA_BufferSize = 2; DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//Reads 16 bit values DMA_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; //Stores 16 bit values DMA_InitStruct.DMA_Mode = DMA_Mode_Circular; DMA_InitStruct.DMA_Priority = DMA_Priority_High; DMA_InitStruct.DMA_FIFOMode = DMA_FIFOMode_Disable; DMA_InitStruct.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull; DMA_InitStruct.DMA_MemoryBurst = DMA_MemoryBurst_Single; DMA_InitStruct.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; DMA_Init(DMA2_Stream0, &DMA_InitStruct); DMA_Cmd(DMA2_Stream0, ENABLE); /* Configure GPIO pins ******************************************************/ GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1; //PC0, PC1 GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AN; //The pins are configured in analog mode GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL ; //We don't need any pull up or pull down GPIO_Init(GPIOC, &GPIO_InitStruct); /* ADC Common Init **********************************************************/ ADC_CommonInitStruct.ADC_Mode = ADC_Mode_Independent; ADC_CommonInitStruct.ADC_Prescaler = ADC_Prescaler_Div2; ADC_CommonInitStruct.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled; ADC_CommonInitStruct.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles; ADC_CommonInit(&ADC_CommonInitStruct); /* ADC3 Init ****************************************************************/ ADC_DeInit(); ADC_InitStruct.ADC_Resolution = ADC_Resolution_12b; //Input voltage is converted into a 12bit int (max 4095) ADC_InitStruct.ADC_ScanConvMode = ENABLE; //The scan is configured in multiple channels ADC_InitStruct.ADC_ContinuousConvMode = ENABLE; //Continuous conversion: input signal is sampled more than once ADC_InitStruct.ADC_ExternalTrigConv = 0; ADC_InitStruct.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right; //Data converted will be shifted to right ADC_InitStruct.ADC_NbrOfConversion = 2; ADC_Init(ADC3, &ADC_InitStruct); /* Select the channels to be read from **************************************/ ADC_RegularChannelConfig(ADC3, ADC_Channel_10, 1, ADC_SampleTime_144Cycles);//PC0 ADC_RegularChannelConfig(ADC3, ADC_Channel_11, 2, ADC_SampleTime_144Cycles);//PC1 /* Enable DMA request after last transfer (Single-ADC mode) *****************/ ADC_DMARequestAfterLastTransferCmd(ADC3, ENABLE); /* Enable ADC3 DMA **********************************************************/ ADC_DMACmd(ADC3, ENABLE); /* Enable ADC3 **************************************************************/ ADC_Cmd(ADC3, ENABLE); /* Start ADC3 Software Conversion *******************************************/ ADC_SoftwareStartConv(ADC3); }