STM32单片机(八)DMA直接存储器存取----第一节:DMA直接存储器存取

news2024/12/28 19:55:46

❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。
☀️ 专栏适用人群 :适用于想要从零基础开始学习入门单片机,且有一定C语言基础的的童鞋。
🌙专栏目标:实现从零基础入门51单片机和STM32单片机,力求在玩好单片机的同时,能够了解一些计算机的基本概念,了解电路及其元器件的基本理论等。

⭐️ 专栏主要内容: 主要学习STM32单片机的功能、各个模块、单片机的外设、驱动等,最终玩好单片机和单片机的外设,全程手敲代码,实现我们所要实现的功能。
🌴 专栏说明 :如果文章知识点有错误的地方,欢迎大家随时在文章下面评论,我会第一时间改正。让我们一起学习,一起进步。
💑专栏主页:http://t.csdn.cn/HCD8v

本学习过程参考:https://space.bilibili.com/383400717

STM3单片机安装软件、各种资料以及源码的路径:
链接:https://pan.baidu.com/s/1snD0uuTfMhchFqOMWvAiHA?pwd=asdf#list/path=%2F
提取码:asdf

链接里压缩包的解压密码:32

本大节主要学习DMA直接存储器存取的相关知识,包含两小节:
第一小节主要学习DMA直接存储器存取的理论基础知识,第二小节是对第一小节的内容写两个程序进行练习,分别是DMA数据转运和DMA+AD多通道;
最终附上所有的源代码;

本小节主要学习DMA直接存储器存取的理论基础知识。

文章目录

  • 1 DMA简介
  • 2 存储器映像
  • 3 DMA框图
  • 4 DMA基本结构
  • 5 DMA请求
  • 6 数据宽度与对齐
  • 7 数据转运+DMA
  • 8 ADC扫描模式+DMA

1 DMA简介

在这里插入图片描述

  • DMA是一个数据转运小助手,它主要是用来协助CPU,完成数据转运的工作;

2 存储器映像

在这里插入图片描述

  • 对于计算机来说,存储器是很重要的一部分;
  • 存储器有两个重要知识点,分别是存储器的内容和存储器的地址
  • 上图列出了STM32所有类型的存储器以及对应的地址
  • 上图的存储器分为两部分,ROM和RAM;各个存储器的名称,地址,以及用途见上图;

3 DMA框图

在这里插入图片描述

  • 左上角的Cortex-M3是CPU,除此之外,图中的其他位置都是存储器;
  • 总线矩阵的左端,是主动单元,也就是拥有存储器的访问权;右边是被动单元,他们的存储器只能被左边的主动单元读写;
  • 主动单元的内核有DCode和系统总线,可以访问右边的存储器;DCode总线是专门访问Flash的,系统总线是访问其他东西的;
  • 由于DMA要转运数据,所以DMA也必须要有访问的主动权;
  • 在DMA1和DMA2里面,DMA1有7个通道,DMA2有5个通道,各个通道可以分别设置它们转运数据的源地址和目的地址,这样他们就可以各自独立的工作了;
  • 所有的DMA都要复用一条DMA总线,所以仲裁器的作用是根据通道的优先级,决定谁先用DMA总线;
  • AHB从设备是DMA自身的寄存器,因为DMA作为一个外设,它自己也会有相应的配置寄存器;其连接在了总线右边的AHB总线上,所以DMA既是总线矩阵的主动单元,可以读写各种存储器,也是AHB总线上的被动单元,
  • DMA请求是DMA的硬件触发源;比如ADC转换完成、串口接收到数据,需要触发DMA转运数据的时候,就会通过DMA请求这条线路,向DMA发出硬件触发信号;之后DMA就可以执行数据转运的工作了;这就是DMA请求的作用;

4 DMA基本结构

