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;//存储器地址设为AddrB
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;//宽度设为字节
    //设为地址自增(自增大小是宽带的字节数,因为一个字节对应一个地址)
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
    //设置DMA工作模式为普通模式,即不采用重装载
    DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
    //外设存储器地址(同理的,这个外设存储器也不一定是外设存储器)设为AddrA
    DMA_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,因为改变传输计数器的值要关闭DMA
    DMA_SetCurrDataCounter(DMA1_Channel1,MyDMA_Size);//重新写入传输计数器的值
    DMA_Cmd(DMA1_Channel1,ENABLE);//使能
    while(DMA_GetFlagStatus(DMA1_FLAG_TC1) == RESET);//判断是否传输完成
    DMA_ClearFlag(DMA1_FLAG_TC1);//清空标志位
}

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

保护数字资产:iOS 加固在当前安全环境中的重要性

随着互联网和手机的发展,APP在我们的日常生活中已经变得无处不在,各大平台的应用程序成为了黑客攻击的主要目标。尤其在 2024 年,随着数据泄露和隐私侵犯事件的频发,手机应用的安全问题再次成为公众关注的焦点。近期,多…

【数据结构】动态规划-基础篇

针对动态规划问题,我总结了以下5步: 确定dp数组以及下标的含义; 递推公式; dp数组如何初始化; 遍历顺序; 打印dp数组(用来debug); 以上5步适用于任何动态规划问题&#x…

LeetCode 动态规划 组合总和 IV

组合总和 IV 给你一个由 不同 整数组成的数组 nums ,和一个目标整数 target 。请你从 nums 中找出并返回总和为 target 的元素组合的个数。 题目数据保证答案符合 32 位整数范围。 示例 1: 输入:nums [1,2,3], target 4 输出:7 …

数据结构(栈Stack)

1.前言: 在计算机科学中,栈(Stack)是一种基础而存在的数据结构,它的核心特性是后进先出(LIFO,Last In, First Out)。想象一下,在现实生活中我们如何处理一堆托盘——我们…

如何抽象策略模式

策略模式是什么 策略设计模式(Strategy Pattern)是一种面向对象设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以相互替换。这种模式使得算法可以独立于使用它们的客户端而变化。 策略设计模式包含三个主…

【MyBatis源码】transaction包JdbcTransaction和 ManagedTransaction源码分析

🎮 作者主页:点击 🎁 完整专栏和代码:点击 🏡 博客主页:点击 文章目录 事务概述事务接口及工厂TransactionFactory接口Transaction接口 JDBC事务JdbcTransactiongetConnection() JdbcTransactionFactory使用…

OverLeaf

\verb|acmart| \verb:这是一个 LaTeX 命令,用来创建 “verbatim”(字面量)文本。它会按照你输入的内容原样输出,不会解析其中的任何 LaTeX 命令或者特殊字符。|:这是定界符。\verb 命令需要一对定界符来标…

预训练模型与ChatGPT:自然语言处理的革新与前景

目录 一、ChatGPT整体背景认知 (一)ChatGPT引起关注的原因 (二)与其他公司的竞争情况 二、NLP学习范式的发展 (一)规则和机器学习时期 (二)基于神经网络的监督学习时期 &…

楼盘智能化的关键技术:数字孪生如何落地?

随着智慧城市的不断发展,数字孪生技术逐渐成为实现智慧楼盘管理和运营的核心技术之一。通过创建与现实楼盘一一对应的虚拟模型,数字孪生不仅能够提供更加全面、动态的楼盘信息展示,还能为楼盘的建设、管理和用户体验优化提供精准的数据支持和…

SQLServer 服务器只接受 TLS1.0,但是客户端给的是 TLS1.2

Caused by: javax.net.ssl.SSLHandshakeException: the server selected protocol version TLS10 is not accepted by client preferences [TLS12] 原因描述:SQLServer 服务器只接受 TLS1.0,但是客户端给的是 TLS1.2 解决方法如下: 打开文件…

C#与PLC通讯时,数据读取和写入浮点数,字节转换问题(ModbusTCP)

在与PLC进行通讯时,会发现一个问题,浮点数1.2接收过来后,居然变成了两个16位的整数。 经过一系列的分析,这是因为在PLC存储浮点数时32位,我们接收过来的数据会变成两个16位的高低字节,而且我们进行下发数据…

AD学习笔记·空白工程的创建

编写不易,禁止搬运,仅供学习,感谢理解 序言 本文参考B站,凡亿教育,连接放在最后。 创建工程文件 在使用AD这个软件的电路板设计中,有很多的地方跟嘉立创eda还是有不一样的地方,其中一个地方就…

折叠屏手机拐点:三星领跌,华为小米逆势增长

科技新知 原创作者丨依蔓 编辑丨蕨影 折叠屏手机不香了?显示器出货量罕见下滑,并预计 2025 年仍将持续下降。 近日,市场调查机构 DSCC报告称, 2019 年至 2023 年,折叠屏市场曾保持每年至少 40% 的高速增长。然而&…

基于Java Springboot哈尔滨中心医院微信小程序

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术:Html、Css、Js、Vue、Element-ui 数据库:MySQL 后端技术:Java、Spring Boot、MyBatis 三、运行环境 开发工具:IDEA/eclipse 微信…

【人工智能-科普】图神经网络(GNN):与传统神经网络的区别与优势

文章目录 图神经网络(GNN):与传统神经网络的区别与优势什么是图神经网络?图的基本概念GNN的工作原理GNN与传统神经网络的不同1. 数据结构的不同2. 信息传递方式的不同3. 模型的可扩展性4. 局部与全局信息的结合GNN的应用领域总结图神经网络(GNN):与传统神经网络的区别与…

基于 LLamafactory 的异步API高效调用实现与速度对比

文章目录 背景摘要简介代码实现运行结果速度对比异步调用速度同步调用速度 背景 原先经常调用各家的闭源大模型的API,如果使用同步的方式调用,速度会很慢。为了加快 API 的调用速度,决定使用异步调用 API 的方式。 摘要 通过异步方式调用大…

ceph的存储池管理

1 查看存储池信息 查看存储池的名称 [rootceph141ceph]# ceph osd pool ls .mgr查看存储池机器编号 [rootceph141ceph]# ceph osd pool ls 1 .mgr查看存储池的详细信息 [rootceph141ceph]# ceph osd pool ls detail pool 1 .mgr replicated size 3 min_size 2 crush_rule 0 ob…

一些常见网络安全术语

1、黑帽 为非法目的进行黑客攻击的人,通常是为了经济利益。他们进入安全网络以销毁,赎回,修改或窃取数据,或使网络无法用于授权用户。这个名字来源于这样一个事实:老式的黑白西部电影中的恶棍很容易被电影观众识别&…

Vue中使用ECharts图表中的阈值标记(附源码)

在数据处理和可视化领域,我们经常需要对一系列数据点进行分析。本文将介绍如何在给定的数据点中找到对应于特定Y值的X值,并设置标线起始点标记在ECharts图表中,效果图如下: 实现步骤 1、数据准备 let seriesData [// 提供日期…

Windows 11 如何配置node.js

一,官网下载 官网首页 下载最新LTS版本,比较稳定,如果想探索更新的版本去探索新的nodejs功能。 1. 下载完成后,双击运行程序,点击next 2. 勾选接受协议,点击next 3. 选择自己的安装路径(默认是…