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;
//单通道的话值为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);
}
实验二 多通道转换将以上初始化代码做一些相应改动即可。
一、单通道转换
本章节选用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);
}
实验二 多通道转换将以上初始化代码做一些相应改动即可。
相关文章推荐
- STM32F10x_ADC三通道DMA连续转换(3通道、软件单次触发)
- STM32F10x_ADC三通道DMA连续转换(3通道、软件单次触发)
- ADC多通道逐次转换(不用DMA)
- STM32F10x_ADC三通道逐次转换(单次、单通道软件触发)
- 【STM32】用DMA实现多路ADC通道数据采集
- STM32 ADC多通道转换(转)
- STM32 ADC DMA 中断模式多通道读取ADC转换值
- STM32之ADC 一个8通道DMA程序
- STM32F407的ADC之DMA多通道+温度
- STM8L051之ADC+DMA两通道数据采样错位问题
- STM32 多通道ADC采样,采用Timer1进行采样率控制,利用DMA进行传输
- stm32的多通道ADC和DMA的设置问题
- LPC1788--ADC连续中断多通道转换程序学习分析
- STM32 多通道ADC采样,采用Timer1进行采样率控制,利用DMA进行传输
- 基于ALIENTEK MINISTM32开发板 ADC+DMA 8通道显示
- STM32 DMA 多通道 ADC 采集
- STM32 ADC 规则多通道转换
- STM32多通道ADC规则转换实现了(转)!
- STM32F10X ADC多通道读取小教程(包含DMA)
- stm32 ADC模数转换 ADC多通道 ADC DMA