STM32 DMA直接存储器存取原理及DMA转运模板代码

DMA简介: 

 存储器映像:

注意:FLASH是只读的,DMA不能写入,但是可以读取写到其他存储器里

变量是存在运行内存SRAM里的,常量(const)是放在程序存储器FLASH里的

 DMA框图:

 简图:

创输计数器是DMA转运的次数,会自减,减到0就不再转运,自增的地址也恢复到起始地址

由硬件还是软件触发由M2M这个决定

 DMA请求映像:

 数据宽度与对齐:

 例1:

源地址填DataA,目的地址填DataB,源和目的端都自增地址,传输计数器给7,自动重装不需要,采用软件触发

例2:

 源地址写ADC_DR的地址,不自增,目的地址写ADValue,自增,数据宽带选择半字(16位,因为ADC_DR是16位的)传输计数器写7,连续扫描自动重装写7,单次可以不用自动重装,选择ADC硬件触发。

 ——————————————————————————————————————————

 存储器之间转运代码:

#include "stm32f10x.h"
uint16_t MyDMA_Size;//用来记录传输计数器的值
//三个参数,第一个参数是源地址,第二个参数是目的地址,第三个参数是传输计数器的值
//STM32中地址都是32位的,每个地址代表一个字节
void MyDMA_Init(uint32_t AddrA,uint32_t AddrB,uint16_t Size)
{DMA_InitTypeDef DMA_InitStructure;//DMA初始化结构体MyDMA_Size = Size;//记录传输计数器的值RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);//打开DMA的时钟DMA_InitStructure.DMA_BufferSize = Size;//传输计数器的值//方向是从外设存储器到存储器(其实这里的外设并不一定是外设寄存器,只是这么叫而已)DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;DMA_InitStructure.DMA_M2M = DMA_M2M_Enable;//由软件触发DMA_InitStructure.DMA_MemoryBaseAddr = AddrB;//存储器地址设为AddrBDMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;//宽度设为字节//设为地址自增(自增大小是宽带的字节数,因为一个字节对应一个地址)DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//设置DMA工作模式为普通模式,即不采用重装载DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;//外设存储器地址(同理的,这个外设存储器也不一定是外设存储器)设为AddrADMA_InitStructure.DMA_PeripheralBaseAddr = AddrA; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;//宽度设为字节//设为地址自增(自增大小是宽带的字节数,因为一个字节对应一个地址)DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Enable;//优先级设为中等优先级DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;DMA_Init(DMA1_Channel1,&DMA_InitStructure);//传参,配置DMA1的1通道打开DMA1的1通道DMA_Cmd(DMA1_Channel1,DISABLE);
}
void MyDMA_Transfer(void)
{DMA_Cmd(DMA1_Channel1,DISABLE);//失能DMA1通道1,因为改变传输计数器的值要关闭DMADMA_SetCurrDataCounter(DMA1_Channel1,MyDMA_Size);//重新写入传输计数器的值DMA_Cmd(DMA1_Channel1,ENABLE);//使能while(DMA_GetFlagStatus(DMA1_FLAG_TC1) == RESET);//判断是否传输完成DMA_ClearFlag(DMA1_FLAG_TC1);//清空标志位
}

 

 

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

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

相关文章

释放超凡性能,打造鸿蒙原生游戏卓越体验

