1、測試硬件:
STM32F405
所用IO:PA3,PC2,PC3
2、軟件實現:
使能DMA2,初始化IO口,設置ADC.
1 volatile uint16_t ADC_DualConvertedValueTab[3]; //必須使用volatile關鍵字,每次調用時重新取值 2 3 void DMA2_Configuration() { 4 DMA_InitTypeDef DMA_InitStructure; 5 6 DMA_InitStructure.DMA_Channel = DMA_Channel_0; 7 DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(ADC1->DR); 8 DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&ADC_DualConvertedValueTab; 9 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory; 10 DMA_InitStructure.DMA_BufferSize = 3; //與通道數設置一致 11 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; 12 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; 13 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; 14 DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_HalfWord; 15 DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; 16 DMA_InitStructure.DMA_Priority = DMA_Priority_High; 17 DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; //DMA_FIFOMode_Disable DMA_FIFOMode_Enable 18 DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull; 19 DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; 20 DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; 21 DMA_Init(DMA2_Stream0, &DMA_InitStructure); 22 DMA_Cmd(DMA2_Stream0, ENABLE); 23 } 24 25 void ADC1_Config() 26 { 27 ADC_InitTypeDef ADC_InitStructure; 28 29 ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b; 30 ADC_InitStructure.ADC_ScanConvMode = ENABLE; 31 ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; 32 ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; 33 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //ADC_DataAlign_Right ADC_DataAlign_Left 設置數據右對齊 34 ADC_InitStructure.ADC_NbrOfConversion = 3; 35 ADC_Init(ADC1, &ADC_InitStructure); 36 37 //設置通道順序,里面的設置數與ADC_InitStructure.ADC_NbrOfConversion = 3;對應 38 ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 1, ADC_SampleTime_112Cycles); 39 ADC_RegularChannelConfig(ADC1, ADC_Channel_12, 2, ADC_SampleTime_112Cycles); 40 ADC_RegularChannelConfig(ADC1, ADC_Channel_13, 3, ADC_SampleTime_112Cycles); 41 } 42 43 void Adc_Configuration() 44 { 45 DMA2_Configuration(); 46 ADC_CommonInitTypeDef ADC_CommonInitStructure; 47 GPIO_InitTypeDef GPIO_InitStructure; 48 49 GPIO_StructInit(&GPIO_InitStructure); 50 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; 51 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; 52 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ; 53 GPIO_Init(GPIOA, &GPIO_InitStructure); 54 55 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3; 56 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; 57 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; 58 GPIO_Init(GPIOC, &GPIO_InitStructure); 59 60 ADC1_Config(); 61 62 ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent; 63 ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2; 64 ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled; //ADC_DMAAccessMode_Disabled ADC_DMAAccessMode_1 65 ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_20Cycles; 66 ADC_CommonInit(&ADC_CommonInitStructure); 67 68 ADC_DMARequestAfterLastTransferCmd(ADC1,ENABLE); //單通道使用 69 70 ADC_Cmd(ADC1, ENABLE); 71 72 ADC_DMACmd(ADC1, ENABLE); 73 74 ADC_SoftwareStartConv(ADC1); 75 }