STM32F4 ADC采集数据的DMA数据传输【库函数操作】

发布者:姑苏清风泉源客最新更新时间:2020-01-20 来源: 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: %drn",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寄存器里边对应的位。一定要分清楚改过来之后就一切正常了,可以完美采样四路输入的数据。

关键字:STM32F4  ADC  采集数据  DMA  数据传输  库函数操作 引用地址:STM32F4 ADC采集数据的DMA数据传输【库函数操作】

上一篇:STM32高级开发(12)-在GCC中使用printf打印串口数据
下一篇:STM32L1学习笔记05 串口校验位与数据位的一个坑

推荐阅读最新更新时间:2024-11-09 00:28

智能驾驶汽车车载网络行业发展报告分析
以太网逐步渗透车载网络,向更高速率演进。在汽车电动化趋势下,车内信息传输量持续提升,域/跨域集中式架构逐渐成为智能驾驶汽车的主流。传统车载网络以 CAN 总线为主,LIN 总线为辅,多种总线技术并存。车载以太网具有数据传输能力高、可靠性好、EMI功耗/延迟低、线束轻量化等优势。随着汽车智能化发展,车载以太网将率先应用于智能座舱和辅助驾驶,在未来逐步替代整车通信架构。 集中式架构成智能驾驶主流,以太网在中心节点占据优势地位。电子电气构架的演进为提升智能驾驶能力提供了坚实的基础。在自动驾驶、智能座舱、电动化等趋势的推动下,汽车所需功能增多,信息传输量及算力需求持续增长,传统分布式架构在可拓展性与通信性能方面难以满足产品需求。域/跨域集
[嵌入式]
智能驾驶汽车车载网络行业发展报告分析
基于声卡的数据采集及波形发生器设计
  一、概述   数据采集是信号分析和处理的一个重要环节,在很多产业控制和生产状态监控中,都需要对各种物理量进行数据采集和分析。但是,专用数据采集卡的价格一般比较昂贵,而我们PC机的声卡就是一个很好的双通道数据采集卡。实际丈量中,在满足丈量要求的条件下,可以充分利用计算机自身资源,完成数据采集任务,从而节省本钱。   本文利用vc编程实现了声卡的双通道数据采集,并且对信号进行频谱分析同时实时丈量出信号的频率。还利用声卡的DA通道,实现了正弦波、方波、三角波输出的信号发生器。波形发生器产生的信号同时还可以作为内部测试用信号,检验数据采集的正确性。   二、声卡数据采集系统硬件组成   Line Out   利用声卡进行数据采集的硬件组
[测试测量]
16.6410DMA简述
1.为什么需要DMA 首先看串口来传递信息:发送字符串。 发送函数:在uart.c里增加下面发送函数: 接下来在main.c里调用: 编译make, 烧写到开发板: 制作SD卡,设置开发板从SD卡启动,设置好minicom后给开发板上电,紧接着按着空格键: 选择 格式化NandFlash: 按照上面,选择从USB烧写image,然后选择1,烧写uboot。然后把USB线拉到虚拟机,会显示USB按着成功了。接下来就可以烧写编译好的.bin文件了。 在Linux里按着USB驱动: 接下来烧写: 串口信息: 设置开发板从NandFlash启动: 可以看到我们串口的信息已经打印出来了。说明
[单片机]
16.6410<font color='red'>DMA</font>简述
可编程逻辑器件在高准确度A/D转换器中的应用
1 引 言      可编程逻辑器件(PLD)是当今国际上流行的新一代数字系统逻辑器件。它主要是一种“与-或”两级式结构器件,除了具有高速度、高集成度性能之外,其最大的特点就是用户可定义其逻辑功能。因此PLD能够适应各种需求,大大简化系统设计,缩小系统规模,提高系统可靠性,受到广大工程技术人员的青睐。      可编程逻辑器件种类繁多,性能各异,主要有以下几种基本类型:可编程只读存储器(PROM),现场可编程逻辑阵列(FPLA),编程阵列逻辑(PAL),通用阵列逻辑(GAL)。通用阵列逻辑GAL(Generic ArrayLogic)是新一代的可编程逻辑器件,是采用先进的E2CMOS工艺制造的大规模集成电路,是新产品设计的理想器件
[应用]
STM32 串口发不出来数,或全0的问题
开始调试STM32串口的时候,怎么尝试,上位机都只收到0。对照例程自己一步一步写下来都不行。最后无奈,把例程直接全部复制粘贴过来,发现好使了。 后来几次用到串口的时候,又调了几次,貌似发现了一些问题。串口的初始化的顺序会造成输出全0的情况。正确初始化顺序如下: RCC_Configuration(); USART_GPIO_Configuration(); USART_Configuration(); NVIC_Configuration(); 或者: RCC_Configuration(); NVIC_Configuration(); USART_GPIO_Configuration();
[单片机]
STM32 串口发不出来数,或全0的问题
采用3mm x 2mm 封装的ADC 保证16 位性能
2007 年 11 月 6 日 - 北京 - 凌力尔特公司( Linear Technology Corporation )推出 16 位 I 2 C 兼容增量累加模数转换器( ADC ) LTC2453 ,该器件采用非常纤巧的 3mm x 2mm DFN 封装。其纤巧的尺寸、低功率和有保证的 16 位分辨率提高了便携式仪表和传感器的性能。 LTC2453 在 2.7V 至 5.5V 的单一电源范围内工作,能够测量高达 ±V CC 的差分输入。这种宽输入范围非常适合测量多种单端或差分传感器。 在仅为 6mm 2
[模拟电子]
ARM核心板在脑电监测TCI注射泵中的应用
1.1背景事件 针对患者手术中麻醉剂的施用,当麻醉剂量超标时,容易造成患者心跳、呼吸骤停从而造成脑损伤。传统的麻醉剂注射依靠麻醉师的经验,而新型的脑电监测TCI注射泵则将BIS(脑电监测)与TCI(靶控输注)相结合,真正在医疗电子中实现个体化镇静麻醉,减少麻醉风险。 1.2脑电监测TCI注射泵控制主板功能需求 脑电监测TCI注射泵在常规注射泵基础上,通过接收“脑电分析仪”的数据来进行分析决策注射量和注射速度,使注射更加科学,更加安全。 控制主板主要功能需求 : 显示接口,外接7寸以上真彩液晶,支持触摸屏; RS-232接口,连接脑电分析仪; PWM,控制注射电机; ADC,采集注射管位置数据信息; 声卡,注射过程提示
[医疗电子]
ARM核心板在脑电监测TCI注射泵中的应用
ADC/DAC精度计算器(ACCU)简介
精度计算器(ACCU)的数据转换器的应用电路的设计和分析。它计算的数据转换器的理想的直流精度。该方案是使用一台HP ® 50G的计算器或免费PC模拟器。 精度计算器 精度计算器(ACCU)的数据转换器的应用电路的设计和分析 。它计算了一个理想的数据转换器的直流精度,覆盖模拟数字转换器(ADC)和数字-模拟转换器(DAC )。数据转换器的直流精度的测量线性传递函数与理想的最大偏差。HP 50g的手持计算器是一个方便的工具,但也有许多使用Windows ®操作系统的计算机上运行一个免费的模拟器,如图1。精度参数的一个数据转换器的输入, 该信息的精度计算器,包括在自由模拟器完整的封装,输出传输功能。 “AACU用户的指南(
[模拟电子]
<font color='red'>ADC</font>/DAC精度计算器(ACCU)简介
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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