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

news2024/12/13 4:45:27

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);//清空标志位
}

 

 

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

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

相关文章

transformers实现一个检索机器人(一)

简介 检索机器人是一种能够自动搜索和提供信息的系统,它可以帮助我们快速找到需要的信息。这类机器人通常使用自然语言处理(NLP)技术来理解用户的查询,并利用搜索引擎或数据库来获取相关信息。 那么我们要通过transforme实现什么…

开源ISP介绍(2)————嵌入式Vitis搭建

Vivado搭建参考前一节Vivado基于IP核的视频处理框架搭建: 开源ISP介绍(1)——开源ISP的Vivado框架搭建-CSDN博客 导出Hardware 在vivado中导出Hardware文件,成功综合—实现—生成比特流后导出硬件.xsa文件。(注意导…

力扣-图论-2【算法学习day.52】

前言 ###我做这类文章一个重要的目的还是给正在学习的大家提供方向和记录学习过程(例如想要掌握基础用法,该刷哪些题?)我的解析也不会做的非常详细,只会提供思路和一些关键点,力扣上的大佬们的题解质量是非…

【PlantUML系列】序列图(二)

目录 一、参与者 二、消息交互顺序 三、其他技巧 3.1 改变参与者的顺序 3.2 使用 as 重命名参与者 3.3 注释 3.4 页眉和页脚 一、参与者 使用 participant、actor、boundary、control、entity 和 database 等关键字来定义不同类型的参与者。例如: Actor&…

如何利用内链策略提升网站的整体权重?

内链是谷歌SEO中常常被低估的部分,实际上,合理的内链策略不仅能帮助提升页面间的关联性,还可以增强网站的整体权重。通过正确的内链布局,用户可以更流畅地浏览你的网站,谷歌爬虫也能更快地抓取到更多页面,有…

zotero中pdf-translate插件和其他插件的安装

1.工具–》插件 2.找插件 3.点击之后看到一堆插件 4.找到需要的,例如pdf-translate 5.点击进入,需要看一下md文档了解下,其实最重要的就是找到特有的(.xpi file) 6.点击刚刚的蓝色链接 7.下载并保存xpi文件 8.回到zotero,安装并使…

Datax遇到的坑

公司数据中台产品,要使用airflow调datax任务实现离线作业的同步。 一、python版本问题 执行python ..datax.py .json时 报错 在运行 Python 脚本时,代码中使用了 Python 2 的 print语法,当前的环境是 Python 3。在 Python 3 中&#xff0…

容易被遗忘的测试用例

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

机器学习与深度学习-2-Softmax回归从零开始实现

机器学习与深度学习-2-Softmax回归从零开始实现 1 前言 内容来源于沐神的《动手学习深度学习》课程,本篇博客对于Softmax回归从零开始实现进行重述,依旧是根据Python编程的PEP8规范,将沐神的template代码进行简单的修改。近期有点懒散哈哈哈…

文本生成类(机器翻译)系统评估

在机器翻译任务中常用评价指标:BLEU、ROGUE、METEOR、PPL。 这些指标的缺点:只能反应模型输出是否类似于测试文本。 BLUE(Bilingual Evaluation Understudy):是用于评估模型生成的句子(candidate)和实际句子(referen…

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

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

基于HTML和CSS的校园网页设计与实现

摘要 随着计算机、互联网与通信技术的进步,Internet在人们的学习、工作和生活中的地位也变得越来越高,校园网站已经成为学校与学生,学生与学生之间交流沟通的重要平台,对同学了解学校内发生的各种事情起到了重要的作用。学校网站…

Secured Finance 推出 TVL 激励计划以及基于 FIL 的稳定币

Secured Finance 是新一代 DeFi 2.0 协议,其正在推出基于 FIL 的稳定币、固定收益市场以及具有吸引力的 TVL 激励计划,以助力 Filecoin 构建更强大的去中心化金融生态体系,并为 2025 年初 Secured Finance 协议代币的推出铺平道路。Secure Fi…

WebRover :一个功能强大的 Python 库,用于从 Web 内容生成高质量的数据集,专为训练大型语言模型和 AI 应用程序而设计。

2024-11-30 ,由Area-25团队开发的一个专门用于生成高质量网络内容数据集的Python库。该数据集旨在为大型语言模型(LLM)和人工智能应用的训练提供丰富的数据资源。 数据集地址:WebRover Dataset|自然语言处理数据集|AI模型训练数据…

基于ZYNQ-7000系列的FPGA学习笔记7——按键控制蜂鸣器(模块化编写)

基于ZYNQ-7000系列的FPGA学习笔记7——按键控制蜂鸣器(模块化编写) 1. 实验要求2. 功能分析3. 模块设计4. 波形图4.1 按键消抖模块4.2 按键控制蜂鸣器模块 5.代码编写5.1 rtl代码5.2 测试代码 6. 代码仿真7. 添加约束文件并分析综合 在上期的内容中&…

Android 分词的两种方式

前言: 本文分别介绍了原生和三方(Jieba)两种分词方式的使用和注意事项 1、安卓原生BreakIterator分词 比较简单,但是效果不太行 /*** 功能:原生分词* 参数:text:需要分词的语句* 返回值:return&#xf…

python之Django连接数据库

文章目录 连接Mysql数据库安装Mysql驱动配置数据库信息明确连接驱动定义模型在模型下的models.py中定义表对象在settings.py 中找到INSTALLED_APPS添加创建的模型 测试testdb.py中写增删改查操作urls.py添加请求路径启动项目进行测试 连接Mysql数据库 安装Mysql驱动 pip inst…

JavaWeb学习(1)(同步或异步请求、依赖jQuery简单实现Ajax技术)

目录 一、Web的基本流程与页面局部刷新。 (1)web开发时基本流程。 (2)页面的"全局刷新"与"局部刷新"。 二、Ajax技术。 (1)基本介绍。 (2)基本特点。 1、与服务…

spark sql 环境安装,java 默认路径和 安装配置!

yum安装java 查看默认路径 update-alternatives --config java # Java 环境变量 export JAVA_HOME/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.412.b08-1.el7_9.x86_64/jreexport PATH$JAVA_HOME/bin:$PATH# Spark 环境变量 export SPARK_HOME/home/vagrant/soft/sparkexport PATH…

网络层总结

网络层任务: 分组 从源主机 经多个网络/多段链路 传输到目的主机 两种重要的功能: 分组转发、 路由选择 网络层向其上层提供的两种服务 —— 面向连接的虚电路服务、无连接的数据报服务 面向连接的虚电路服务: 可靠通…