1、本程序实现 STM32 DMA 中断模式下 ADC 多通道数据采集,并经过简单的均值滤波,亲测可用。若有错误之处,希望读者指出,大家共同学习,一起进步!ADC.C 文件vu16 AD_ValueNM; /504用来存放 ADC 转换结果,也是 DMA 的目标地址vu16 After_filterM; /用来存放求平均值之后的结果vu16 Vtemp_sensorM; /电压转换完成后的实际电压值/初始化 ADC/这里我们仅以规则通道为例/我们默认将开启通道 03void Adc_Init(void) ADC_InitTypeDef ADC_InitStructure; GPIO_InitTyp
2、eDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1, ENABLE );/使能 ADC1 通道时钟/* Configure ADCCLK such as ADCCLK = PCLK2/6 */ RCC_ADCCLKConfig(RCC_PCLK2_Div6); /72M/6=12,ADC 最大时间不能超过 14M/PA0/1/2/3 作为模拟通道输入引脚 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_P
3、in_2|GPIO_Pin_3;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; /模拟输入引脚GPIO_Init(GPIOA, ADC_DeInit(ADC1); /将外设 ADC1 的全部寄存器重设为缺省值/* ADC1 configuration -*/ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; /ADC 工作模式:ADC1 和 ADC2工作在独立模式ADC_InitStructure.ADC_ScanConvMode = ENABLE;/扫描模式,各个通道均扫描完后 EOC才置位 DIS
4、ABLE; /模数转换工作在单通道模式ADC_InitStructure.ADC_ContinuousConvMode =ENABLE; /ENABLE 连续转换模式 DISABLE模数转换工作在单次转换模式ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; /转换由软件而不是外部触发启动ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; /ADC 数据右对齐ADC_InitStructure.ADC_NbrOfChannel = M; /1; /顺序进
5、行规则转换的 ADC 通道的数目ADC_Init(ADC1, /根据 ADC_InitStruct 中指定的参数初始化外设ADCx 的寄存器 /为了能够正确配置每一个 ADC 通道,在调用 ADC_Init()之后,必须调用ADC_ChannelConfig()/来配置每个所使用通道的转换次序和采样时间ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_55Cycles5);ADC_RegularChannelConfig(ADC1,ADC_Channel_1,2,ADC_SampleTime_55Cycles5);ADC_
6、RegularChannelConfig(ADC1,ADC_Channel_2,3,ADC_SampleTime_55Cycles5);ADC_RegularChannelConfig(ADC1,ADC_Channel_3,4,ADC_SampleTime_55Cycles5);/ 开启 ADC 的 DMA 支持(要实现 DMA 功能,还需独立配置 DMA 通道等参数)ADC_DMACmd(ADC1, ENABLE);ADC_Cmd(ADC1, ENABLE); /使能指定的 ADC1,ADC 开始工作/* Enable ADC1 reset calibaration register */
7、ADC_ResetCalibration(ADC1); /重置指定的 ADC1 的校准寄存器/* Check the end of ADC1 reset calibration register */while(ADC_GetResetCalibrationStatus(ADC1); /获取 ADC1 重置校准寄存器的状态, 设置状态则等待/* Start ADC1 calibaration */ADC_StartCalibration(ADC1); /开始指定 ADC1 的校准状态/* Check the end of ADC1 calibration */while(ADC_GetCali
8、brationStatus(ADC1); /获取指定 ADC1 的校准程序, 设置状态则等待/* Start ADC1 Software Conversion */下面函数不可缺少 *ADC_SoftwareStartConvCmd(ADC1, ENABLE); /使能指定的 ADC1 的软件转换启动功能 /获得 ADC 值/ch:通道值 03u16 Get_Adc(u8 ch) /设置指定 ADC 的规则组通道,设置它们的转化顺序和采样时间/ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 ); /ADC1,ADC
9、通道 3,规则采样顺序值为 1,采样时间为 239.5 周期 /ADC1-CR2|=1SR /使能 DMA 传输时钟DMA_DeInit(DMA_CHx); /将 DMA 的通道 1 寄存器重设为缺省值DMA1_MEM_LEN=cndtr; DMA_InitStructure.DMA_PeripheralBaseAddr = cpar; /DMA 外设 ADC 基地址DMA_InitStructure.DMA_MemoryBaseAddr = cmar; /DMA 内存基地址DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;/DST; /外设作
10、为数据传输的目的地DMA_InitStructure.DMA_BufferSize = cndtr; /DMA 通道的 DMA 缓存的大小DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; /外设地址寄存器不变DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; /内存地址寄存器递增 Enable,地址不变 DisableDMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Half
11、Word;/Word 一个字 /DMA 外设 ADC 基地址, 数据宽度为 8 位DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; /半个字_HalfWord;一字节_Byte; /DMA 内存基地址, 数据宽度为 8 位DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;/循环模式开启,Buffer 写满后,自动回到初始地址开始传输/工作在正常缓存模式DMA_Mode_Normal; DMA_InitStructure.DMA_Priority = DMA_Prio
12、rity_Medium; /DMA 通道 x 拥有中优先级 DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; /DMA 通道 x 没有设置为内存到内存传输DMA_Init(DMA_CHx, /根据 DMA_InitStruct 中指定的参数初始化DMA 的通道 USART1_Tx_DMA_Channel 所标识的寄存器/下面两个函数不可缺少 *DMA_Cmd(DMA1_Channel1, ENABLE); /启动 DMA 通道DMA_ITConfig(DMA1_Channel1, DMA_IT_TC, ENABLE); /使能 DMA 传输完成中断 Dm
13、a.h 文件void MYDMA_Config(DMA_Channel_TypeDef*DMA_CHx,u32 cpar,u32 cmar,u16 cndtr);/配置DMA1_CHxstm32f10x_it.c 文件/*STM32 DMA 中断函数 */void DMA1_Channel1_IRQHandler(void)if(DMA_GetITStatus(DMA1_IT_TC1) != RESET)filter();/ADC 滤波函数DMA_ClearITPendingBit(DMA1_IT_TC1);主函数调用#define ADC1_DR_Address (u32)0x4001244c) /ADC 数据寄存器地址extern vu16 AD_ValueNM;/主函数和子函数公用同一变量时使用extern vu16 After_filterM; /用来存放求平均值之后的结果extern vu16 Vtemp_sensorM; /电压转换完成后的实际电压值MYDMA_Config(DMA1_Channel1,(u32)/DMA 初始化,(DMA 的通道 1,外设 ADC 地址,内存地址,缓存大小 )