ADC采集数据(DMA模式)

写这篇文章,也是自己参考了一些书籍,加上自己的感悟总结之后写出来的。正所谓天下文章一大抄,取个文雅的名字叫模仿、借鉴、参考。不过这也是一种学习的方法,我想你看我这篇文章也是这个目的吧!但是我要说,学来的东西总要有自己的体会和感悟,不能让自己的脑袋成了别人的跑马场不是!好了,废话不多说,直接上程序(程序有注释,可以参考)。

adc.h文件

#ifndef __ADC_H
#define __ADC_H
#include "stm32f10x.h"
#define ADC1_DR_Address ((u32)0x40012400+0x4c)
void ADC_Config(void);
#endif

adc.c文件

#include "adc.h"
__IO uint16_t ADC_ConvertedValue[3];//分别存储AD三个通道的采样值
void ADC_Config()
{
GPIO_InitTypeDef GPIO_InitStructure;
ADC_InitTypeDef  ADC_InitStructure;
DMA_InitTypeDef  DMA_Initstructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);//使能DMA时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC , ENABLE );
//配置外设AD对应IO
GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_1 | GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;//模拟输入模式
GPIO_Init(GPIOA , &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOC , &GPIO_InitStructure);
DMA_DeInit(DMA1_Channel1);//ADC1对应的DMA通道数
DMA_Initstructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;//外设AD的地址数据寄存器地址,数据手册上有
DMA_Initstructure.DMA_MemoryBaseAddr = (u32)ADC_ConvertedValue;//内存地址,就是你想要把采样值存在那个变量的地址
DMA_Initstructure.DMA_DIR = DMA_DIR_PeripheralSRC ;//方向(从外设到内存)
DMA_Initstructure.DMA_BufferSize = 3;//几个通道,几个开辟连续的DMA存储单元
DMA_Initstructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable ;//外设地址不变
DMA_Initstructure.DMA_MemoryInc = DMA_MemoryInc_Enable ;//内存地址自增,因为3个通道嘛
DMA_Initstructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord ;//设置外设数据长度为半字,即16位
DMA_Initstructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord ;//设置DMA存储数据长度为半字,即16位
DMA_Initstructure.DMA_Mode = DMA_Mode_Circular ;//循环模式
DMA_Initstructure.DMA_Priority = DMA_Priority_VeryHigh ;//优先级
DMA_Initstructure.DMA_M2M = DMA_M2M_Disable ;
DMA_Init(DMA1_Channel1 , &DMA_Initstructure  );
DMA_Cmd(DMA1_Channel1 , ENABLE );
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent ;//独立模式,不是多个AD共用一个通道
ADC_InitStructure.ADC_ScanConvMode = ENABLE ;//开启扫描模式,针对多通道时
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE ;//开启连续转换模式
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None ;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right ;//数据右对齐
ADC_InitStructure.ADC_NbrOfChannel = 3;//打来的ADC通道数目
ADC_Init(ADC1, &ADC_InitStructure );
RCC_ADCCLKConfig(RCC_PCLK2_Div6);//配置ADC时钟,为PCLK2的6分频,即12Mhz
ADC_RegularChannelConfig(ADC1 , ADC_Channel_1 , 1 , ADC_SampleTime_1Cycles5 );//设置AD采集扫描顺序和采样周期为1.5ADC的时钟周期
ADC_RegularChannelConfig(ADC1 , ADC_Channel_2 , 2 , ADC_SampleTime_1Cycles5 );//所以ADC的转换速率为(1.5+12.5)/12=1.167us
ADC_RegularChannelConfig(ADC1 , ADC_Channel_15 , 3 , ADC_SampleTime_1Cycles5 );
ADC_DMACmd(ADC1 , ENABLE );//使能AD DMA
ADC_Cmd(ADC1 , ENABLE );
//AD校验
ADC_ResetCalibration(ADC1);
while(ADC_GetResetCalibrationStatus(ADC1));
ADC_StartCalibration(ADC1);
while(ADC_GetCalibrationStatus(ADC1));
ADC_SoftwareStartConvCmd(ADC1 , ENABLE );//采用软件触发方式
}

用的时候只要在所引用的文件中声明外部变量即可,即extern  __IO uint16_t  ADC_ConvertedValue[3];

