物联网——DMA+AD多通道

news2024/11/15 8:27:54

DMA简介

在这里插入图片描述

存储器映像

某些数据在运行时不会发生变化,则设置为常量,存在Flash存储器中,节省运行内存的空间
在这里插入图片描述

DMA结构图

DMA访问权限高于cpu
在这里插入图片描述

结构要素

软件触发源:存储器到存储器传输完成后,计数器清零
硬件触发源:ADC、定时器、串口
重写计数器时,需关闭DMA
在这里插入图片描述

DMA请求

在这里插入图片描述
在这里插入图片描述

数据宽度与对齐

目标宽度小于传输带宽:高位补零,反之,舍弃高位
在这里插入图片描述

数据转运与DMA

在这里插入图片描述

ADC扫描模式+DMA

ADC连续扫描模式下,DMA计数器的值需要自动重装
在这里插入图片描述

接线图

在这里插入图片描述

DMA常用函数

在这里插入图片描述

(DMA转运数据) DMA结构体配置

在这里插入图片描述

DMA转运函数

在这里插入图片描述
在这里插入图片描述

DMA + AD 多通道

电位器,光敏、热敏、对射式传感器作为AD多通道输入
在这里插入图片描述

AD通道配置

这里是ADC单次扫描模式
在这里插入图片描述

ADC配合DMA

还可以定时器触发ADC,ADC触发DMA
在这里插入图片描述

在这里插入图片描述

源码

#include "stm32f10x.h"                  // Device header

uint16_t AD_Value[4];					//定义用于存放AD转换结果的全局数组

/**
  * 函    数:AD初始化
  * 参    数:无
  * 返 回 值:无
  */
void AD_Init(void)
{
	/*开启时钟*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);	//开启ADC1的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	//开启GPIOA的时钟
	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);		//开启DMA1的时钟
	
	/*设置ADC时钟*/
	RCC_ADCCLKConfig(RCC_PCLK2_Div6);						//选择时钟6分频,ADCCLK = 72MHz / 6 = 12MHz
	
	/*GPIO初始化*/
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);					//将PA0、PA1、PA2和PA3引脚初始化为模拟输入
	
	/*规则组通道配置*/
	ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5);	//规则组序列1的位置,配置为通道0
	ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_55Cycles5);	//规则组序列2的位置,配置为通道1
	ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 3, ADC_SampleTime_55Cycles5);	//规则组序列3的位置,配置为通道2
	ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 4, ADC_SampleTime_55Cycles5);	//规则组序列4的位置,配置为通道3
	
	/*ADC初始化*/
	ADC_InitTypeDef ADC_InitStructure;											//定义结构体变量
	ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;							//模式,选择独立模式,即单独使用ADC1
	ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;						//数据对齐,选择右对齐
	ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;			//外部触发,使用软件触发,不需要外部触发
	ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;							//连续转换,使能,每转换一次规则组序列后立刻开始下一次转换
	ADC_InitStructure.ADC_ScanConvMode = ENABLE;								//扫描模式,使能,扫描规则组的序列,扫描数量由ADC_NbrOfChannel确定
	ADC_InitStructure.ADC_NbrOfChannel = 4;										//通道数,为4,扫描规则组的前4个通道
	ADC_Init(ADC1, &ADC_InitStructure);											//将结构体变量交给ADC_Init,配置ADC1
	
	/*DMA初始化*/
	DMA_InitTypeDef DMA_InitStructure;											//定义结构体变量
	DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR;				//外设基地址,给定形参AddrA
	DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;	//外设数据宽度,选择半字,对应16为的ADC数据寄存器
	DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;			//外设地址自增,选择失能,始终以ADC数据寄存器为源
	DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)AD_Value;					//存储器基地址,给定存放AD转换结果的全局数组AD_Value
	DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;			//存储器数据宽度,选择半字,与源数据宽度对应
	DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;						//存储器地址自增,选择使能,每次转运后,数组移到下一个位置
	DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;							//数据传输方向,选择由外设到存储器,ADC数据寄存器转到数组
	DMA_InitStructure.DMA_BufferSize = 4;										//转运的数据大小(转运次数),与ADC通道数一致
	DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;								//模式,选择循环模式,与ADC的连续转换一致
	DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;								//存储器到存储器,选择失能,数据由ADC外设触发转运到存储器
	DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;						//优先级,选择中等
	DMA_Init(DMA1_Channel1, &DMA_InitStructure);								//将结构体变量交给DMA_Init,配置DMA1的通道1
	
	/*DMA和ADC使能*/
	DMA_Cmd(DMA1_Channel1, ENABLE);							//DMA1的通道1使能
	ADC_DMACmd(ADC1, ENABLE);								//ADC1触发DMA1的信号使能
	ADC_Cmd(ADC1, ENABLE);									//ADC1使能
	
	/*ADC校准*/
	ADC_ResetCalibration(ADC1);								//固定流程,内部有电路会自动执行校准
	while (ADC_GetResetCalibrationStatus(ADC1) == SET);
	ADC_StartCalibration(ADC1);
	while (ADC_GetCalibrationStatus(ADC1) == SET);
	
	/*ADC触发*/
	ADC_SoftwareStartConvCmd(ADC1, ENABLE);	//软件触发ADC开始工作,由于ADC处于连续转换模式,故触发一次后ADC就可以一直连续不断地工作
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2122103.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

人员随机分组

如何实现男女比例平均分组? 在团队活动中,合理地将人员分组是一项重要的组织工作,它有助于提高团队合作的效率和质量。云分组小程序提供了一个便捷的解决方案,通过智能算法帮助用户快速实现人员分组。本文将详细介绍如何使用云分组…

网络通信安全:全面探索与深入分析

摘要:本文全面探索网络通信安全相关内容。首先阐述网络通信安全的基本概念与原理,包括网络通信模型、安全目标以及加密技术基础。接着详细分析其面临的威胁,涵盖恶意软件(病毒、蠕虫、特洛伊木马)、网络攻击&#xff0…

GAMES103——作业1 刚体碰撞

任务 1.更新位置、姿态与速度 2.碰撞检测 3.碰撞反馈 实现 更新位置、姿态与速度 对于速度的更新,采用显式的方法,对于位置的更新,采用隐式的方法。就是103中讲的两只青蛙的例子。 需要同时更新线速度和角速度。线速度受到重力的影响&#xf…

OpenGL软光栅化效果图

1.在测试Mesa库画正方形时,看到三角形光栅化过程,分享出来便于理解图形化过程。 2.在此应该和电脑的配置有关系,配置高的话应该可以画的更快。 需要下载的,下面 https://download.csdn.net/download/huzhifei/89734620 。

【机器学习】迁移学习概论

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 迁移学习概论什么是迁移学习?为什么需要迁移学习?迁移学习的应用场景和优势迁…

渲染农场是什么,怎么收费?

什么是渲染农场? 渲染农场是一组连接在一起以完成大型任务的计算机。在 3D 渲染的情况下,渲染农场通常会将动画的帧分发到多台计算机。您可以让 100 台计算机工作 1 天,而不是让一台计算机工作 100 天。 成都渲染101渲染农场如何工作&#…

【JS逆向学习】大学竞争力2021排行榜(md5加密)

逆向目标 网址:https://www.jizhy.com/44/rank/school接口:https://www.jizhy.com/open/sch/rank-list参数: sign 逆向过程 老一套先分析网络请求 经过比对 payload 参数发现,除了 page、ts、sign 三个参数外,其他…

操作系统 --- 进程通信(IPC)

目录 一、进程间的通信? 二、为什么进程间通信需要操作系统支持? 三、进程间通信的方法 3.1 共享存储 3.2 消息传递(消息队列) 3.2.1 直接通信方式【点名道姓的消息传递】 3.2.2 间接通信方式【以“信箱”作为中间实体进…

leetcode:2710. 移除字符串中的尾随零(python3解法)

难度:简单 给你一个用字符串表示的正整数 num ,请你以字符串形式返回不含尾随零的整数 num 。 示例 1: 输入:num "51230100" 输出:"512301" 解释:整数 "51230100" 有 2 个尾…

合宙低功耗4G模组Air780EX——硬件设计手册02

在上文我们介绍了合宙低功耗4G模组Air780EX的主要性能和应用接口, 上文链接:合宙低功耗4G模组Air780EX——硬件设计手册01-CSDN博客 本文我们将继续介绍Air780EX的射频接口,电气特性,实网功耗数据,结构规格等内容。 …

如何解决户用光伏项目管理难题?

户用光伏作为分布式能源的重要组成部分,正迎来前所未有的发展机遇。户用光伏项目的复杂性和多样性也给项目管理带来了诸多挑战,包括客户分散、安装周期长、运维难度大、数据监控不及时等问题。为解决这些难题,构建一套高效、智能的户用光伏业…

降维打击 华为赢麻了

文|琥珀食酒社 作者 | 积溪 真是赢麻了 华为估计都懵了 这辈子还能打这么富裕的仗? 其实在苹果和华为的发布会召开之前 我就知道华为肯定会赢 但我没想到 苹果会这么拉胯 华为这是妥妥的降维打击啊 就说这苹果iPhone 16吧 屏幕是变大了、颜色…

银行用电安全管理难点及解决方案

1引言 科技进步带来丰富的电力资源和更多电气设备,但同时也增加了火灾风险。2020年,中国共发生25.2万起火灾,其中电气原因导致的火灾占33.6%,共8.5万起。电气问题引发的较大火灾占55.4%。线路问题如短路、过负荷和接触不良是主要…

FastAPI 深入学习:利用__call__方法实现动态依赖项

在Python中,__init__ 和 __call__ 是两个特殊的方法,它们在类的上下文中有特定的用途: __init__ 方法: 这是类的初始化方法,当一个实例被创建时,它会被自动调用。它通常用于接收初始化参数并设置实例的初始…

【828华为云征文|华为云Flexus X实例:一键助力中小企业,快速部署个性化网站!】

文章目录 前言搭建自己专属网站准备工作具体操作服务器环境确认进入宝塔软件商店JTBC网站内容管理系统一键部署填写域名放行80端口JTBC安装初始页数据库信息配置管理员信息配置完成安装网站管理后台网站前台 验证后台配置内容前台访问的效果 结语 前言 在云计算盛行的时代&…

宠物空气净化器哪个好?希喂、352、有哈宠物空气净化器测评分享

朋友在三个月前养了一只银渐层,从此进入了幸福的养猫生活,但她最近也跟我说,最近因为猫咪和她男朋友吵架了。 每天下班她男朋友回得都比她早,每次开门看到的就是猫咪的毛发掉得很多,地板上、沙发上甚至厨房里都能看到…

WebGL系列教程四(绘制彩色三角形)

目录 1 前言2 varying变量介绍3 开始绘制3.1 声明顶点着色器3.2 声明片元着色器3.3 创建顶点和颜色的缓冲区3.4 指定变量从缓冲区获取值3.5 效果3.6 varying的内涵3.7 完整代码 4 总结 1 前言 上一篇中我们介绍了如何使用缓冲区来绘制三角形,这一篇我们来讲讲如何给…

《PneumoLLM:利用大型语言模型的力量进行尘肺病诊断》|文献速递--基于深度学习的医学影像病灶分割

Title 题目 PneumoLLM: Harnessing the power of large language model for pneumoconiosis diagnosis 《PneumoLLM:利用大型语言模型的力量进行尘肺病诊断》 01 文献速递介绍 在计算机辅助诊断领域,对医学数据的处理和分析能力至关重要。这不仅有助…

【教师节视频制作】飞机降落飞机机身AE模板修改文字软件生成器教程特效素材【AE模板】

教师节祝福视频制作教程飞机降落飞机机身AE模板修改文字特效广告生成神器素材祝福玩法AE模板工程 怎么如何做的【教师节视频制作】飞机降落飞机机身AE模板修改文字软件生成器教程特效素材【AE模板】 生日视频制作步骤: 下载AE模板 安装AE软件 把AE模板导入AE软件 …

紫色UI趣味测试小程序源码,包含多种评测

紫色UI趣味测试小程序源码,包含多种评测。 该源码里面包含了多种评测,每一种评测都包含大多小细节。 代码下载