江科大/江协科技 STM32学习笔记P23

news2024/9/23 16:20:14

文章目录

  • DMA直接存储器存取
    • DMA简介
    • 存储器映像
    • DMA框图
    • DMA基本结构
    • 存储器到存储器的数据转运
    • ADC扫描模式和DMA配合使用流程


DMA直接存储器存取

DMA简介

在这里插入图片描述
DMA进行存储器到存储器的数据转运,比如Flash里的一批数据转运到SRAM里,需要软件触发,使用软件触发后DMA就会一股脑地把这批数据以最快的速度全部转运完成,如果DMA进行的是外设到存储器的数据转运,就不能一股脑地转运,因为外设的数据是有一定时机的,这时需要用硬件触发,比如转运ADC的数据,ADC每个通道AD转换完成后,硬件触发一次DMA,之后DMA再转运,触发一次,转运一次。
存储器到存储器的数据转运一般用软件触发,外设到存储器的数据转运一般用硬件触发。

存储器映像

在这里插入图片描述
ROM只读存储器,非易失性、掉电不丢失。RAM随机存储器,易失性、掉电丢失的存储器。

DMA框图

在这里插入图片描述
寄存器是一种特殊的存储器,一方面CPU可以对寄存器进行读写,就像读写运行内存一样,另一方面寄存器的每一位都连一根导线,这些导线可以用于控制外设电路的状态,比如置引脚的高低电平、导通和断开开关、切换数据选择器、多位结合起来当做计数器或数据寄存器等等。寄存器是连接软件和硬件的桥梁。软件读写寄存器,相当于控制硬件的执行。外设就是寄存器,寄存器就是存储器,那使用DMA进行数据转运,就可以归为一类问题了,就是从某个地址取内容,再放到另一个地址去。
总线矩阵的左端,是主动单元,也就是拥有存储器的访问权,右边是被动单元,它们的存储器只能被左边的主动单元读写,主动单元,内核有DCode和系统总线,可以访问右边的存储器,其中DCode总线是专门访问Flash的,系统总线是访问其他东西的,另外,由于DMA要转运数据,所以DMA也必须要有访问的主动权,也是主动单元。
仲裁器的作用是防止冲突,根据优先级决定通道的使用权。
AHB从设备就是DMA自身的寄存器,DMA作为一个外设,自己也会有相应的配置寄存器,这里连在了总线右边的AHB总线上,所以DMA既是总线矩阵的主动单元,可以读写各种寄存器,也是AHB总线的被动单元,CPU通过系统总线到总线矩阵再到AHB从设备就可以对DMA进行配置。
DMA请求就是触发的意思,右边的触发源是各个外设,所以DMA请求就是DMA的硬件触发源,比如ADC转换完成、串口接收到数据需要触发DMA转运数据的时候,就会通过DMA请求线路向DMA发出硬件触发信号,之后DMA就可以执行数据转运的工作了。
另注意CPU或DMA直接访问Flash的时候,是只可以读不可以写的,想要写入需要配置Flash接口控制器。SRAM可以任意读写。外设寄存器有的只读有的只写,数据寄存器都是可以正常读写的。

DMA基本结构

在这里插入图片描述

