STM32用DMA实现多路ADC通道数据采集

发布者:电子创新者最新更新时间:2016-06-03 来源: eefocus关键字:STM32  DMA  多路ADC通道  数据采集 手机看文章 扫描二维码
随时随地手机看文章
  今天尝试了下STM32的ADC采样,并利用DMA实现采样数据的直接搬运存储,这样就不用CPU去参与操作了。

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

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

  初始化设置:

 1 //PC0 FOR ANAGLE SAMPLE
 2 static void Protect_ClkInit(void)
 3 {
 4     RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1RCC_APB2Periph_GPIOC,ENABLE);
 5     RCC_ADCCLKConfig(RCC_PCLK2_Div6);
 6     RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
 7 }
 8 
 9 static void Protect_GPIOInit(void)
10 {
11     GPIO_InitTypeDef GPIO_InitStructure;
12 
13     /*GPIO PhaseA_H 初始化*/
14     GPIO_InitStructure.GPIO_Pin = ADC_PIN;
15     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
16     GPIO_Init(TIMER_GPIO_AH_PORT, &GPIO_InitStructure);
17 }
18 
19 static void Protect_AdcInit(void)
20 {
21     ADC_InitTypeDef ADC_InitStructure;
22     
23     ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
24     ADC_InitStructure.ADC_ScanConvMode = ENABLE;
25     ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
26     ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
27     ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
28     ADC_InitStructure.ADC_NbrOfChannel = 3;
29     ADC_Init(ADC1, &ADC_InitStructure);
30     
31     ADC_TempSensorVrefintCmd(ENABLE);
32     ADC_RegularChannelConfig(ADC1,ADC_Channel_10,1,ADC_SampleTime_7Cycles5);
33     ADC_RegularChannelConfig(ADC1,ADC_Channel_TempSensor,2,ADC_SampleTime_7Cycles5);
34     ADC_RegularChannelConfig(ADC1,ADC_Channel_Vrefint,3,ADC_SampleTime_7Cycles5);
35     
36     ADC_DMACmd(ADC1, ENABLE);
37     /* Enable ADC1 external trigger */
38     ADC_ExternalTrigConvCmd(ADC1, DISABLE);
39 
40     ADC_Cmd(ADC1, ENABLE);
41 
42     ADC_ResetCalibration(ADC1);
43 
44     while(ADC_GetResetCalibrationStatus(ADC1));
45 
46     ADC_StartCalibration(ADC1);
47 
48     while(ADC_GetCalibrationStatus(ADC1));
49 
50 }
51 
52 static void Protect_DMAInit(void)
53 {
54 
55     DMA_InitTypeDef DMA_InitStructure;
56 
57     /* DMA1 channel1 configuration -*/
58     DMA_DeInit(DMA1_Channel1);
59     DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t) & (ADC1->DR);
60     DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&ADCConvertedValue;
61     DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
62     DMA_InitStructure.DMA_BufferSize = 3;
63     DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
64     DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
65     DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
66     DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
67     DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
68     DMA_InitStructure.DMA_Priority = DMA_Priority_High;
69     DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
70     DMA_Init(DMA1_Channel1, &DMA_InitStructure);
71 
72     /* Enable DMA1 channel1 */
73     DMA_Cmd(DMA1_Channel1, ENABLE);
74 }

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

1     ADC_RegularChannelConfig(ADC1,ADC_Channel_10,1,ADC_SampleTime_239Cycles5);
2     ADC_RegularChannelConfig(ADC1,ADC_Channel_TempSensor,2,ADC_SampleTime_239Cycles5);
3     ADC_RegularChannelConfig(ADC1,ADC_Channel_Vrefint,3,ADC_SampleTime_239Cycles5);

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

关键字:STM32  DMA  多路ADC通道  数据采集 引用地址:STM32用DMA实现多路ADC通道数据采集

上一篇:STM32 UART DMA实现未知数据长度接收
下一篇:AT91SAM3S串口UART初始化及收发数据

推荐阅读最新更新时间:2024-03-16 14:56

