DMA+ADC单通道转换、多通道转换

在stm32中,使用ADC时往往采用DMA传输方式,由DMA把转换的数据传输到SRAM,再进行处理。
一、单通道转换
本章节选用ADC1进行配置实验:
ADC通道与GPIO对应表:
DMA+ADC单通道转换、多通道转换_第1张图片
ADC结构体成员变量:
typedef struct
{
uint32_t ADC_Mode;
FunctionalState ADC_ScanConvMode;
FunctionalState ADC_ContinuousConvMode;
uint32_t ADC_ExternalTrigConv;
uint32_t ADC_DataAlign;
uint8_t ADC_NbrOfChannel;
}ADC_InitTypeDef;
1、 ADC_Mode 是用来设置ADC的模式的,
2、ADC_ScanConvMode;设置是否开启扫描模式(扫描模式用于多通道),实验一为单通道,故不需要开启扫描模式
3、ADC_ContinuousConvMode设置是否连续转换
4、ADC_ExternalTrigConv用来设置启动规则组转换的外部事件,如果不需要,选择ADC_ExternalTrigConv_None
5、ADC_DataAlign用来选择数据对齐方式,通常情况下选择右对齐
6、 ADC_NbrOfChannel设置规则序列的长度。
单通道转换初始化程序:
void ADC_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
ADC_InitTypeDef ADC_InitStructure;
DMA_InitTypeDef DMA_InitStructure;

RCC_ADCCLKConfig(RCC_PCLK2_Div6);               //ADC转换的最大时钟为14M  
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);  //打开DMA时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOA, ENABLE);

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1|GPIO_Pin_0; 
GPIO_Init(GPIOA,&GPIO_InitStructure);          //引脚做输入时 不用配置速率

DMA_DeInit(DMA1_Channel1);
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR;                    //DMA 外设地址
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&ADCConvertedValue;               //DMA内存地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;                                 //外设为源地址
DMA_InitStructure.DMA_BufferSize = 1;

//单通道的话值为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);
DMA_Cmd(DMA1_Channel1, ENABLE);

ADC_DeInit(ADC1);
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;
//单通道下直为1
ADC_Init(ADC1,&ADC_InitStructure);

ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_239Cycles5);
//ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_239Cycles5);
//单通道下注释掉本句

ADC_DMACmd(ADC1, ENABLE);

ADC_Cmd(ADC1, ENABLE);

ADC_ResetCalibration(ADC1);
while(ADC_GetResetCalibrationStatus(ADC1));
ADC_StartCalibration(ADC1);
while(ADC_GetCalibrationStatus(ADC1));
ADC_SoftwareStartConvCmd(ADC1, ENABLE);

}
实验二 多通道转换将以上初始化代码做一些相应改动即可。

你可能感兴趣的:(c语言-单片机)