寄存器的地址不用自增,存储器地址需要自增。如果进行存储器到存储器的数据转移,就是Flash到SRAM,需要把其中一个存储器的地址放在外设的站点,只要在外设起始地址里写Flash或SRAM的地址,那它就会去Flash或SRAM找地址,也就是虽然叫外设寄存器但也可以写别的地址。
传输计数器用来指定总共需要几次的,是一个自减计数器,比如写5,DMA就只能进行5次数据转运,转运过程中每转运一次,计数器的数就会减1,当传输计数器减到0之后,DMA就不会再进行数据转运了,另外减到0之后,之前自增的地址也会恢复到起始地址的位置,方便之后DMA开始新一轮的转运。
传输计数器的右边是自动重装器,作用是传输计数器减到0后是否要自动恢复到最初的值,比如最初传输计数器给5,如果不使用自动重装器,转运5次后DMA就结束了,如果使用,计数器减到0后会立即重装到初始值5,所以自动重装器决定了转运的模式,如果不重装就是正常的单次模式,如果重装就是循环模式。比如如果想转运一个数字,一般是单次模式,转运一轮就结束了,如果ADC扫描模式+连续转换,为了配合ADC,DMA也需要使用循环模式。
最下面是触发,触发就是决定DMA需要在什么时机进行转运,触发源有硬件触发和软件触发,由M2M参数决定选择哪个,M2M就是Memory to Memory存储器到存储器的意思。
给M2M位1时,DMA选择软件触发,执行逻辑是以最快的速度连续不断地触发DMA,争取早日把传输计数器清零,完成这一轮的转换,和之前外部中断、ADC的软件触发不一样,不是调用某个函数一次,触发一次,可以把这里理解为连续触发。软件触发和循环模式不能同时使用,软件触发就是想把传输计数器清零,循环模式是清零后自动重装,如果同时用就死循环。软件触发一般适用于存储器到存储器的转运,软件启动,不需要时机,并且想尽快完成任务。
给M2M位0,就是使用硬件触发,硬件触发源选ADC、串口、定时器等等,使用 硬件触发的转运,一般是与外设有关的转运,需要一定的时机,比如ADC转换完成、串口收到数据、定时时间到等等,在硬件达到这些时机时,传一个信号过来触发DMA进行转运。
开关控制,是DMA_Cmd函数,当给DMA使能后DMA准备就绪,可以进行转运,DMA进行转运有几个条件,第一,开关控制,DMA_Cmd必须使能,第二,传输计数器必须大于0,第三,触发源必须有触发信号,触发一次转运一次,传输计数器自减一次,当传输计数器等于0且没有自动重装时,无论是否触发,DMA都不会再进行转运了,此时需要DMA_Cmd给DISABLE关闭DMA,再为传输计数器写一个大于0的数,再DMA_Cmd,给ENABLE,开启DMA,DMA才能继续工作。注意,写传输计数器时,必须要先关DMA再进行,不能在DMA开启时,写传输计数器。
在这里插入图片描述
如果目标的数据宽度比源端的数据宽度大,在目标数据前面多出来的空位补0,当目标数据宽度比源端数16据宽度小时,比如由16位转到8位,读B1B0,只写入B0,读B3B2,只写入B2。总之,小转大,高位补0,大转小,高位舍去。

存储器到存储器的数据转运

在这里插入图片描述

外设地址填DataA数组的首地址,存储器地址给DataB数组的首地址,数据宽度按8位的字节传输,两边地址都需要自增,方向参数决定外设站点和存储器站点间的转运方向,传输寄存器给7,自动重装器暂时不需要,触发选择部分使用软件触发,最后调用DMA_Cmd,给DMA使能。这样数据从DataA转运到DataB,转运7次后,传输计数器自减到0,DMA停止,转运完成,转运完成后DataA的数据并不会消失,相当于复制。

ADC扫描模式和DMA配合使用流程

在这里插入图片描述

左边是ADC扫描模式的执行流程,7个通道,触发一次后,7个通道依次进行AD转换,转换结果都放到ADC_DR数据寄存器里,要在每个单独的通道转换完成后,进行一次DMA转运,并且目的地址进行自增,这样数据不会被覆盖。配置DMA,外设地址写入ADC_DR这个寄存器的地址,存储器的地址,可以在SRAM中定义一个数组ADValue,然后把ADValue的地址当做存储器的地址,之后数据宽度,因为ADC_DR和SRAM数组要的都是uint16_t的数据,所以是16位的半字传输,继续看地址是否自增,图里外设地址不自增,存储器地址自增,传输方向,外设站点到存储器站点,传输计数器,通道7个所以计数7次,计数器是否自动重装看ADC的配置,ADC如果单次扫描,DMA的传输计数器可以不自动重装,转换一轮就停止,如果ADC连续扫描,DMA使用自动重装,在ADC启动下一轮转换的时候,DMA也启动下一轮转运,ADC和DMA同步工作,最后触发选择,ADC_DR的值是在ADC单个通道转换完成后才会有效,所以DMA转运的时机,需要和ADC单个通道转换完成同步,DMA的触发要选择ADC的硬件触发。ADC扫描模式在每个单独的通道转换完成后,没有任何标志位,也不会触发中断,所以程序不太好判断某一个通道转换完成的时机是什么时候,但是会产生DMA请求触发DMA转运。

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

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