在这里插入图片描述

  • 外设寄存器和FLAH SRAM这两部分是数据转运的两大站点,左边是外设寄存器站点,右边是存储器站点,包括Flash和SRAM;
  • 外设和存储器这两个站点,都有三个参数;分别是起始地址、数据宽度和地址是否自增;
  • 外设的起始地址决定了数据从哪里来,存储器的起始地址决定了数据到哪里去;
  • 数据宽度这个参数的作用是,指定一次转运要按多大的数据宽度来进行;可以选择字节Byte、半字HalfWord和字Word;字节就是8位,也就是一次转运一个uint8_t这么大的数据;半字是16位,也就是uint16_t;字是32位,也就是uint32_t;
  • 地址是否自增这个参数的作用是,指定一次转运完成之后,下一次转运,是不是要把地址移动到下一个位置去;就相当于是指针,p++这个意思;
  • 传输寄存器是一个自减计数器; 每转运一次,计时器的值就减1;当计数器的值减为0,DMA就不会进行数据转运了;另外,其减到0之后,之前自增的地址也会恢复到起始地址的位置,以方便之后的DMA开始新一轮的转运;
  • 自动重装器的作用是,传输计数器减到0之后,是否要自动恢复到最初的值;如果设置了重装器,那就是循环转运;
  • M2M是M to M,存储器到存储器的意思;当给M2M为1时,DMA就会选择软件触发(可以理解成连续触发);为0时为硬件触发;
  • 软件触发和循环模式(自动重装器)不能同时用;

5 DMA请求

在这里插入图片描述

6 数据宽度与对齐

在这里插入图片描述

7 数据转运+DMA

在这里插入图片描述

上图对应着下一节练习1的流程;

8 ADC扫描模式+DMA

在这里插入图片描述
上图对应着下一节练习2的流程;

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

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

相关文章

使用Python制作简单的图表并设置图表元素

案例01 在python中制作简单的图表 import matplotlib.pyplot as plt # 导入matplotlib模块 x [1, 2, 3, 4, 5, 6] # 给出x坐标的数据 y [2, 4, 6, 8, 10, 12] # 给出y坐标的数据 plt.plot(x, y, color red, linewidth 3, linestyle solid) # 绘制折线图 plt.show() # …

动态库的入口——VCRT(DLL)和CRT(SO)

摘要:为了更加深入的理解动态库的加载初始化过程,本文根据VCRT和Linux-CRT的代码实现详细描述了windows和linux平台下对应动态库加载时会进行哪些工作。本文重点关注全局变量的初始化时机,以及是否有其他额外的操作。   关键字:…

被微服务循环依赖调用坑了 !

最近的迭代转测后,遇到了一个比较有意思的问题。系统在测试环境整体运行还算平稳,但是过一段时间之后,就开始有接口超时了,日志中出现非常多的 “java.net.SocketTimeoutException: Read timed out”。 试了几次重启大法&#xf…

用魔法打败魔法!用AI制作AI分割数据集!

本节内容我们使用SAM将边界框转换为分割数据集,这对于实例分割数据集的制作非常有用,下面我会一步步给出我的代码,希望对你有用。 有兴趣的朋友可以研究一下这本书,详细的介绍了数据集制作到分割的实际项目应用! 步骤 …

【 计算机组成原理 】期末重点

文章目录 前言第一章 【计算机系统概论】1.1 知识点1.1核心例题 第二章 【运算方法和运算器】2.1 知识点2.2 核心例题 第三章 【存储系统】3.1 知识点3.2 核心例题 第四章 【指令系统】4.1 知识点4.2 核心例题 第五章 【中央处理器】5.1 知识点5.2 核心例题 第六章6.1 知识点6.…

【MSP432电机驱动学习—上篇】TB6612带稳压电机驱动模块、MG310电机、霍尔编码器

所用控制板型号:MSP432P401r 今日终于得以继续我的电赛小车速通之路: 苏轼云 “ 素面常嫌粉涴 , 洗妆不褪朱红。 ” 这告诫我们不能只注重在表面粉饰虚伪的自己,要像梅花一样,不断磨砺自己的内在~ 后半句是 “…

JavaSE基础语法--类和对象

在Java中,一切皆为对象,类和对象是一个抽象的概念。我们可以从面向过程来过渡到面向对象。 那么什么是面向过程呢? 举一个简单的例子,现实生活中,你需要买一台手机的时候会经历如下步骤: 这里的每一步都可…

【python程序设计】——期末大作业

【python程序设计】——期末大作业😎 前言🙌一、所用技术:二、 系统设计三、 系统实现3.1 核心功能代码实现:3.2 演示结果展示 总结撒花💞 😎博客昵称:博客小梦 😊最喜欢的座右铭&am…

