volatile u16 ADC_Value[4]={0};
void ADC_DMA_Periph_Init(void)
{
ADC_InitTypeDef ADC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
//时钟配置
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
//管脚配置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOB, &GPIO_InitStructure);
//DMA配置
DMA_InitTypeDef DMA_InitStructure;
DMA_DeInit(DMA1_Channel1);
DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)(&ADC1->DR);
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)ADC_Value;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_InitStructure.DMA_BufferSize = 4; //BufferSize=2,因为ADC转换序列有4个通道,如此设置,使序列1结果放在AD_Value[0],序列2结果放在AD_Value[1]
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; //循环模式开启,Buffer写满后,自动回到初始地址开始传输
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);//配置完成后,启动DMA通道
//ADC 配置
RCC_ADCCLKConfig(RCC_PCLK2_Div4); //配置ADC时钟分频 2,4,6,8
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数据右对齐
ADC_InitStructure.ADC_NbrOfChannel = 4; //进行规则转换的ADC通道的数目为2
ADC_Init(ADC1,&ADC_InitStructure);
//配置通道序列,就是通道的编号,编号与DMA内存对应
ADC_RegularChannelConfig(ADC1,ADC_Channel_2,1,ADC_SampleTime_55Cycles5); //选择通道2,转换顺序1,采样时间为1.5周期
ADC_RegularChannelConfig(ADC1,ADC_Channel_3,2,ADC_SampleTime_55Cycles5); //选择通道3,转换顺序2,采样时间为1.5周期
ADC_RegularChannelConfig(ADC1,ADC_Channel_8,3,ADC_SampleTime_55Cycles5); //选择通道4,转换顺序3,采样时间为1.5周期
ADC_RegularChannelConfig(ADC1,ADC_Channel_9,4,ADC_SampleTime_55Cycles5); //选择通道5,转换顺序4,采样时间为1.5周期
ADC_DMACmd(ADC1, ENABLE); //开启DMA支持
ADC_Cmd(ADC1,ENABLE); //使能AD1
//ADC校准
ADC_ResetCalibration(ADC1); //复位ADC1的校准寄存器
ADC_StartCalibration(ADC1); //开始ADC1的校准
while(ADC_GetCalibrationStatus(ADC1)); //等待ADC1校准完成
//启动第一次AD转换
ADC_SoftwareStartConvCmd(ADC1,ENABLE); //启动ADC1转换
//因为已经配置好了DMA,接下来AD自动连续转换,结果自动保存在AD_Value处
}
//获得ADC值
// ch:通道值 0~3
u16 Get_ADC1_Conversion(u8 ADC_Channel_x) {
if(ADC_Channel_x == ADC_Channel_2)return ADC_Value[0];
if(ADC_Channel_x == ADC_Channel_3)return ADC_Value[1];
if(ADC_Channel_x == ADC_Channel_8)return ADC_Value[2];
if(ADC_Channel_x == ADC_Channel_9)return ADC_Value[3];
return 0;
}
记录 STM32F1 ADC DMA 多通道读取
最新推荐文章于 2024-06-03 20:06:04 发布
该博客详细介绍了如何配置STM32的ADC和DMA,以实现ADC通道的连续转换,并将结果自动存储到内存中。通过设置ADC的时钟、通道、采样时间和DMA的参数,确保了数据的高效传输。同时,提供了获取特定通道ADC值的函数,方便后续处理。
摘要由CSDN通过智能技术生成