相关文章

JQuery实现的时间插件源码附注释

HTML页面代码 <!DOCTYPE HTML> <html> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta content="width=device-width, initial-scale=1, maximum-scale=1,user-scalable=no;" name="…

【方案】SRM系统整体设计方案(解决方案+实现源码)

一、项目理解 二、总体解决方案概述 三、业务解决方案详述 四、端到端的采购流程管理 1. 采购计划 2. 采购寻源(招投标、询报价、竞价) 3. 合同管理 4. 订单执行与供应商协同 5. 采购分析与评估 五、支撑流程 1. 物资主数据管理 2. 供应商管理 3. 目录管理 4. 评标专家库管理 5…

grom接入Prometheus,grafana

在同级目录下分别创建 docker-compose.yml&#xff0c;与prometheus.yml 配置文件 version: 3.8services:prometheus:image: prom/prometheuscontainer_name: prometheusports:- "9090:9090" # Prometheus Web UI 端口volumes:- ./prometheus.yml:/etc/prometheus…

opencv-python实战项目八:根据颜色抠出图片中感兴趣区域

文章目录 一&#xff0c;简介二&#xff0c;实现方案三、算法实现步骤3.2 处理颜色蒙版&#xff1a;3.3 取出图片中蒙版对应区域 四&#xff0c;整体代码五&#xff0c;效果&#xff1a; 一&#xff0c;简介 本项目旨在开发一个基于OpenCV的图像处理工具&#xff0c;实现根据颜…

商贸城小程序系统开发制作方案

商贸城作为集批发、零售、展示、交流于一体的综合性商业体。通过商贸城小程序系统促进商家与消费者之间的互动&#xff0c;实现线上线下流量的无缝对接。一、用户需求分析 1、顾客需求&#xff1a; 快速查找店铺信息&#xff1b; 在线浏览商品和服务&#xff1b; 实现线上预约、…

【网站项目】SpringBoot675学生心理压力咨询评判

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

Vue启动时报异常 ‘error:03000086:digital envelope routines::initialization error‘

问题描述 启动Vue项目时&#xff0c;突发报如下异常&#xff1a; opensslErrorStack: [error:03000086:digital envelope routines::initialization error,error:0308010C:digital envelope routines::unsupported],library: digital envelope routines,reason: unsupported,…

CentOS7下载与安装 即配置网卡

CentOS 7是什么? CentOS7是基于RHEL的企业级Linux操作系统&#xff0c;引入了Systemd、XFS文件系统和Docker支持。它提供了新的软件包、工具和性能调优选项&#xff0c;同时加强了系统安全和稳定性。总的来说&#xff0c;CentOS7是一个稳定、安全、长期支持的操作系统&#xf…

【wiki知识库】09.欢迎页面展示(浏览量统计)SpringBoot部分

&#x1f34a; 编程有易不绕弯&#xff0c;成长之路不孤单&#xff01; 大家好&#xff0c;我是熊哈哈&#xff0c;这个项目从我接手到现在有了两个多月的时间了吧&#xff0c;其实本来我在七月初就做完的吧&#xff0c;但是六月份的时候生病了&#xff0c;在家里休息了一个月的…

【和可被 K 整除的子数组】python刷题记录

R4-前缀和专题 class Solution:def subarraysDivByK(self, nums: List[int], k: int) -> int:ret0# 存储当前位置的上一个位置的前缀和的余数加上当前位置的值对K的余数pre_mod0dictdefaultdict(int)dict[0]1for i in range(len(nums)):pre_mod(pre_modnums[i])%k# 如果能在…