yaffs格式的根文件系统制作

linux内核启动后,它接下来要做的事就是启动应用程序,而应用程序在哪里呢,类比windows,启动时要读取c盘,所以linux的文件系统就类似于c盘,并且我们使用的ls、cp等一些类命令(本质是应用程序&…

JavaScript 手写代码 第二期

文章目录 1.为什么要手写代码?2. 手写代码2.1 手写实现判断类型函数2.1.1 前置知识2.1.1 手写实现 2.2 手写实现aplly,call,bind方法2.2.1 基本使用2.2.2 实现思路2.2.3 手写实现 1.为什么要手写代码? 我们在日常开发过程中,往往都是取出来直…

Linux(centos7)缺失.bashrc文件登录出现bash-4.2

一、问题描述 最近遇到几次登陆linux(centos7.5)系统后,虽然在/root用户下,但出现了如下界面: 二、解决思路 使用不同的linux发行版本,(比如:IP为*...90,以下简称90)会…

课程19:个人中心功能与提示优化

🚀前言 本文是《.Net Core从零学习搭建权限管理系统》教程专栏的课程(点击链接,跳转到专栏主页,欢迎订阅,持续更新…) 专栏介绍:以实战为线索,基于.Net 7 + REST + Vue、前后端分离,不依赖任何第三方框架,从零一步一步讲解权限管理系统搭建。 专栏适用于人群:We…

Android中加载一张大图,如何正常显示且不发生OOM ?

问题 在Android中,获取一个1000*20000(宽1000px,高20000px)的大图,如何正常加载显示且不发生OOM呢? 分析 Android系统会为应用分配一定大小的堆内存 而如果遇到高分辨率图片时,如果它的配置为ARGB(每个像素占4Byte) 那么它要消…

深度学习(23)——YOLO系列(2)

深度学习(23)——YOLO系列(2) 文章目录 深度学习(23)——YOLO系列(2)1. model2. dataset3. utils4. test/detect5. detect全过程 今天先写YOLO v3的代码,后面再出v5&…

【PCB专题】案例:PCB板厂说焊盘宽度太小容易沉金不良,但加宽又可能导致阻焊桥在阻焊为黑色油墨下无法做出?

此案例是最近在Layout一块PCB板卡,使用了一个以前我没有接触过的器件,此器件的封装是QFN128。 总的问题是:PCB板厂说如果按原稿制作的话,焊盘宽度太小沉金容易不良,但电话里和我说如果加宽又可能导致阻焊桥在黑色油墨情况下无法做出? 板厂给的EQ如下所示,表示TOP面设计…

【Unity之IMGUI】—编译模式下控件可视化及其封装

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:Uni…

【从零开始开发一个线上网课系统-01】账号登录及退出登录功能开发

文章目录 1 视图层开发2 form表单验证3 配置urls.py4 模板层开发 实际上在系统开发的博客中应该先描述数据库设计,但由于设计的表比较多,其理解简单,但撰写和描述较为麻烦,所以我以可视化方式来呈现这些数据表以及其中的关系&…

RISCV Reader笔记_1 RISCV的意义

RISCV Reader RISCV的诞生 出众之处 RISCV架构被设计的目的就是成为一个通用的指令集架构 ISA。不仅支持从微控制器到高性能计算机的各种处理器,兼容各种编程语言,还适应FPGA ASIC等所有实现技术,稳定…… 计算机体系结构为了在指令集更新…

Iceberg从入门到精通系列之一:Iceberg核心概念理解

Iceberg从入门到精通系列之一:Iceberg核心概念理解 一、Iceberg核心概念二、Iceberg表结构三、数据文件四、表快照Snapshot五、清单列表Manifest list六、表快照、数据文件和清单列表之间的关系七、Catalog八、Hive Catalog九、Hadoop Catalog十、Hive Catalog和Had…

Alamouti,MRC以及beam三种方式的误码率对比MATLAB仿真程序

Alamouti,MRC以及beam三种方式的误码率对比MATLAB仿真程序 完整程序: clc; clear; close all; warning off; addpath(genpath(pwd)); %%%%%%%%%%%%%%%%%%%%%%%%% Initialization %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% N = 10^6; r_n = rand(1,N)>0.5; BPSK = 2*r_n-1; E_n_d…