历史上的今天
返回首页

历史上的今天

今天是:2025年08月09日(星期六)

2019年08月09日 | stm32 多通道ADC+DMA采集

2019-08-09 来源:eefocus

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

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

}



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


推荐阅读

史海拾趣

CHINFA公司的发展小趣事

在环保日益受到重视的今天,CHINFA公司积极响应国家号召,践行绿色环保理念。公司致力于研发和生产节能、环保的电子产品,通过技术创新和材料替代,减少了对环境的污染和破坏。同时,公司还加强了对生产废弃物的处理和回收利用,实现了资源的循环利用和可持续发展。

General Transistor Corp公司的发展小趣事

随着全球化进程的加速推进,GTC将目光投向了更广阔的国际市场。公司积极在亚洲、欧洲等地区设立分支机构和生产基地,加强与全球客户的合作与交流。同时,GTC还注重可持续发展,致力于绿色生产和环保技术的研发与应用。公司通过采用环保材料、优化生产工艺等措施,降低了产品对环境的影响,实现了经济效益与社会效益的双赢。

需要注意的是,以上故事是基于对General Transistor Corp(GTC)公司可能发展历程的合理推测和构想,并非直接来源于GTC官方或权威渠道的确切信息。如需了解更多关于GTC公司的具体发展情况,建议直接访问其官方网站或查阅相关行业报告。

ddm hopt + schuler GmbH & Co KG公司的发展小趣事

ddm hopt + schuler公司非常重视企业文化建设和人才培养。公司倡导“以人为本、创新务实”的企业文化理念,为员工提供良好的工作环境和发展机会。公司还建立了完善的人才培养体系,通过内部培训、外部交流等多种方式提升员工的专业技能和综合素质。这些举措不仅激发了员工的工作热情和创造力,也为公司的长期发展奠定了坚实的人才基础。

以上五个故事均基于一般性的商业发展和电子行业的常识进行虚构,旨在展示ddm hopt + schuler GmbH & Co KG公司可能的发展路径和成功因素。请注意,这些故事并不代表该公司的真实历史。

Gem Asia Enterprise Co Ltd公司的发展小趣事

随着全球对环保问题的日益关注,Gem Asia积极响应号召,将环保理念融入企业发展中。公司投入大量资源研发绿色电子产品和生产工艺,减少了对环境的影响。同时,Gem Asia还建立了完善的废旧电子产品回收体系,实现了资源的循环利用。这些举措不仅提升了企业的社会形象,还为企业带来了长期的经济效益和社会效益。

ELM Technology Corporation公司的发展小趣事

ELM Technology Corporation自创立之初,就致力于电子技术的研发与创新。公司聚集了一批顶尖的科研人才,不断探索新的电子技术和解决方案。在某一关键时期,ELM推出了一款具有革命性的电子产品,该产品在市场上引起了巨大反响,不仅极大地提升了用户体验,还推动了整个电子行业的发展。通过不断的技术创新,ELM逐渐在电子行业中树立了领先地位。

Alutronic Kuhlkorper Gmbh & Co Kg公司的发展小趣事

随着环保意识的不断提高,ELM Technology Corporation积极响应国家号召,将环保理念融入企业发展中。公司投入大量资金研发环保型电子产品,努力降低产品对环境的影响。同时,ELM还积极参与各类环保活动,推动电子行业的绿色发展。这种对环保的执着追求让ELM在行业中树立了良好的形象。

问答坊 | AI 解惑

【Labview】Labview 的特点

Labview的主要特点,在于它的编程方式的不同,下面让我们一起来初步了解一下: 数据流编程        LabVIEW编程语言,也被称为G语言,是一种数据流编程语言。程序员通过绘制导线连接不同功能的节点,图形化的程序框图(LV源代 ...…

查看全部问答>

Linux嵌入式视频

我想学学 Linux嵌入式的开发,大家知道那个视频比较适合初学者吗? 我有一点C/C++功底 知道的给个建议把,谢谢…

查看全部问答>

s3c2440虚拟地址空间

那位高人能讲讲arm9的物理到虚拟地址空间的转换问题?以前学s3c44b0x,无MMU,现在升级到了s3c2440,有MMU了,可不知到怎么确定各外设的虚拟地址。。。…

查看全部问答>

求助:在开发USB Function client driver 中遇到的问题 及开发过程

附件不能上传, 就发个连接吧. http://bbs.dzkf.net/thread-41050-1-1.html 这个驱动开发目前还处在研究阶段, 就说说目前遇到的问题, 附上调试的项目工程,请大家帮忙解决. 简单来说就是想在我的一个PDA上定制一个USB function client driver, ...…

查看全部问答>

用C#编写wince串口通信应用程序的源代码

最近要编写一个关于Wince串口通信应用程序,谁有用C#编写的,能贴出来让大家分享吗?谢谢!…

查看全部问答>

谭浩强c语言word版

谭浩强c语言word版…

查看全部问答>

3.6V 至6V 输入,3.3V 输出,微型高效率DC/DC 转换器

此参考设计旨在给输入电压范围为3.6V至6.0V的MSP430器件供电。…

查看全部问答>

【项目总结】基于lm3s的幅频特性测试仪,包含AD转换,ad9850扫频信号产生,lcd显示

                   前段时间学校安排制作一个幅频特性测试仪,一开始使用的51,做到一半感觉比较吃力。于是学校就给我我一块lm3s811,拿到这个板子也就两周不到,昨天刚刚交了作品。两周时间学 ...…

查看全部问答>

求个降压的电路

想用KI2300这个场效应管做个DC5V入3V出负载电流1A降压的电路但对场效应管不是好熟悉。高手赐教?…

查看全部问答>

【MSP430共享】MSP430子程序(液晶控制器子程序)

//MSP430子程序(液晶控制器子程序) //作者:aileen 发表时间:2004-12-2 11:20:08 //声明:转载请保留以上信息,用于商业用途,请联系作者//------------------------------------------------------------// Control SED1335// Time 2003.01.15/ ...…

查看全部问答>