STM32实验DMA数据搬运小助手

本次实验做的是将一个数组的内容利用DMA数据搬运小助手搬运到另外一个数组中去。

最后的实验结果:

可以看到第四行的数据就都不是0了,成功搬运了过来。

DMA实现搬运的步骤其实不是很复杂,复杂的是结构体参数:

整个步骤为:

第一步:RCC开启DMA的时钟

第二步:调用DMA_Init,初始化各个参数 (包括外设和存储器的起始地址,数据宽度,地址是否自增,方向,传输计数器,是否需要自动重装,选择触发源,通道优先级)

第三步:调用DMA_CMD,通道使能(要在对应的外设调用XXX_DMACmd开启一下触发信号的输出,如果需要DMA的中断,就调用DMA_ITConfig,开启中断输出,再在NVIC里,配置中断通道,最后写中断函数就行了)

下面介绍一下DMA相关的库函数:

void DMA_DeInit(DMA_Channel_TypeDef* DMAy_Channelx);

//恢复缺省配置

void DMA_Init(DMA_Channel_TypeDef* DMAy_Channelx, DMA_InitTypeDef* DMA_InitStruct); //DMA初始化

void DMA_StructInit(DMA_InitTypeDef* DMA_InitStruct);

//DMA结构体初始化

void DMA_Cmd(DMA_Channel_TypeDef* DMAy_Channelx, FunctionalState NewState);

//DMA使能/失能

void DMA_ITConfig(DMA_Channel_TypeDef* DMAy_Channelx, uint32_t DMA_IT, FunctionalState NewState);

//中断输出使能/失能

void DMA_SetCurrDataCounter(DMA_Channel_TypeDef* DMAy_Channelx, uint16_t DataNumber); //DMA设置当前数据寄存器

uint16_t DMA_GetCurrDataCounter(DMA_Channel_TypeDef* DMAy_Channelx);

//DMA获取当前数据寄存器的值

FlagStatus DMA_GetFlagStatus(uint32_t DMAy_FLAG);  //获取标志位状态 void DMA_ClearFlag(uint32_t DMAy_FLAG);  //清除状态标志位

ITStatus DMA_GetITStatus(uint32_t DMAy_IT);  //获取中断标志位状态 void DMA_ClearITPendingBit(uint32_t DMAy_IT);//清除中断标志位状态

下面是MyDMA.c的文件:

#include "stm32f10x.h"                  // Device headervoid MyDMA_Init(uint32_t AddrA, uint32_t AddrB, uint16_t Size)
{//第一步:RCC开启DMA的时钟RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);//第二步:调用DMA_Init,初始化各个参数(包括外设和存储器的起始地址,数据宽度,地址是否自增,方向,传输计数器,是否需要自动重装,选择触发源,通道优先级)DMA_InitTypeDef DMA_InitStruct;DMA_InitStruct.DMA_PeripheralBaseAddr = AddrA;DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;   //数据宽度,按字节的宽度搬运DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Enable;    //启用地址++自增// 以上是外设站点(数据来源)的起始地址、数据宽度、是否自增。DMA_InitStruct.DMA_MemoryBaseAddr = AddrB;DMA_InitStruct.DMA_MemoryDataSize = DMA_PeripheralDataSize_Byte;  //数据宽度,按字节的宽度粘贴DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Enable;       //启用地址++自增//以上3条是存储器(目的地)的起始地址、数据宽度、是否自增。DMA_InitStruct.DMA_DIR = DMA_DIR_PeripheralSRC;    //传输方向DMA_InitStruct.DMA_BufferSize = Size;  //缓存区大小,其实就是传输计数器   取用传进来的参数DMA_InitStruct.DMA_Mode = DMA_Mode_Normal;   //传输模式,其实就是是否启用自动重装     不自动重装DMA_InitStruct.DMA_M2M = DMA_M2M_Enable;   //选择是硬件触发还是软件触发    软件触发DMA_InitStruct.DMA_Priority = DMA_Priority_Medium;   // 优先级    选择中等优先级DMA_Init(DMA1_Channel1, &DMA_InitStruct);  //第一个参数选择了是哪个DMA到哪个DMA通道,第二个参数结构体//第三步:调用DMA_CMD,通道使能(要在对应的外设调用XXX_DMACmd开启一下触发信号的输出,如果需要DMA的中断,就调用DMA_ITConfig,开启中断输出,再在NVIC里,配置中断通道,最后写中断函数就行了)DMA_Cmd(DMA1_Channel1, ENABLE);
}

下面是MyDMA.h文件:

