stm32 多通道ADC+DMA采集

发布者:JoyfulLife最新更新时间:2019-08-09 来源: eefocus关键字:stm32  多通道  ADC  DMA采集 手机看文章 扫描二维码
随时随地手机看文章

/*******************************************************************

** 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    {  

        for(j=0;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   {  

      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;

}



该程序由本楼主自己编写,完成调试,只要适当调用程序即可正常使用,有问题可评论,一起探讨。。。


关键字:stm32  多通道  ADC  DMA采集 引用地址:stm32 多通道ADC+DMA采集

上一篇:stm32 启动文件解析
下一篇:stm32f0 TIM1实现输出PWM波形

推荐阅读最新更新时间:2024-10-28 23:16

ADC时延和建立时间的区别
  对于大多数 ADC 用户来说,“ 时延 ”和“ 建立时间 ”这两个术语有时可以互换。但对于 ADC 设计人员而言,他们非常清楚这两个术语的区别,以及这些现象将会如何影响您的应用电路。ADC 用户已注意到这两个 ADC 特性会对他们的电路产生一些影响,这是一个不争的事实,但是,人们对于时延和建立时间普遍存在误解,因此当一个系统设计人员绞尽脑汁地想要找出信号完整性问题的时候,可能受挫。   无论转换器采用一个 SAR(逐次逼近寄存器)、流水线型还是 ∆-∑ 拓扑结构,ADC 时延均为从转换器采集模拟信号到数字输出字段准备检索所花费的总时间量。时延,或者延迟,包括转换时间及数字输出时间,但不包括采样时间。与一些产品说明书前几页所
[电源管理]
STM32之定时器应用
定时控制的寄存器包括; TIMX_CR1; TIMX_ CR2; TIMX_ SMCR;TIMX_ DIERTIMX_ SR;TIMX_EGR;TIMX_ CCMR1;TIMX_ CCMR2;TIMX_CCER;TIMX_ CNT;TIMX_ PSC;TIMX_ ARR;TIMX_ RCR;TIMX_ CCR1;TIMX_ CCR2;TIMX_ CCR3;TIMX_CCR4;TIMX_ BDTR;TIMX_ DCR;TIMX_tDMAR;各个寄存器配置: void TIMER_X_Init(TIM_TypeDef* TIMx,uint16_t TIM_ClockDivision,uint16_t TIM_Prescaler) {
[单片机]
STM32之I2C例程(24C02)
#include stm32f10x.h #include #define SCL_H (GPIOB- BSRR = GPIO_Pin_6) #define SCL_L (GPIOB- BRR = GPIO_Pin_6) #define SDA_H (GPIOB- BSRR = GPIO_Pin_7) #define SDA_L (GPIOB- BRR = GPIO_Pin_7) #define SCL_READ (GPIOB- IDR & GPIO_Pin_6) #define SDA_READ (GPIOB- IDR & GPIO_Pin_7) #define I2C_DELAY (I2C_delay()) /* R
[单片机]
ADC驱动放大器AD8137原理及应用
AD8137是ADI公司推出的轨对轨输出低成本全差分高速放大器,它具有低噪声、低失真和宽动态范围,可用于驱动12位ADC,非常适用于要求低成本和低功耗的系统。      图1是AD8137的8脚SOIC封装图。   器件工作原理   AD8137含内部共模参考电压的共模电路以及偏置关断电路,其原理框图如图2所示。AD8137的输入跨导部分是一个H桥,它的输出电流镜像到高阻结点CP和CN。输出部分是传统的H桥驱动电路,带着普通的发射装置驱动结点+OUT和-OUT。      AD8137采用两个反馈环来分别控制差模和共模反馈。它的差模增益由外部电阻决定,这与传统放大器一样。而输出共模电压则由一个受外部Vo
[模拟电子]
<font color='red'>ADC</font>驱动放大器AD8137原理及应用
STM32采用HAL库HAL_UART_Receive_IT()多次开启的问题
硬件平台:STM32F429 软件平台:Keil 5 采用HAL库 本人借鉴了正点原子的例程,在这里表示感谢。 在编写串口的过程中,遇到了 HAL_UART_Receive_IT(&UART1_Handler, (u8 *)aRxBuffer, 1);1 这个函数,首先是在初始化uart_init(115200)的时候调用了一次。 紧接着,在串口中断服务函数里,又调用了一次,继续接收,这样就不会造成接收完指定的的数据帧长度就不会进入中断了。如下图: 在这里,我们需要引入原子哥的一张图, 由此图可知: 采用HAL库,中断方式接收串口,只有当RxXferCount == 0 时,也就是调用这个函数,接收指定量的数据大小完成
[单片机]
<font color='red'>STM32</font>采用HAL库HAL_UART_Receive_IT()多次开启的问题
stm32数据类型
stm32编程过程经常定义变量类型,经常担心数据运算过程中 超过变量类型范围。因为在编程过程中,不同的CPU,其数据类型的意义各不相同,所以一定要注意相应变量数据类型的定义和转换,否则在计算中可能会出现不确定的错误。所以下面列出常见数据类型: 一、C语言数据类型 stm32使用的数据类型定义在 stm32f30x.h中 This file contains all the peripheral registers definitions, bits * definitions and memory mapping for STM32F30x devices. 整型定义: #include core_cm
[单片机]
avr单片机mega32之ADC程序
查手册,写程序,有问题再讨论 ***************************************************************** //CPU:mega32 //编译器:iar #include ioavr.h #include adc.h int main(void) { int m; adc_init(); m = adc_get(0); m=m; while(1); } void adc_init(void) { ADMUX = 1 REFS0 | 0 ADLAR ;//参考电源:AVcc 右对齐 ADCSRA = 1 ADEN | 7;//adc使能 1
[单片机]
STM32单片机SPI的使用原理解析
1、SPI使用原理 以数据交换实现数据传输,第一个跳变沿实现数据输出,第二个跳变沿实现采样。如下图 2、GPIO的配置 GPIO_InitTypeDef GPIO_InitStructure; //配置SPI2管脚 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOB, ENABLE); GPIO_InitStructure.GPIO_ Pi n = GPIO_Pin_13 |GPIO_Pin_14| GPIO_Pin_15; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStru
[单片机]
<font color='red'>STM32</font>单片机SPI的使用原理解析
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved