ADC采集数据(DMA模式)
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模式)相关推荐
- 17. GD32F103C8T6入门教程-adc 使用教程2-dma+连续扫描方式采集数据++dma中断通知
adc 使用教程3-dma方式采集数据+dma中断通知 adc 的扫描模式就是把配置了规则或注入通道按照配置的顺序采集一轮 adc 的连续转换模式就是把配置了规则或注入通道按照配置的顺序采集N轮 1. ...
- ADC采集数据求平均
利用C语言的位移功能可以快速对采集2N次方数据取平均数 例: /******************************************************************** ...
- LPC1768 双通道ADC采集数据并发送
实验需要用到两个ADC同时采集电压信号.LPC1768有8个通道的ADC,这次实验中使用了P0.23引脚的AD0[0]和P0.26引脚的AD0[3].在实验中用的是uCOS-II操作系统,设计了两个任 ...
- STM32 F446RET6多通道ADC采集
本次配置是根据STM32CUBEIDE去开发的 DMA搬运数据规则 使用DMA搬运数据的时候我们会先建立一个数据缓冲区,将DMA采集的数据存放到数据缓冲区内.采集到的ADC的值根据通道的顺序一个一个的 ...
- 使用蓝桥杯单片机实现ADC采集和实时时钟界面转换与报警功能
目录 1.使用的模块 2.基本功能 3.报警的功能 4.按键功能 5.初始化 4)数码管显示图片 电压显示 实时时钟显示 6.代码如下 main iic.c iic.h ds1302.c ds1302 ...
- STM32 热敏电阻NTC的软件设计(ADC采集)
目录 前言 一.查表函数 二.ADC采集 三.查表 四.数据滤波 前言 记录一些我在工作和学习过程中遇到的问题. NTC:在淘宝随便买的 单片机型号:STM32G030C8T6 目的:用单片机采集NT ...
- 基于STM32HAL库ADC+DMA模式,高精度采集电池电量与芯片内部温度方法 (48脚 使用内部参考电压方案)
目录 概述 1.原理图 2.在这先普及一下概念 3.通过查看STM32L0中文数据手册中301页,第14.10 小节 ,DataSheet 4.ADC通道转换模式的理解 5.STM32CubeMx工具 ...
- STM32h743开启cache后ADC采集DMA数据不更新问题
STM32h743开启cache后ADC采集DMA数据不更新问题 解决办法 解决办法 1.DMA数据缓存地址进行32字节对齐,即地址是0x20的整数倍: __attribute__((at(0x380 ...
- dma和通道的区别_STM32 定时器触发 ADC 多通道采集,DMA搬运至内存
引言 ADC 的功能是将模拟信号采样得到数字信号,而有些时候,我们需要使用到定时采样,比如在计算一个采集的波形的频率的时候,我们需要精确的知道采样频率,也就是 1 s 内采集的点数,这个时候,就需要使 ...
最新文章
- Spring和springmvc两个容器的关系
- MongoDB 复制机制
- 使用Prometheus发现在Kubernetes上运行的应用程序
- Android深度探索(卷1)HAL与驱动开发 读书笔记(第四章)
- Chapter 8 Document Management(第8章 文档管理)—1 【中英文对照】
- OpenCV-图像阴影调整
- 使用GDB进行调试 -- 1 应用场景
- Go (Golang) 语言-快速开始
- quartus如何生成sof_如何高效利用Arm DesignStart计划开放的处理器核-工具篇
- 关于pc浏览器浏览外网出现ERR_EMPTY_RESPONSE的问题
- 计算机桌面图标有小锁如何去掉,去掉电脑桌面图标小黄锁的两种方法
- 关于SCO Unix 串口通讯
- 基于java的俄罗斯方块小游戏设计(含源文件)
- 农产品销售系统的设计与实现
- 计算机excel求四分位数,如何在Excel中计算一组数字的百分位数和四分位数?
- UCS(统一计算系统)[1]
- UVa 12627 - Erratic Expansion
- 查看终端设备接入交换机的端口方法
- 脑机接口 | “中国脑计划”:向最后的前沿进发
- Android Gson在Kotlin data class中的使用
热门文章
- 【AUTOSAR】BMS开发实际项目讲解(三十)----电池管理系统电池SOH和SOE估算
- linux 进程 status,Linux 进程状态详解
- Java开发中的eclispe常用快捷键全部快捷键
- 在移动固态硬盘安装Ubuntu系统
- Axialis发布了 免费版 的IconWorkshop Lite
- linux磁盘分区合并
- html设置跑动文字scrollamount,HTML学习笔记(3)之段落
- BZOJ1015 [JSOI2008]星球大战starwar(并查集)
- kettle连接不上es7_2021年北京网红经纪,KOL签约合作招聘-北京网红经纪,KOL签约合作招聘求职信息-拉勾招聘...
- JSP和Servlet常见面试题