ADC采集数据(DMA模式)相关推荐

  1. 17. GD32F103C8T6入门教程-adc 使用教程2-dma+连续扫描方式采集数据++dma中断通知

    adc 使用教程3-dma方式采集数据+dma中断通知 adc 的扫描模式就是把配置了规则或注入通道按照配置的顺序采集一轮 adc 的连续转换模式就是把配置了规则或注入通道按照配置的顺序采集N轮 1. ...

  2. ADC采集数据求平均

    利用C语言的位移功能可以快速对采集2N次方数据取平均数 例: /******************************************************************** ...

  3. LPC1768 双通道ADC采集数据并发送

    实验需要用到两个ADC同时采集电压信号.LPC1768有8个通道的ADC,这次实验中使用了P0.23引脚的AD0[0]和P0.26引脚的AD0[3].在实验中用的是uCOS-II操作系统,设计了两个任 ...

  4. STM32 F446RET6多通道ADC采集

    本次配置是根据STM32CUBEIDE去开发的 DMA搬运数据规则 使用DMA搬运数据的时候我们会先建立一个数据缓冲区,将DMA采集的数据存放到数据缓冲区内.采集到的ADC的值根据通道的顺序一个一个的 ...

  5. 使用蓝桥杯单片机实现ADC采集和实时时钟界面转换与报警功能

    目录 1.使用的模块 2.基本功能 3.报警的功能 4.按键功能 5.初始化 4)数码管显示图片 电压显示 实时时钟显示 6.代码如下 main iic.c iic.h ds1302.c ds1302 ...

  6. STM32 热敏电阻NTC的软件设计(ADC采集)

    目录 前言 一.查表函数 二.ADC采集 三.查表 四.数据滤波 前言 记录一些我在工作和学习过程中遇到的问题. NTC:在淘宝随便买的 单片机型号:STM32G030C8T6 目的:用单片机采集NT ...

  7. 基于STM32HAL库ADC+DMA模式,高精度采集电池电量与芯片内部温度方法 (48脚 使用内部参考电压方案)

    目录 概述 1.原理图 2.在这先普及一下概念 3.通过查看STM32L0中文数据手册中301页,第14.10 小节 ,DataSheet 4.ADC通道转换模式的理解 5.STM32CubeMx工具 ...

  8. STM32h743开启cache后ADC采集DMA数据不更新问题

    STM32h743开启cache后ADC采集DMA数据不更新问题 解决办法 解决办法 1.DMA数据缓存地址进行32字节对齐,即地址是0x20的整数倍: __attribute__((at(0x380 ...

  9. dma和通道的区别_STM32 定时器触发 ADC 多通道采集,DMA搬运至内存

    引言 ADC 的功能是将模拟信号采样得到数字信号,而有些时候,我们需要使用到定时采样,比如在计算一个采集的波形的频率的时候,我们需要精确的知道采样频率,也就是 1 s 内采集的点数,这个时候,就需要使 ...

最新文章

  1. Spring和springmvc两个容器的关系
  2. MongoDB 复制机制
  3. 使用Prometheus发现在Kubernetes上运行的应用程序
  4. Android深度探索(卷1)HAL与驱动开发 读书笔记(第四章)
  5. Chapter 8 Document Management(第8章 文档管理)—1 【中英文对照】
  6. OpenCV-图像阴影调整
  7. 使用GDB进行调试 -- 1 应用场景
  8. Go (Golang) 语言-快速开始
  9. quartus如何生成sof_如何高效利用Arm DesignStart计划开放的处理器核-工具篇
  10. 关于pc浏览器浏览外网出现ERR_EMPTY_RESPONSE的问题
  11. 计算机桌面图标有小锁如何去掉,去掉电脑桌面图标小黄锁的两种方法
  12. 关于SCO Unix 串口通讯
  13. 基于java的俄罗斯方块小游戏设计(含源文件)
  14. 农产品销售系统的设计与实现
  15. 计算机excel求四分位数,如何在Excel中计算一组数字的百分位数和四分位数?
  16. UCS(统一计算系统)[1]
  17. UVa 12627 - Erratic Expansion
  18. 查看终端设备接入交换机的端口方法
  19. 脑机接口 | “中国脑计划”:向最后的前沿进发
  20. Android Gson在Kotlin data class中的使用

热门文章

  1. 【AUTOSAR】BMS开发实际项目讲解(三十)----电池管理系统电池SOH和SOE估算
  2. linux 进程 status,Linux 进程状态详解
  3. Java开发中的eclispe常用快捷键全部快捷键
  4. 在移动固态硬盘安装Ubuntu系统
  5. Axialis发布了 免费版 的IconWorkshop Lite
  6. linux磁盘分区合并
  7. html设置跑动文字scrollamount,HTML学习笔记(3)之段落
  8. BZOJ1015 [JSOI2008]星球大战starwar(并查集)
  9. kettle连接不上es7_2021年北京网红经纪,KOL签约合作招聘-北京网红经纪,KOL签约合作招聘求职信息-拉勾招聘...
  10. JSP和Servlet常见面试题