STM32F4xx -- 单通道ADC+DMA功能实现

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 }

 

posted @ 2019-03-27 15:19  cloos.xie  阅读(4237)  评论(0编辑  收藏  举报