您的位置:首页 > 其它

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

2017-07-01 18:38 501 查看
在stm32中,使用ADC时往往采用DMA传输方式,由DMA把转换的数据传输到SRAM,再进行处理。

一、单通道转换

本章节选用ADC1进行配置实验:

ADC通道与GPIO对应表:



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);


}

实验二 多通道转换将以上初始化代码做一些相应改动即可。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: