STM32F4 ADC采集数据的DMA数据传输

发布者:幸福家园最新更新时间:2016-12-19 来源: eefocus关键字:STM32F4  ADC  采集数据  DMA  数据传输 手机看文章 扫描二维码
随时随地手机看文章

      书接上文,开始折腾ADC的DMA传输。因为大家都在说DMA,就连ST的例子里边也是使用DMA的。

        ADC采集到的数据都存储在一个固定的寄存器中。当常规采样方式采样多个通道时候,使用DMA可以较好地避免将采集到的数据丢失。当ADC的DMA功能被使能的时候,每个通道转换完毕时都会发出一个DMA请求。DMA方式也不能完全避免数据丢失问题,要实现数据不丢失需要在DMA的同时开启OVERRUN模式,当数据丢失时就停止数据转换。我们只需要检测是否有OVR时间发生,就能解决采样数据丢失造成的问题。比如,通道错位什么的。

在STM32F4的Reference manual中可以查到ADC1 的DMA映射在DMA1、CH0、Stream0上。

【实验1、DMA方式采集单一通道数据】

       配置ADC1的DMA初始化设置如下:

//DMA初始化
DMA_InitStructure.DMA_BufferSize = 4;
DMA_InitStructure.DMA_Channel = DMA_Channel_0;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&adcvalue1;   //目标数据位
DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_BASE+0x4C;  //ADC->DR地址
DMA_InitStructure.DMA_PeripheralBurst =DMA_PeripheralBurst_Single;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_Init(DMA2_Stream0,&DMA_InitStructure);
DMA_Cmd(DMA2_Stream0,ENABLE);

在ADC寄存器中开启DMA传输,使用两个函数一个是设置CR2的DDS位,使得每次ADC数据更新时开启DMA传输;

另一个是设置ADC CR2的DMA位,使能ADC的DMA传输。

分别使用以下两个函数:

ADC_DMARequestAfterLastTransferCmd(ADC1,ENABLE); //源数据变化时开启DMA传输
ADC_DMACmd(ADC1,ENABLE);//使能ADC的DMA传输

最后,还是在adcvalue中读出ADC的采样值,可以看到,没有使用函数ADC_GetConversionValue来读ADC的DR寄存器,照样能输出ADC采样到的值:

  while(1)
  {
    for(i = 0;i<10000;i++)
    {
        sum += adcvalue1;
      if(i ==9999)
      {
         avgvota = sum/10000;
         sum = 0;
        printf("avg vota is: %d\r\n",avgvota*3300/0xfff);
      }
    }
  }

【实验2、DMA方式采集4个通道数据】

同时采样两路数据首先要将ADC_InitStructyre中的ADC_NbrOfConversion 改变。之后再用ADC_RegularChannelConfig将通道0添加到扫描通道序列即可。

从一路变成4路,总共改了一行代码,添加3行代码:

ADC_InitStructyre.ADC_NbrOfConversion = 2;

ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_144Cycles);
ADC_RegularChannelConfig(ADC1,ADC_Channel_1,2,ADC_SampleTime_144Cycles);
ADC_RegularChannelConfig(ADC1,ADC_Channel_2,3,ADC_SampleTime_144Cycles);
ADC_RegularChannelConfig(ADC1,ADC_Channel_3,4,ADC_SampleTime_144Cycles);

实验时候,将PA0、PA1、PA2、PA3的输入接地或者接3.3伏电源,可在电脑端看到两个数据在跳变:0和3300.说明采样到了数据。

【附注】

在进行这个实验时候,遇到了一个小插曲。

在对PA端口进行初始化的时候,我是这样写的:

GPIO_InitStructure.GPIO_Pin = GPIO_PinSource0 | GPIO_PinSource1 | GPIO_PinSource2 | GPIO_PinSource3;

这个问题导致了GPIO初始化的失败,是的ADC采样不到相应引脚的值。我一直在找DMA和ADC的配置问题,偶然才发现不能这么些。

GPIO_PinSource0 和 GPIO_Pin_0 是不一样的。引脚初始化的时候应该用GPIO_Pin_0。查看库里边的宏定义,两个值是不一样的。

GPIO_PinSource0 指的是引脚号,GPIO_Pin_0却是GPIo寄存器里边对应的位。一定要分清楚

改过来之后就一切正常了,可以完美采样四路输入的数据。

下一篇,将实验ADC的其他工作模式。


关键字:STM32F4  ADC  采集数据  DMA  数据传输 引用地址:STM32F4 ADC采集数据的DMA数据传输

上一篇:STM32F4 ADC之内部温度传感器
下一篇:STM32F4之ADC1

推荐阅读最新更新时间:2024-03-16 15:26

北高智推出2.4G无线双向透明数据传输模块方案
内容简要 :基于博通(BEKEN)BK2411 2.4G无线收发芯片,同时针对工业控制、门禁、考勤、监控、安防等行业应用特点推出本方案。      当前市场上2.4G无线模块的方案众多,这些方案基本上都是对不同RF芯片典型应用线路的整合。这些方案虽然一定程度上给用户带来了方便,但是在客户具体应用的时候,依然需要做大量的软件设计工作,延迟了客户产品的上市时间。     北高智 推出的2.4G无线双向透明 数据传输 模块方案,专门针对无线工业控制、监控、安防、门禁、考勤等行业应用,是真正意义上的方案整合。既不需要做任何额外的工作,只需要加上电源就能够实现其最基本的功能,不需要客户去慢慢研究复杂的RF芯片的寄存器配置
[工业控制]
STM32 UART DMA实现未知数据长度接收
串口通信是经常使用到的功能,在STM32中UART具有DMA功能,并且收发都可以使用DMA,使用DMA发送基本上大家不会遇到什么问题,因为发送的时候会告知DMA发送的数据长度,DMA按照发送的长度直接发送就OK了,但是使用DMA接收时候就不同了,因为有时候数据接收并不是每一次都是定长的,但是DMA只在接收数据长度和设定数据长度相同的时候才可以触发中断,告诉MCU数据接收完毕,针对这个问题,解决方法如下,有一点复杂,但是很管用。 UART在传输一个字节的时候,首先拉低,传输起始位,然后在是LSB MSB,最后是停止位,停止位是高电平 超时时间 搞过串口通信的都知道,如果串口有协议,一般都是有个超时时间的,超时时间是定义两个帧之间的间
[单片机]
Easy Drive ADC简化高阻抗传感器的测量
增量累加 ADC 凭借高准确度和很强的抗噪声性能,非常适合用来直接测量很多类型的传感器。然而,输入采样电流可能压垮高源阻抗或低带宽、微功率信号调理电路。LTC2484增量累加转换器系列通过平衡输入电流解决了这个问题,从而简化了信号调理电路或者不再需要这种电路。增量累加 ADC 的常见应用是热敏电阻器测量。图 1 显示了直接测量高达 100kΩ的热敏电阻器时 LTC2484 的连接方式。数据 I/O 通过标准 SPI 接口连接,每个输入的采样电流约为: 其中 或者当 VREF 为 5V、两个输入都接地时,约为 1.67μA。 图 1:LTC2484 的连接方式 4-WIRE SPI INTERFAC
[测试测量]
Easy Drive <font color='red'>ADC</font>简化高阻抗传感器的测量
延长ADC使用寿命的节能技术
在便携式传感器、4至20mA控制回路或具有模数转换器(ADC)的其他系统设计中,功耗越低,意味着电池续航时间越长,控制系统功能越强。在选择满足应用的功率预算的ADC时,可使用多种技术和折衷方案。 降低功耗最明显的方法是采用电源电压较低的ADC。如今的ADC可以采用3、2.5甚至1.8V的模拟和数字电源供电,5至3V的电压降可以实现40%的即时省电。 降低数字电源电压会引起两个不利因素:ADC上需要一个独立的数字电源引脚,并且数字输出端可能出现较低的驱动电流。通过降低模块电源电压来降低功耗时,主要问题是信噪比(SNR)较低。不过现在的低噪声处理技术和设计技巧可以确保现在的低压ADC的SNR与模拟电源电压较高的大功率ADC相同
[嵌入式]
STM32F4的IO设置测试
环境: 主机:WIN7 开发环境:MDK4.72 MCU:STM32F407VGT6 说明: 目标板上有一个LED,有一个按键,按键实现LED状态翻转. LED:PE2,低电平亮,高电平灯灭 按键:PC13,低电平按下,高电平松开 源代码: main.c /********************************************************************* * 主文件 * (c)copyright 2014,jdh * All Right Reserved *新建日期:2014/3/2
[单片机]
NI推出10款Wi-Fi 与以太网数据采集设备
无线和以太网设备提供了操作方便且高性能的远程测量性能 美国国家仪器有限公司(National Instruments,简称NI)近日推出10款全新的Wi-Fi与以太网数据采集设备(DAQ),可将NI测试硬件和软件平台扩展到无线远程监视应用。新型无线与以太网数据采集设备包含了内置信号调理,并可以将电气、物理、机械和声音信号与传感器直接连接。 工程师和科学家可以将NI 无线数据采集(Wi-Fi DAQ)设备与NI LabVIEW软件平台整合在一起,在不降低性能的基础上,减少接线成本、提高灵活性,满足对无线结构诊断、环境和机器状态监测应用的需要。 NI数据采集与控制市场副总裁John Hanks指出:“用于L
[测试测量]
NI推出10款Wi-Fi 与以太网<font color='red'>数据</font><font color='red'>采集</font>设备
STM32 ADC基础内容
ADC,Analog-to-Digital Converter(模数转换器),其应用非常广泛,比如温度、湿度、压力、声音等传感器领域。 ADC的类型很多,STM32内部集成的ADC为逐次逼近型。STM32虽然是通用MCU芯片,但它内部集成的ADC也非常出色,不比一些专用ADC芯片差。 1 STM32 ADC 基础内容 STM32内部集成的ADC与型号有关,有16位、12位ADC,内部集成ADC多达4个,通道数多达40个,甚至更多。 1. ADC分辨率 分辨率决定了ADC的转换精度,按理说分辨率越高越好,但价格更贵。 STM32内部集成的ADC最高16位,2的16次方,即65536的分辨率。只有少数STM32才集成16位分辨
[单片机]
STM32 <font color='red'>ADC</font>基础内容
一个单片机串行数据采集/传输模块的设计
在微机测控系统中,经常要用到A/D转换。常用的方法是扩展一块或多块A/D采集卡。当模拟量较少或是温度、压力等缓变信号场合,采用总线型A/D卡并不是最合适、最经济的方案。这里介绍一种以GNS97C2051单片机为核心,采用TLC2543 12位串行A/D转换器构成的采样模块,该模块的采样数据由单片机串口经电平转换后送到上位机(IBM PC兼容机)的串口COM1或COM2,形成一种串行数据采集串行数据传输的方式。经实践调试证实:该模块功耗低、采样精度高、可靠性好、接口简便,有一定实用价值。 1 主要器件介绍 1.1 TLC2543串行A/D转换器 模块采用TI公司的TLC2543 12位串
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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