stm32 多通道ADC+DMA采集
来源:互联网 发布:查开放房记录软件 编辑:程序博客网 时间:2024/06/05 04:28
/********************************************************************* Variables Definitions *********************************************************************/__IO uint16_t ADC_DMAValue[20][2];GPIO_InitTypeDef GPIO_Init_ADC; ADC_InitTypeDef ADC1_InitStructure; //ADC初始化结构体声明DMA_InitTypeDef DMA1_InitStructure; //DMA初始化结构体声明NVIC_InitTypeDef NVIC_DMA1Structure;/*******************************函数名称:ADC_DMA_config函数功能:ADC1与DMA1的联合初始化函数参数:uint32_t addr DMA1内存存储地址函数返回值:无*********************************/void ADC1_DMA1_config(uint32_t addr){ RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); //使能ADC时钟 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE); //使能GPIOC时钟 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB,ENABLE); //使能GPIOC时钟 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //使能DMA时钟 RCC_ADCCLKConfig(RCC_ADCCLK_PCLK2_Div4); //ADC时钟频率 48/4=12MHZ ,不可以大于14MHZ GPIO_Init_ADC.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_0; //管脚PB1 PB0 GPIO_Init_ADC.GPIO_Mode = GPIO_Mode_AN; //模拟输入模式 GPIO_Init_ADC.GPIO_Speed = GPIO_Speed_Level_3; GPIO_Init_ADC.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOB, &GPIO_Init_ADC); //GPIOB初始化/********************* ADC1初始化 ******************************/ ADC_DeInit(ADC1); ADC1_InitStructure.ADC_Mode = ADC_Mode_Independent; //独立的转换模式 ADC1_InitStructure.ADC_ScanConvMode = ENABLE; //开启扫描模式 ADC1_InitStructure.ADC_ContinuousConvMode = ENABLE; //开启连续转换模式 ADC1_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //ADC外部开关,关闭状态 ADC1_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //对齐方式,ADC为12位中,右对齐方式 ADC1_InitStructure.ADC_NbrOfChannel =2; //开启通道数,2个 ADC_Init(ADC1, &ADC1_InitStructure); // ADC_ExternalTrigConvCmd(ADC1,ENABLE); ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 1, ADC_SampleTime_239Cycles5); //ADC通道组, 第8个通道 采样顺序1,转换时间 239.5个周期 ADC_RegularChannelConfig(ADC1, ADC_Channel_9, 2, ADC_SampleTime_239Cycles5); //ADC通道组, 第9个通道 采样顺序2,转换时间 ADC_DMACmd(ADC1, ENABLE); //使能ADC与DMA的传输 ADC_Cmd(ADC1, ENABLE); //开启ADC1 Delay_US(20); ADC_ResetCalibration(ADC1); //重新校准 while(ADC_GetResetCalibrationStatus(ADC1)); //等待重新校准完成 ADC_StartCalibration(ADC1); //开始校准 while(ADC_GetCalibrationStatus(ADC1)); //等待校准完成 /****************** DMA1初始化 *******************/ DMA_DeInit(DMA1_Channel1); //开启DMA1的第一通道 DMA1_InitStructure.DMA_PeripheralBaseAddr =(uint32_t)&ADC1->DR; //DMA对应的外设基地址 DMA1_InitStructure.DMA_MemoryBaseAddr =addr; //内存存储基地址 DMA1_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //DMA的转换模式为SRC模式,由外设搬移到内存 DMA1_InitStructure.DMA_BufferSize =40; //DMA缓存大小,20个 DMA1_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设地址递增 DMA1_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //内存地址递增 DMA1_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //定义外设数据宽度 DMA1_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; //DMA搬移数据尺寸 DMA1_InitStructure.DMA_Mode = DMA_Mode_Circular; //转换模式,循环缓存模式。 DMA1_InitStructure.DMA_Priority = DMA_Priority_High; //DMA优先级高 DMA1_InitStructure.DMA_M2M = DMA_M2M_Disable; //M2M模式禁用 DMA_Init(DMA1_Channel1, &DMA1_InitStructure); DMA_Cmd(DMA1_Channel1, ENABLE); DMA_ITConfig(DMA1_Channel1, DMA_IT_TC, ENABLE); //DMA发送中断使能 NVIC_DMA1Structure.NVIC_IRQChannel = DMA1_Channel1_IRQn; NVIC_DMA1Structure.NVIC_IRQChannelPreemptionPriority = 2; NVIC_DMA1Structure.NVIC_IRQChannelSubPriority = 1; NVIC_DMA1Structure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_DMA1Structure); // Enable the DMA Interrupt }/*********************************************************** 函数名称: Get_Adc函数功能: 等待ADC1转换完成入口参数: void出口参数: void***********************************************************/ void Get_Adc() { ADC_RegularChannelConfig(ADC1,ADC_Channel_8,1, ADC_SampleTime_239Cycles5); //ADC通道组, 第8个通道 采样顺序1,转换时间 239.5个周期 ADC_RegularChannelConfig(ADC1, ADC_Channel_9, 2, ADC_SampleTime_239Cycles5); //ADC通道组, 第9个通道 采样顺序2,转换时间 ADC_SoftwareStartConvCmd(ADC1, ENABLE); //软件规则组通道转换使能 while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC )); //等待转换结束 }void bubbleSort(uint8_t column) //冒泡排序算法,从大到小进行排序{ int i,j; int flag = 1; for(i=0;i<N&&flag;i++) { for(j=0;j<N-1-i;j++) { flag = 0; if(ADC_DMAValue[j][column]>ADC_DMAValue[j+1][column]) { uint16_t temp = ADC_DMAValue[j][column]; ADC_DMAValue[j][column] = ADC_DMAValue[j+1][column]; ADC_DMAValue[j+1][column] = temp; flag = 1; } } } }void filter() //均值滤波处理函数{ for(count=4;count<N-4;count++) //去掉较大的四个值和较小的四个值,再取其余值的平均值 { ADC_Value1+=ADC_DMAValue[count][0]; ADC_Value2+=ADC_DMAValue[count][1]; } ADC_Value1=ADC_Value1/(N-8); ADC_Value2=ADC_Value2/(N-8); RxCounter=7;}该程序由本楼主自己编写,完成调试,只要适当调用程序即可正常使用,有问题可评论,一起探讨。。。
阅读全文
0 0
- stm32 多通道ADC+DMA采集
- STM32 DMA 多通道 ADC 采集
- STM32通过DMA采集多通道AD
- STM32通过DMA采集多通道AD
- STM32通过DMA采集多通道AD
- stm32 adc dma多通道采样 数据错位 的解决方法
- stm32的多通道ADC和DMA的设置问题
- STM32采集多路ADC到DMA的方法
- STM32的ADC多通道采集的实现
- STM32 ADC 多通道16路电压采集
- STM32多通道ADC操作
- PIC18F,ADC多通道采集,定时采集
- STM32 多通道ADC采样,采用Timer1进行采样率控制,利用DMA进行传输
- STM32 多通道ADC采样,采用Timer1进行采样率控制,利用DMA进行传输
- STM32之ADC 一个8通道DMA程序
- STM32之ADC 一个8通道DMA程序
- STM32F407IG多通道ADC-DMA采样
- STM32F407的ADC之DMA多通道
- JDK中hash冲突解决的两种方法
- list笔记
- javascript设置无缝滚动图片
- python进行独立样本t检验
- OCR实时扫描识别中英文--tess_two在Android的使用
- stm32 多通道ADC+DMA采集
- 简单轮播图
- 【java面试】java和C/C++的区别
- Xpath语法(二)
- 关于edittext 输入的软键盘处理
- JVM学习第一篇
- CreateJs系列教程之 EaselJs_6_绘制动画走秀(spriteSheet)
- 【玖哥乱弹】如何做一个合格的Android面试官
- 循环冗余校验-CRC校验