#ifndef __MYDMA_H
#define __MYDMA_Hvoid MyDMA_Init(uint32_t AddrA, uint32_t AddrB, uint16_t Size);#endif

下面是main.c文件:

#include "stm32f10x.h"                  // Device header
#include "OLED.h"
#include "MyDMA.h"uint8_t dataA[]={0x01, 0x02, 0x03, 0x04};
uint8_t dataB[]={0,0,0,0};int main(void)
{OLED_Init();       //oled  屏幕初始化OLED_ShowHexNum(1,1, dataA[0], 2);OLED_ShowHexNum(1,4, dataA[1], 2);OLED_ShowHexNum(1,7, dataA[2], 2);OLED_ShowHexNum(1,10, dataA[3], 2);OLED_ShowHexNum(2,1, dataB[0], 2);OLED_ShowHexNum(2,4, dataB[1], 2);OLED_ShowHexNum(2,7, dataB[2], 2);OLED_ShowHexNum(2,10, dataB[3], 2);MyDMA_Init((uint32_t)dataA, (uint32_t)dataB, 4);OLED_ShowHexNum(3,1, dataA[0], 2);OLED_ShowHexNum(3,4, dataA[1], 2);OLED_ShowHexNum(3,7, dataA[2], 2);OLED_ShowHexNum(3,10, dataA[3], 2);OLED_ShowHexNum(4,1, dataB[0], 2);OLED_ShowHexNum(4,4, dataB[1], 2);OLED_ShowHexNum(4,7, dataB[2], 2);OLED_ShowHexNum(4,10, dataB[3], 2);while(1){}
}

这样就实现了最简单的DMA数据搬运的小功能了。看似没有什么用,其实这功能是在硬件上自动完成的,可以在不浪费软件资源的前提下,把外设上的数据搬运到内存中来,软件就能直接用了,还是非常的方便的。

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

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

相关文章

面试经典150题 -- 分治 (总结)

总的链接 : 面试经典 150 题 - 学习计划 - 力扣(LeetCode)全球极客挚爱的技术成长平台 108 . 将有序数组转换成二叉搜索树 : 链接 : . - 力扣(LeetCode) 思路 : 选择中间位置左边的数字作为根节点,然后递归调…

PostgreSQL 锁机制

锁存在的意义 在了解 PostgreSQL 锁之前,我们需要了解锁存在的意义是啥? 当多个会话同时访问数据库的同一数据时,理想状态是为所有会话提供高效的访问,同时还要维护严格的数据一致性。那数据一致性通过什么来维护呢,…

深入浅出Go的`encoding/xml`库:实战开发指南

深入浅出Go的encoding/xml库:实战开发指南 引言基本概念XML简介Go语言中的XML处理结构体标签(Struct Tags) 解析XML数据使用xml.Unmarshal解析XML结构体标签详解处理常见解析问题 生成XML数据使用xml.Marshal生成XML使用xml.MarshalIndent优化…

加速量子计算机商业化!富士通日立NEC等联合成立新量子计算公司

内容来源:量子前哨(ID:Qforepost) 编辑丨王珩 编译/排版丨沛贤 深度好文:700字丨5分钟阅读 日本工业界和学术界将在 2024 年联合成立新一家公司,研发量子计算机并将其商业化。包括富士通、日立和NEC在内…

arcgis 点连接到面(以地级市图层为例)

地级市图层进行“点到面”的连接,并输出 在点击地级市图层,右击——连接和关联——连接 选择基于空间位置的另一图层数据,文件选择上面输出并添加的图层文件,进行“点到面”的连接,可依据新需求选择平均值&#xff0c…

Halcon 3D算子总结整理

halcon 3D包含以下几个模块: 3D Matching(3D匹配)3D Object Model(3D模型)3D Reconstruction(3D重构)3D Transformations(3D转换) 1. 3D Matching 1.1 3D Box3D盒查找器…

解锁数据可视化新境界:山海鲸可视化免费编辑与组件探索

作为一名长期使用山海鲸可视化的资深用户,我在数据可视化看板的制作过程中,深刻感受到了这款软件带来的便捷与高效。今天,我想与大家分享一些我在使用山海鲸可视化制作数据可视化看板时的经验,给对这款产品同样感兴趣的朋友同行一…

TT-100K数据集,YOLO格式

TT-100K数据集YOLO格式,分为train、val和test,其中train中共有6793张图片,val中共有1949张图片,test中共有996张图片。数据集只保留包含图片数超过100的类别。共计46类。

C#,图论与图算法,无向图(Graph)回环(Cycle)的不相交集(disjoint)或并集查找(union find)判别算法与源代码

1 回环(Cycle)的不相交集(disjoint)或并集 不相交集数据结构是一种数据结构,它跟踪划分为多个不相交(非重叠)子集的一组元素。联合查找算法是对此类数据结构执行两个有用操作的算法: 查找:确定特定元素所在的子集。这可用于确定两个元素是否在同一子集中。 并集:将…

Windows server 2008 R2共享文件配置和web网站的发布 试题一(Windows部分)

Windows server 2008 R2共享文件配置和web网站的发布 试题一(Windows部分) 设置虚拟机与本机互通设置虚拟机IP关闭虚拟机防火墙设置本机IP测试本机与虚拟机是否可以互通 开启文件共享function discovery resource publication服务的开启SSDP Discovery服…

web渗透测试漏洞复现:Elasticsearch未授权漏洞复现

web渗透测试漏洞复现 Elasticsearch未授权漏洞复现Elasticsearch简介Elasticsearch复现Elasticsearch漏洞修复和加固措施 Elasticsearch未授权漏洞复现 Elasticsearch简介 Elasticsearch 是一款 Java 编写的企业级搜索服务,它以分布式多用户能力和全文搜索引擎为特…

利用textarea和white-space实现最简单的文章编辑器 支持缩进和换行

当你遇到一个非常基础的文章发布和展示的需求,只需要保留换行和空格缩进,你是否会犹豫要使用富文本编辑器?实际上这个用原生的标签两步就能搞定! 1.直接用textarea当编辑器 textarea本身就可以保存空格和换行符,示例如…

【目标检测】2. RCNN

接上篇 【目标检测】1. 目标检测概述_目标检测包括预测目标的位置吗?-CSDN博客 一、前言 CVPR201 4经典paper:《 Rich feature hierarchies for accurate object detection and semantic segmentation》,https://arxiv.org/abs/1311.2524, 这篇论文的算法思想被称…

C#集合:从字典到队列——探索数据结构核心

文章目录 C# 中的集合类型C# Dictionary 字典C# Hashtable:哈希表Hashtable 类中的属性Hashtable 类中的方法 C# SortedList:排序列表SortedList 类的中的属性SortedList 类的中的方法 C# Stack:堆栈Stack 类中的属性Stack 类中的方法 C# Que…

基于深度学习YOLOv8+Pyqt5的工地安全帽头盔佩戴检测识别系统(源码+跑通说明文件)

wx供重浩:创享日记 对话框发送:318安全帽 获取完整源码源文件7000张已标注的数据集训练好的模型配置说明文件 可有偿59yuan一对一远程操作配置环境跑通程序 效果展示(图片检测批量检测视频检测摄像头检测) 基于深度学习YOLOv8Pyqt…

JVM的双亲委派模型和垃圾回收机制

jvm的作用是解释执行java字节码.java的跨平台就是靠jvm实现的.下面看看一个java程序的执行流程. 1. jvm中的内存区域划分 jvm也是一个进程,进程在运行过程中,要行操作系统申请一些资源.这些内存空间就支撑了后续java程序的执行. jvm从系统申请了一大块内存,这块内存在java程序使…

影响MySql 服务性能最重要的两个参数。

不同的需求,不同服务器硬件配置,要想MySql 服务处于最优状态是需要调试一些参数的,可调的参数非常多,在看完官方的mysql的文档,结合以前的配置情况在这里选择影响性能最大的参数作介绍: 先查一下参数情况&…

吴恩达深度学习环境本地化构建wsl+docker+tensorflow+cuda

Tensorflow2 on wsl using cuda 动机环境选择安装步骤1. WSL安装2. docker安装2.1 配置Docker Desktop2.2 WSL上的docker使用2.3 Docker Destop的登陆2.4 测试一下 3. 在WSL上安装CUDA3.1 Software list needed3.2 [CUDA Support for WSL 2](https://docs.nvidia.com/cuda/wsl-…

Hive SQL必刷练习题:连续问题 间断连续(*****)

问题描述: 1) 连续问题:找出连续三天(或者连续几天的啥啥啥)。 2) 间断连续:统计各用户连续登录最长天数,间断一天也算连续,比如1、3、4、6也算登陆了6天 问题分析&am…

html-docx-js-typescript——将html生成docx文档

html-docx-js-typescript源码:GitHub - caiyexiang/html-docx-js-typescript: Convert HTML documents to docx format. html-docx-js地址:html-docx-js - npm *简单使用: 获取需要转为word文档的html节点,借助file-saver提供的…