前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >怎样更好的利用DMA来实现采样数据的直接搬运存储

怎样更好的利用DMA来实现采样数据的直接搬运存储

作者头像
用户6754675
修改于 2020-07-20 06:23:03
修改于 2020-07-20 06:23:03
6830
举报
文章被收录于专栏:嵌入式单片机嵌入式单片机

  尝试了下STM32的ADC采样,并利用DMA实现采样数据的直接搬运存储,这样就不用CPU去参与操作了。

  找了不少例子参考,ADC和DMA的设置了解了个大概,并直接利用开发板来做一些实验来验证相关的操作,保证自己对各部分设置的理解。

  我这里用了3路的ADC通道,1路外部变阻器输入,另外两路是内部的温度采样和Vrefint,这样就能组成连续的采样,来测试多通道ADC自动扫描了,ADC分规则转换和注入转换,其实规则转换就是按照既定的设定来顺序转换,而注入转换就是可以在这顺序队列中插队一样,能够提前转换了。

  初始化设置://PC0 FOR ANAGLE SAMPLE

  复制代码

  static void Protect_ClkInit(void)

  {

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1|RCC_APB2Periph_GPIOC,ENABLE);

  RCC_ADCCLKConfig(RCC_PCLK2_Div6);

  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

  }

  static void Protect_GPIOInit(void)

  {

  GPIO_InitTypeDef GPIO_InitStructure;

  /GPIO PhaseA_H 初始化/

  GPIO_InitStructure.GPIO_Pin = ADC_PIN;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;

  GPIO_Init(TIMER_GPIO_AH_PORT, &GPIO_InitStructure);

  }

  static void Protect_AdcInit(void)

  {

  ADC_InitTypeDef ADC_InitStructure;

  ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;

  ADC_InitStructure.ADC_ScanConvMode = ENABLE;

  ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;

  ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;

  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;

  ADC_InitStructure.ADC_NbrOfChannel = 3;

  ADC_Init(ADC1, &ADC_InitStructure);

  ADC_TempSensorVrefintCmd(ENABLE);

  ADC_RegularChannelConfig(ADC1,ADC_Channel_10,1,ADC_SampleTime_7Cycles5);

  ADC_RegularChannelConfig(ADC1,ADC_Channel_TempSensor,2,ADC_SampleTime_7Cycles5);

  ADC_RegularChannelConfig(ADC1,ADC_Channel_Vrefint,3,ADC_SampleTime_7Cycles5);

  ADC_DMACmd(ADC1, ENABLE);

  /* Enable ADC1 external trigger */

  ADC_ExternalTrigConvCmd(ADC1, DISABLE);

  ADC_Cmd(ADC1, ENABLE);

  ADC_ResetCalibration(ADC1);

  while(ADC_GetResetCalibrationStatus(ADC1));

  ADC_StartCalibration(ADC1);

  while(ADC_GetCalibrationStatus(ADC1));

  }

  static void Protect_DMAInit(void)

  {

  DMA_InitTypeDef DMA_InitStructure;

  /* DMA1 channel1 configuration ----------------------------------------------*/

  DMA_DeInit(DMA1_Channel1);

  DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t) & (ADC1->DR);

  DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&ADCConvertedValue;

  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;

  DMA_InitStructure.DMA_BufferSize = 3;

  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;

  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;

  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;

  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;

  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;

  DMA_InitStructure.DMA_Priority = DMA_Priority_High;

  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;

  DMA_Init(DMA1_Channel1, &DMA_InitStructure);

  /* Enable DMA1 channel1 */

  DMA_Cmd(DMA1_Channel1, ENABLE);

  }

  复制代码

  复制代码设置好后测试,发现一个比较严重的问题,我在调变阻器的时候,发现会影响其他2路采样的数据,且数据变化比较大,我就先测试ADC的参考电压即Vref+和Vref-,没发现变化,那采样的初始化是否会有问题,在网上找了不少的资料,都没表明我的设置有问题,不过还是发现了一个不同,就是ADC_sampling_time的时间不同。那么我就把它设置成:

  ADC_RegularChannelConfig(ADC1,ADC_Channel_10,1,ADC_SampleTime_239Cycles5);

  1

  ADC_RegularChannelConfig(ADC1,ADC_Channel_TempSensor,2,ADC_SampleTime_239Cycles5);

  ADC_RegularChannelConfig(ADC1,ADC_Channel_Vrefint,3,ADC_SampleTime_239Cycles5);

  复制代码 即最大的采样时间,结果发现确实是这个问题,后来又试了下其他几个采样时间,最短也要ADC_SampleTime_71Cycles5,不然数据都会被影响,大概采样周期不能太短, 不然DMA数据传输可能会被影响。

  最后也是给大家分享一些资料便于参考

  stm32 如何用DMA搬运数据