11月26日在华为Mate品牌盛典上,全新Mate70系列及多款全场景新品正式亮相。在游戏领域,HarmonyOS NEXT加持下游戏的性能得到充分释放。HarmonyOS SDK为开发者提供了软硬协同的系统级图形加速解决方案——Graphics Accelerate Kit(图形加速服务…

【专题】计算机网络之运输层(传输层)

1. 运输层协议概述 1.1 进程之间的通信 (1) 运输层的作用 运输层提供进程间的逻辑通信。 运输层的屏蔽作用: 运输层向高层用户屏蔽了下面网络核心的细节(如网络拓扑、所采用的路由选择协议等),使应用进程看见的就是好像在两个运…

四轮阿克曼(前轮转向、后轮驱动)车子仿真控制

目录 写在前面的话调用 libgazebo_ros_ackermann_drive.so 插件属性介绍补充 steering_wheel_joint 配置键盘控制命令 结果演示 写在前面的话 这里增加一个四轮阿克曼(前轮转向、后轮驱动)车子仿真控制的版本,使用的事gazebo的插件 参考资料…

移植NIOS10.1工程,NIOS10.1路径修改

移植NIOS10.1工程,NIOS10.1路径修改 因工程的需要,使用的NIOS10.1,比较老,这个版本的路径是使用的绝对路径,导致移植工程市回报路径的错误,在13.1之后改为了相对路径,不存在这个问题。 需要修…

【ElasticSearch】倒排索引与ik分词器

ElasticSearch,简称ES(后文将直接使用这一简称),是一款卓越的开源分布式搜索引擎。其独特之处在于其近乎实时的数据检索能力,为用户提供了迅速、高效的信息查询体验。 它能够解决全文检索,模糊查询、数据分析等问题。那么它的搜索…

【从零开始的LeetCode-算法】74. 搜索二维矩阵

给你一个满足下述两条属性的 m x n 整数矩阵: 每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target ,如果 target 在矩阵中,返回 true ;否则,返回 false 。…

基于图像变化检测的毁伤效果评估——学习笔记

前言 闲的无聊,看看论文。 基本评估步骤 第一步:图像预处理。通过图像配准、不同波段提取、图像校正、图像滤波等手段,统一图像格式(文中统一为灰度图),得到待检测图像; 第二步:…

容易被遗忘的测试用例

网络服务器启动了吗?应用程序服务器启动了吗?数据库上线了吗?测试数据是否预先加载到数据库中?每当我们准备开始测试应用程序时,一切都应该已经准备妥当。 然而,当测试开始后,我们可能会漏掉一些…

从excel数据导入到sqlsever遇到的问题

1、格式问题时间格式,excel中将日期列改为日期未生效,改完后,必须手动单击这个单元格才能生效,那不可能一个一个去双击。解决方案如下 2、导入之后表字段格式问题,数据类型的用navicat导入之后默认是nvarchar类型的&a…

【算法】图论——树的重心

目录 题目解析 算法原理 图的存储 算法实现 题目解析 题目解析 给定一颗树,树中包含n个结点(编号)和n-1条无向边。请找到树的重心,并输出将重心删除后,剩余各个连通块中点数的最大值。 什么是重心? 重…

全面UI组件库Telerik 2024 Q4全新发布——官方宣布支持.NET 9

Telerik DevCraft包含一个完整的产品栈来构建您下一个Web、移动和桌面应用程序。它使用HTML和每个.NET平台的UI库,加快开发速度。Telerik DevCraft提供最完整的工具箱,用于构建现代和面向未来的业务应用程序,目前提供UI for ASP.NET MVC、Ken…

数据分析(一): 掌握STDF 掌握金钥匙-码农切入半导体的捷径

中国的半导体行业必然崛起!看清这个大势,就会有很多机会。 今天,我们一起来了解一下半导体行业的一朵金花:STDF。 实际上这只是一种文件格式,但是当你熟练掌握解析这种文件的时候,你就已经打开在这个基础…

【批处理脚本】更改Windows系统中的 hosts 解析文件

概述 作用 修改 Windows 系统中的 hosts 文件,可以实现 插入 或 删除 条目。该脚本允许用户以管理员权限执行,将特定的域名解析到指定的 IP 地址 应用场景 非常适用于需要频繁或批量修改 hosts 文件的场景: 屏蔽网站、域名重定向、DNS 污染防…

【Rust在WASM中实现pdf文件的生成】

Rust在WASM中实现pdf文件的生成 前言概念和依赖问题描述分步实现pdf转Blob生成URL两种方式利用localstorage传递参数处理图片Vec<u8>到pdf格式的Vec<u8>使用rust创建iframe显示pdf的Blob最后 前言 实现了一个通用的前端jpg转pdf的wasm,因为动态响应框架无法直接打…

CanFestival移植到STM32 F4芯片(基于HAL库)

本文讲述如何通过简单操作就可以把CanFestival库移植到STM32 F4芯片上&#xff0c;作为Slave设备。使用启明欣欣的工控板来做实验。 一 硬件连接 观察CAN报文需要专门的设备&#xff0c;本人从某宝上买了一个兼容PCAN的开源小板子&#xff0c;二十几块钱&#xff0c;通过USB接…

Cursor+Devbox AI开发快速入门

1. 前言 今天无意间了解到 Cursor 和 Devbox 两大开发神器,初步尝试以后发现确实能够大幅度提升开发效率,特此想要整理成博客以供大家快速入门. 简单理解 Cursor 就是一款结合AI大模型的代码编辑器,你可以将自己的思路告诉AI,剩下的目录结构的搭建以及项目代码的实现均由AI帮…

Redis常见问题总结

Redis常见问题总结 1.Redis分布式存储方案 分布式存储核心特点主从&#xff08;Master/Slave&#xff09;模式一主多从&#xff0c;故障时手动切换。哨兵&#xff08;Sentinel&#xff09;模式有哨兵的一主多从&#xff0c;主节点故障自动选择新的主节点。集群&#xff08;Cl…

Svn如何切换删除账号

记录Svn清除切换账号 1.首先打开小乌龟的设置如下图 打开设置后单击已保存数据&#xff0c;然后选择清除 接上图选择清除后&#xff0c;就可以打勾选择清除已保存的账号&#xff0c;我们再次检出的就可以切换账号了 &#x1f449;总结 本次记录Svn清除切换账号 如能帮助到你…

电子应用设计方案-38:智能语音系统方案设计

智能语音系统方案设计 一、引言 智能语音系统作为一种便捷、自然的人机交互方式&#xff0c;正逐渐在各个领域得到广泛应用。本方案旨在设计一个高效、准确、功能丰富的智能语音系统。 二、系统概述 1. 系统目标 - 实现高准确率的语音识别和自然流畅的语音合成。 - 支持多种语…

红外跟随避障模块详解

在智能车、机器人和自动化等领域避障技术是确保安全和高效运行的关键。红外避障模块作为一种常见的避障解决方案&#xff0c;因其非接触、响应速度快和抗干扰能力强等优点而备受青睐。本文将详细介绍红外避障模块的特点、工作原理、以及应用案例&#xff0c;帮助您更好地了解这…