Kubernetes 基础概念介绍

1. 应用部署方式 传统部署&#xff1a;互联网早期&#xff0c;会直接将应用程序部署在物理机上 优点&#xff1a;简单&#xff0c;不需要其它技术的参与 缺点&#xff1a;不能为应用程序定义资源使用边界&#xff0c;很难合理地分配计算资源&#xff0c;而且程序之间容易产生影…

投票小程序App功能开发源码技术实现

随着移动互联网的快速发展&#xff0c;小程序作为一种轻量级应用&#xff0c;因其无需安装、即用即走的特点&#xff0c;在各类应用场景中迅速普及。投票小程序作为其中的一种&#xff0c;因其便捷性和实用性&#xff0c;广泛应用于各类活动、问卷调查及意见收集中。本文将围绕…

Linux-Shell入门-05

1.Shell的概念 1.1 什么是shell Shell脚本语言是实现Linux/UNIX系统管理及自W动化运维所必备的重要工具&#xff0c; Linux/UNIX系统的底层及基础应用软件的核心大都涉及Shell脚本的内容。Shell是一种编程语言, 它像其它编程语言如: C, Java, Python等一样也有变量/函数/运算符…

上海“创投十九条”明确政府引导基金带动作用,银行如何挖掘投贷联动增长潜力?

发展创业投资是促进科技、产业、金融良性循环的重要举措。为促进创业投资高质量发展&#xff0c;近几个月来&#xff0c;“国创投十七条”“上海创投十九条”等政策陆续发布&#xff0c;明确指出发挥政府引导基金带动作用&#xff0c;进一步加大对战略性新兴产业和未来产业的支…

空指针异常(NullPointerException)以及解决方案

之前我们提到过&#xff0c;在学习数组这一篇章时&#xff0c;有两种运行时异常&#xff0c;可能会反复的出现,首先第一个就是我们之前所讲述的&#xff0c;数组下标越界异常&#xff08;ArrayIndexOutOfBoundsException&#xff09;&#xff0c;如需查看详情&#xff0c;可跳转…

tekton通过ceph挂载node_modules的时候报错failed to execute command: copying dir: symlink

分析&#xff1a; 如果ceph的mountPath和workingDir路径一致的话&#xff0c;就会报错。 解决&#xff1a;node_modules挂载到/workspace下&#xff0c;workingDir的代码mv到/workspace下进行构建。

Spring Boot和OCR构建车牌识别系统

​ 博客主页: 南来_北往 系列专栏&#xff1a;Spring Boot实战 OCR介绍 OCR&#xff08;Optical Character Recognition&#xff09;是光学字符识别技术的缩写&#xff0c;它能够将图像中的文本转换为机器可读和编辑的数字文本格式。这种技术广泛应用于数据输入、文档管理…

⼆叉树选择题

⼆叉树选择题 本篇文章是初阶二叉树的收尾&#xff0c;旨在进一步加深对于二叉树性质的理解&#xff0c;祝你有一个愉快的学习之旅&#xff01; &#x1f4a1; ⼆叉树性质 1&#xff09;对任何⼀棵⼆叉树, 如果度为 0 其叶结点个数为 n0 , 度为 2 的分⽀结点个数为 n2 ,则有…

Unity | AmplifyShaderEditor插件基础(第二集:模版说明)

目录 一、前言 二、核心模版和URP模版 1.区别介绍 2.自己的模版 三、输出节点 1.界面 2.打开OutPut 3.ShderType 4.ShaderName 5.Shader大块内容 6.修改内容 四、预告 一、前言 内容全部基于以下链接基础以上讲的。 Unity | Shader基础知识&#xff08;什么是shader…

JSON与EXL文件互转

功能&#xff1a;实现json到excel文件的相互转换(支持json多选版) 目的&#xff1a;编码与语言对应&#xff0c;方便大家使用 页面设计&#xff1a; 介绍&#xff1a; 1.选择文件栏目选择想要转换的文件 2.生成路径是转换后文件所在目录 3.小方框勾选与不勾选分别代表exl到…