stm32之路:三 约好那一刻
万事开头难,前两天,我们已经建好了工程,写了点亮LED的程序,是不是感觉stm32也没想象中那么难?接下来,go on! 开发板上的LED在闪烁着,间隔是多长时间呢?能不能让它像钟表一样,一秒闪一下呢?答案是肯定的。今天我的目标,就是教它“读”秒~ 还是上一个函数,功能都有了,就是缺个精确的延时。说到“精确的延时”,大家首先想到的一定是定时器。对!就是它。翻开stm32的参考资料(Cortex-M3技术参考手册、Cortex-M3权威指南、STM32F10xxx数据手册,这些都可以),有个SysTick,就用它吧。一般人们把它叫做“系统节拍时钟”,或者叫“滴答定时器”,因为它可以可靠的提供一个精确的
[单片机]
stm32f407之DMA(操作寄存器)
八、DMA 直接内存访问(DMA)是用来以提供外设和内存、内存和内存之间的高速数据传输的。数据可以在没有任何CPU干预下通过的DMA进行传输。这使得CPU资源更倾重与其他操作。 DMA控制器基于一个复杂的总线矩阵架构,结合了功能强大的双AHB主总线架构与独立的FIFO,以优化系统带宽。 两个DMA控制器共有16个数据流(stream),每个数据流可以编程与规定的通道中的一个搭配。 DMA的工作模式 1. 单次传输 2. 多次传输(burst):把数据分成多次传输 DMA的工作模式 1. 循环模式:循环模式是可用来处理循环缓冲区和连续的数据流(如ADC扫描模式)。启此功能可以设置DMA_SxC
[单片机]
stm32f407之<font color='red'>DMA</font>(操作寄存器)
stm32中的数据类型定义
STM32F10X.H 1 #include core_cm3.h 2 #include system_stm32f10x.h 3 #include stdint.h 4 5 /** @addtogroup Exported_types 6 * @{ 7 */ 8 9 /*! STM32F10x Standard Peripheral Library old types (maintained for legacy purpose) */ 10 typedef int32_t s32; 11 typedef int16_t s16; 12 typedef int8_t s8; 13 14 typed
[单片机]
STM32自学手册之GPIO
GPIO是STM32最常用的设备之一。STM32可以提供最多达80个双向IO口(视型号而定),他们分别分布在A-E五个端口中。每个端口有16个IO,每个IO口都可以承受最大为5V压降。通过GPIO的配置寄存器,我们可以把GPIO口配置成我们想要的工作模式,一共有如下8种模式: ● 浮空输入 ● 带上拉电阻的输入 ● 带下拉电阻的输入 ● 模拟输入 ● 开漏输出 ● 推挽输出 ● 复用推挽输出 ● 复用开漏输出 STM32的GPIO除了上述8种工作模式之外,还可以进行两种映射:外部中断映射和第二功能映射(也叫重映射)。当某个IO口映射为外部中断通道后,该IO口就成为一个外部中断源,我们可以在这个I
[单片机]
<font color='red'>STM32</font>自学手册之GPIO
基于PCI Express总线的数据采集设备的实现
  引言   随着计算机技术的发展,数据传输带宽的日益增长,总线技术也在迅速的发展。高速信号传输,海量数据采集与记录,实时视频图像处理以及其他数据处理的数据吞吐量现以kMb/s为量级。   未来计算机系统对带宽和扩展性的要求已经超越了第二代总线技术。第三代高性能I/O总线技术——PCI Express(PCIE)总线解决了以往总线的不足,它的发展将取代第二代总线成为新的数据总线,其提供了更加完善的性能、更多的功能、更强的可扩展性和更低的成本。   本文研究PCI Express总线技术的发展与构架,介绍采用Xilinx公司的FPGA与NXP公司的PHY器件实现一种经济简单的数据采集设备。在电路设计中,分析了总线信号高速布线的
[嵌入式]
基于STM32的红外接收
4.23.1概述 人的眼睛能看到的可见光按波长从长到短排列,依次为红、橙、黄、绿、青、蓝、紫。其中红光的波长范围为0.62~0.76μm;紫光的波长范围为0.38~0.46μm。比紫光光波长更短的光叫紫外线,比红光波长更长的光叫红外线最广义地来说,传感器是一种能把物理量或化学量转变成便于利用的电信号的器件,红外传感器就是其中的一种。随着现代科学技术的发展,红外线传感器的应用已经非常广泛。 4.23.1.1 红外 接收头 工作原理 红外 接收头 一般是接收、放大、解调一体头,一般红外信号经接收头解调后,数据 “0”和“1”的区别通常体现在高低 电平 的时间长短或信号周期上,单片机解码时,通常将接收头输出脚连接到单片机的 外部中断
[单片机]
基于<font color='red'>STM32</font>的红外接收
不一样的STM32“脱机”烧录器
用SBC给STM32F746Discovery烧写程序。SBC就是单板电脑的意思,也可以叫卡片电脑(神奇的ARM小电脑),他是一个统称;常见的SBC有树莓派、Friendly ARM、香橙派、栗子派、Firefly等。 硬件的接法很简单,就像上面那样,把STM32Discovery的板载ST-Link V2的USB接口接到SBC的USB接口上就好了。 过去,我们如果要给STM32单片机烧写程序,需要用到桌面电脑,或者笔记本电脑。这些都是X86平台的,非常不方便。所以,我们今天要来个骚操作,DIY一个小作品,用栗子派代替传统的X86电脑,把它做成一台小型的STM32烧录器。借助Linux系统的SSH服务,间接地也实现了远程烧
[单片机]
不一样的<font color='red'>STM32</font>“脱机”烧录器
STM32如何高效接收串口数据?
硬件:stm32f103cbt6 软件:STM32F10x_StdPeriph_Lib_V3.5.0 DMA,直接内存存取,可以用它的双手释放CPU的灵魂,所以,本文通过USART3进行串口收发,接受使用DMA的方式,无需CPU进行干预,当接受完成之后,数据可以直接从内存的缓冲区读取,从而减少了CPU的压力。 具体的代码实现如下: usart_driver.h 封装了接口,数据接收回调函数类型,基本数据结构等; usart_driver.c 函数原型实现,中断服务函数实现等; 拷贝这两个文件即可,可以根据目录下的参考用例,进行初始化。 头文件usart_driver.h已经声明了外部函数可能用到的接口; USART3_DR的地
[单片机]
<font color='red'>STM32</font>如何高效接收串口数据?
热门资源推荐
热门放大器推荐
  •  pdf文件软硬件融合 (黄朝波 著)
  •  pdf文件无线网络优化 (李蔷薇,刘芳编)
  •  pdf文件现代操作系统(原书第4版)
  •  pdf文件基于STM32F411的无刷直流电机FOC控制系统设计
  • 系统发生错误

    系统发生错误

    您可以选择 [ 重试 ] [ 返回 ] 或者 [ 回到首页 ]

    [ 错误信息 ]

    页面错误!请稍后再试~

小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

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

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