http://www.makeru.com.cn/live/detail/1484.html?s=45051

  ( ADC读取光照传感器)

http://www.makeru.com.cn/live/1392_1004.html?s=45051

  (stm32 温湿度采集)

http://www.makeru.com.cn/live/detail/1476.html?s=45051

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
作者已关闭评论
暂无评论
推荐阅读
编辑精选文章
换一批
stm32_DMA采集一个AD数据_并通过DMA向串口发送
这是以前学32的时候写的,那时候学了32之后感觉32真是太强大了,比51强的没影。关于dma网上有许多的资料,关于dma采集ad网上也有很多。亲们搜搜,这里只贴代码了,其实我也想详详细细地叙述一番,但
杨奉武
2018/04/18
1.1K0
stm32_DMA采集一个AD数据_并通过DMA向串口发送
STM32 定时器触发 ADC 多通道采集,DMA搬运至内存
ADC 的功能是将模拟信号采样得到数字信号,而有些时候,我们需要使用到定时采样,比如在计算一个采集的波形的频率的时候,我们需要精确的知道采样频率,也就是 1 s 内采集的点数,这个时候,就需要使用到定时采集。定时采样有如下三种方法:
wenzid
2021/03/04
9.2K0
STM32 定时器触发 ADC 多通道采集,DMA搬运至内存
M-Arch(5)第四个示例:ADC&DMA
本文我们将总结下ADC和DMA的基本使用方法,并给出示例,从中我们可以看到GD和STM在设计上的差别。
滚神大人
2021/10/08
5750
STM32中AD采样的三种方法分析
在进行STM32F中AD采样的学习中,我们知道AD采样的方法有多种,按照逻辑程序处理有三种方式,一种是查询模式,一种是中断处理模式,一种是DMA模式。三种方法按照处理复杂方法DMA模式处理模式效率最高,其次是中断处理模式,最差是查询模式,相信很多学者在学习AD采样程序时,很多例程采用DMA模式,在这里我针对三种程序进行分别分析。
用户6754675
2020/07/08
1.4K0
【安富莱二代示波器教程】第6章 示波器设计—双通道ADC驱动
本章节为大家讲解示波器的ADC驱动,采用STM32自带ADC实现。关于STM32F429的ADC,可以说处处有地雷,不小心就踩上了,如果简单的使用,不会发现,复杂使用就很容易踩到了。
Simon223
2018/09/04
1.1K0
【安富莱二代示波器教程】第6章 示波器设计—双通道ADC驱动
开发者成长激励计划-基于TencentOS Tiny 的加热不燃烧烟具温度检测设备
此次开发和编译坏境是沁恒微的MounRiver Studio软件,此软件用熟了感觉你keil好用太多了,并且还是免费的开发软件。具体如何好,只有真正使用来开发的各位工程师能明白,在此就不多说了。界面如下图所示:
Torry
2022/08/08
2870
开发者成长激励计划-基于TencentOS Tiny 的加热不燃烧烟具温度检测设备
FOC和SVPWM的C语言代码实现「建议收藏」
SVPWM的原理讲解在这儿:https://blog.csdn.net/qlexcel/article/details/74787619#comments
全栈程序员站长
2022/09/05
5.5K2
FOC和SVPWM的C语言代码实现「建议收藏」
STM32F407-USART2+DMA空闲中断收发
用户11186929
2024/07/01
3640
蓝桥杯嵌入式之光敏电阻、ADC*2讲解
Tr AO是光敏值的输出端,Tr DO是判断器LM393D的输出端,它是比较光敏电阻的电压和滑动变阻器电压的大小。
用户5935416
2019/08/01
1.4K0
蓝桥杯嵌入式之光敏电阻、ADC*2讲解
STM32F407-USART3+DMA空闲中断收发
用户11186929
2024/07/01
3730
STM32F4 SPI DMA
张贴的代码显示如何配置我的GPIO,定时器,SPI, DMA和NVIC模块,以及一些系统如何工作的解释。 注意,我使用的是STM32F4标准外设库。
小锋学长生活大爆炸
2020/09/24
2.2K0
STM32F4 SPI DMA
M-Arch(8)第七个示例:串口和DMA
由于之前我们已经使用了串口1(STM中是USART1,GD中是USART0),本文中以串口2作为示例(STM中是USART2,GD中是USART1)。
滚神大人
2022/03/22
6300
M-Arch(8)第七个示例:串口和DMA
STM32F103RCT6+串口DMA方式接收定长数据
知否知否应是绿肥红瘦
2025/02/19
2150
STM32F103RCT6+串口DMA方式接收定长数据
STM32F407-USART1+DMA收发
用户11186929
2024/07/01
2280
STM32—无需中断来实现使用DMA接收串口数据
诺谦
2018/01/03
4.2K0
STM32—无需中断来实现使用DMA接收串口数据
串口通信DMA中断
这是以前学32的时候写的,那时候学了32之后感觉32真是太强大了,比51强的没影。关于dma网上有许多的资料,亲们搜搜,这里只贴代码了,其实我也想详详细细地叙述一番,但是自己本身打字就慢,还有好多事情
杨奉武
2018/04/18
2K0
串口通信DMA中断
基于STM32设计的数显热水器
当前介绍的项目是基于 STM32F103ZET6 系列 MCU 设计的数显热水器,通过显示屏来显示热水器的温度及其工作状态,通过 PT100 传感器来检测热水器的温度变化,并通过电加热片实现加热过程,以达到控制热水器温度的目的。
DS小龙哥
2023/08/09
3400
基于STM32设计的数显热水器
基于STM32的蔬菜大棚温湿度智能控制系统设计
随着人们对健康和可持续生活方式的关注不断增加,蔬菜大棚成为了现代农业中的重要组成部分。蔬菜大棚提供了一个受控的环境,使得农民能够在任何季节种植蔬菜,并根据需要进行调节。为了实现最佳的蔬菜生长和产量,对温度和湿度等环境条件的精确控制至关重要。
DS小龙哥
2023/09/27
2K0
基于STM32的蔬菜大棚温湿度智能控制系统设计
基于单片机设计的家用自来水水质监测装置
本文介绍基于单片机设计的家用自来水水质监测装置。利用STM32F103ZET6作为主控芯片,结合水质传感器和ADC模块,实现对自来水水质的检测和监测功能。通过0.96寸OLED显示屏,将采集到的水质数据以直观的方式展示给用户。
DS小龙哥
2023/10/19
3990
基于单片机设计的家用自来水水质监测装置
STM32读取MQ2烟雾浓度数据判断烟雾是否超标
MQ2传感器是一种可探测多种气体的传感器,常用于监测烟雾、液化气、丙酮、乙醇、甲醛、天然气等有害气体。MQ2传感器基于半导体敏感元件,通过检测气体中有害物质的浓度变化来实现气体检测。
DS小龙哥
2023/07/08
9240
STM32读取MQ2烟雾浓度数据判断烟雾是否超标
相关推荐
stm32_DMA采集一个AD数据_并通过DMA向串口发送
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档