嵌入式——直接存储器存取(DMA)补充

目录

一、认识 DMA

二、DMA结构

1. DMA请求

2. 通道DMA

补:通道配置过程。

3. 仲裁器

三、DMA数据配置

1. 从哪里来,到哪里去

(1)从外设到存储器

(2)从存储器到外设

(3)从存储器到存储器

2. 要传多少,单位是什么

补:指针增量。

3. 什么时候传输完成


一、认识 DMA

        DMA (Direct Memory Access,直接存储器访问)控制器独立于内核,属于一个单独的外设,它的主要功能是传输数据,但是不需要占用CPU,即在它传输数据的时候,CPU可以干其他的事情,就像多线程一样。

数据传输支持从外设到存储器或者从存储器到存储器,这里的存储器可以是SRAM或者Flash存储器。DMA控制器包含了DMA1和DMA2,其中DMA1有7个通道,DMA2有5个通道,这里的通道可以理解为传输数据的一种管道。

补:DMA2只存在于大容量的单片机中。

二、DMA结构

1. DMA请求

        外设要想通过DMA来传输数据,必须先向DMA控制器发送DMA请求,DMA收到请求信号之后,控制器会给外设一个应答信号,当外设应答且DMA控制器收到应答信号之后,就会启动DMA的传输,直到传输完毕。

        DMA有DMA1和DMA2两个控制器,DMA1有7个通道,DMA2有5个通道,不同DMA控制器的通道对应不同的外设请求

2. 通道DMA

        有12个独立可编程的通道,DMA1有7个通道,DMA2有5个通道,每个通道对应不同外设的DMA请求。虽然每个通道可以接收多个外设的请求,但是同一时间只能接收一个,不能同时接收多个

补:通道配置过程。

      在 DMA_CPARx寄存器 中设置外设寄存器的地址。发生外设数据传输请求时,这个地址将是数据传输的源或目标

     DMA_CMARx奇存器 中设置数据存储器的地址。发生外设数据传输请求时,传输的数据将从这个地址读出或写入

     DMA_CNDTRx寄存器 中设置要传输的数据量。在每个数据传输后,这个数值递减

     DMA_CCRx寄存器的 PL[1:0]位 中设置通道的优先级

     DMA_CCRx寄存器 中设置数据传输的方向、循环模式、外设和存储器的增量模式、外设和存储器的数据宽度、传输一半产生中断或传输完成产生中断

      设置 DMA_CCRx寄存器的ENABLE位启动该通道

3. 仲裁器

        解决请求先后响应顺序的问题,由仲裁器管理。管理DMA请求分为两个阶段:第1阶段属于软件阶段,可以在DMA_CCRx寄存器中设置,有4个等级:非常高、高、中和低;第2阶段属于硬件阶段,如果两个或以上的DMA请求设置的优先级一样,则它们的优先级取决于通道编号编号越低越优先级越

补:大容量产品和互联型产品中,DMA1控制器拥有高于DMA2控制器的优先级。

三、DMA数据配置

1. 从哪里来,到哪里去

        DMA传输数据的方向有3个: 从外设到存储器,从存储器到外设,从存储器到存储器。具体的方向由DMA_CCR中第4位的DIR配置:0表示从外设到存储器,1表示从存储器到外设。里面涉及的外设地址由DMA_CPAR配置,存储器地址由DMA_CMAR配置。

(1)从外设到存储器

        以ADC采集为例。DMA外部寄存器的地址对应的就是ADC数据寄存器的地址DMA存储器的地址就是我们自定义的变量 ( 用来接收、存储ADC采集的数据 )的地址。方向设置外设为源地址

(2)从存储器到外设

        以串口向电脑端发送数据为例。DMA外部寄存器的地址对应的就是串口数据寄存器的地址DMA存储器的地址就是我们自定义的变量( 相当于一个缓冲区,用来存储通过串口发送到电脑的数据 )的地址。方向设置外设为目标地址

(3)从存储器到存储器

        以内部Flash存储器向内部SRAM复制数据为例。DMA外部寄存器的地址对应的就是内部Flash存储器(把内部Flash当作一个外设来看)的地址DMA存储器的地址就是我们自定义的变量( 相当于一个缓冲区,用来存储来自内部Flash存储器的数据 )的地址。方向设置外设(内部Flash存储器)为源地址。与上面两个不同的是,还要把DMA_CCR中的第14位(MEM2MEM)存储器到存储器模式配置为1,启动存储器到存储器模式

2. 要传多少,单位是什么

        以串口向电脑发送数据为例,可以一次性给电脑发送很多数据,具体多少由DMA_CNDTR配置。这是一个32位寄存器,一次最多只能传输65535个数据。要使数据正确传输,源和目标地址存储的数据宽度还必须一致,串口数据寄存器是8位,所以定义的待发送数据也必须是8位外设的数据宽度DMA_CCRx的PSIZE[1:0]配置,可以是8、16、32位,存储器的数据宽度DMA_CCRx的MSIZE[1:0]配置,可以是8、16、32位。

        在DMA控制器的控制下,数据要想有条不紊地传输,还必须正确设置两边数据指针的增量模式外设的地址指针DMA_CCRx的PINC配置,存储器的地址指针MINC配置。以串口向电脑发送数据为例,每发送完一个数据,存储器的地址指针就应该加1。而串口数据寄存器只有一个,那么外设的地址指针就固定不变。

补:指针增量。

        通过设置 DMA_CCRx寄存器中的PINC和MINC 标志位,外设和存储器的指针在每次传输后可以有选择地完成自动增量

     ① 通道配置为增量模式:下一个要传输的地址将是前一个地址加上增量值( 增量值取决与所选的数据宽度:1、2、4)。第一个传输的地址是存放在 DMA_CPARx / DMA_CMARx寄存器 中。在传输过程中,这些寄存器保持它们初始的数值软件不能改变和读出当前正在传输的地址(在内部的当前外设/存储器地址寄存器中)。

     ② 通道配置为非循环模式:传输结束后(即传输计数变为0)将不再产生DMA操作,要开始新的DMA传输,需要在关闭DMA通道的情况下,在 DMA_CNDTRx奇存器 重新写入传输数目

     ③ 循环模式:最后一次传输结束时,DMA_CNDTRx寄存器 的内容会自动地被重新加载为其初始数值,内部的当前外设 / 存储器地址寄存器也被重新加载为 DMA_CPARx / DMA_CMARx寄存器 设定的初始基地址。 

3. 什么时候传输完成

        可以通过查询标志位或者通过中断的方式来鉴别。每个DMA通道在DMA传输过半、传输完成和传输错误时都会有相应的标志位(DMA中断状态寄存器DMA_ISR),如果使能了该类型的中断后,则会产生中断

        传输的完成还分两种模式一次传输和循环传输一次传输,即传输一次之后就停止,要想再传输的话,必须关闭DMA使能后再重新配置,才能继续传输。循环传输则是一次传输完成之后又恢复第一次传输时的配置,循环传输不断重复。具体的模式由DMA_CCRx寄存器的CIRC循环模式位控制。


可以结合这篇文章:

     嵌入式一直接存储器存取(DMA)

http://t.csdnimg.cn/I3Abticon-default.png?t=N7T8http://t.csdnimg.cn/I3Abt

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

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

相关文章

React 组件生命周期-概述、生命周期钩子函数 - 挂载时、生命周期钩子函数 - 更新时、生命周期钩子函数 - 卸载时

React 组件生命周期-概述 学习目标: 能够说出组件的生命周期一共几个阶段 组件的生命周期是指组件从被创建到挂在到页面中运行,在到组件不用时卸载组件 注意:只有类组件才有生命周期,函数组件没有生命周期(类组件需要实例化&…

LeetCode344反转字符串(java实现)

今天我们来分享的题目是leetcode344反转字符串。题目描述如下: 我们观察题目发现,题目要求使用O(1)的空间解决这一问题。那么我们就不能进行使用开辟新的数组进行反转了。 解题思路:那么该题的我得思路是使用双指针的方法进行题解&#xff0…

2024獬豸杯

2024.1.28上午9-12时,返乡大学生边帮姐带娃边做,有几题没交上 解压密码:都考100分 手机备份包 手机基本信息 1、IOS手机备份包是什么时候开始备份的。(标准格式:2024-01-20.12:12:12) 2024-01-15.14.19.44 2、请分…

Docker 安装与基本操作

目录 一、Docker 概述 1、Docker 简述 2、Docker 的优势 3、Docker与虚拟机的区别 4、Docker 的核心概念 1)镜像 2)容器 3)仓库 二、Docker 安装 1、命令: 2、实操: 三、Docker 镜像操作 1、命令&#xff1…

centos7 挂载windows共享文件夹报错提示写保护

centos7挂载windows共享时,提示被共享的位置写保护,只能以只读方式挂载,紧接着就是以只读方式挂载失败 原因是组件少装了 yum install cifs-utils 安装完后,正常挂载使用。 下载离线安装包 下载离线包下载工具 下载离线安装包…

SpringBoot系列之MybatisPlus实现分组查询

SpringBoot系列之MybatisPlus实现分组查询 我之前博主曾记写过一篇介绍SpringBoot2.0项目怎么集成MybatisPlus的教程,不过之前的博客只是介绍了怎么集成,并没有做详细的描述各种业务场景,本篇博客是对之前博客的补充,介绍在mybat…

2024/1/27 备战蓝桥杯 1-1

目录 求和 0求和 - 蓝桥云课 (lanqiao.cn) 成绩分析 0成绩分析 - 蓝桥云课 (lanqiao.cn) 合法日期 0合法日期 - 蓝桥云课 (lanqiao.cn) 时间加法 0时间加法 - 蓝桥云课 (lanqiao.cn) 扫雷 0扫雷 - 蓝桥云课 (lanqiao.cn) 大写 0大写 - 蓝桥云课 (lanqiao.cn) 标题…

【SpringSpringBoot】概述

Spring&SpringBoot专题 【注】: 本专题围绕框架核心概念展开,渐进式深入总结学习、面试、开发经验,集中整理便于回顾 持续补充与施工中~~~~ 1.发展史 2.基本架构 Spring框架的基本架构是一个分层架构,包括多个模块&#x…

2024三掌柜赠书活动第六期:人人都离不开的算法——图解算法应用

目录 前言算法概念图解算法应用算法的价值和挑战关于《人人都离不开的算法——图解算法应用》编辑推荐内容简介作者简介图书目录书中前言/序言书摘插画《人人都离不开的算法——图解算法应用》全书速览结束语 前言 作为开发者想必都知道,算法是现代社会中无处不在…

day33_js

今日内容 0 复习昨日 1 JS概述 2 JS的引入方式 3 JS语法 3.1 变量 3.2 基本数据类型 3.3 引用类型 3.4 数组类型 3.5 日期类型 3.6 运算符(算术运算,逻辑,关系运算,三目运算) 3.7 分支 3.8 循环 3.9 函数(重点) 3 常见弹窗函数 alter,confirm,prompt 0 复习昨日 1 盒子模型 对d…

兄弟MFC-8515DN黑白激光多功能一体机硒鼓及粉盒清零方法

耗材信息: 硒鼓DR-3350:约30000页; 墨粉盒TN-3335:约3000页【A4纸5%覆盖率】; 高容量墨粉盒TN-3385:约8000页【A4纸5%覆盖率】; 超高容量墨粉盒TN-3395:约12000页【A4纸5%覆盖率】&a…

php项目下微信小程序对接实战问题与解决方案

一.实战问题与方案总结 1.SQL查询条件是一组数,传参却是一个字符串导致报错,如下 SQLSTATE[HY093]: Invalid parameter number (SQL: select count(*) as aggregate from car_video where province_id in (1492) and city_id in (1493) and county_id …

个体诊所电子处方系统设计,社区门诊处方开单管理系统软件教程

个体诊所电子处方系统设计,社区门诊处方开单管理系统软件教程 一、前言 以下软件程序操作教程以 佳易王诊所电子处方管理系统软件V17.3为例说明 如图,在基本信息设置里,可以设置处方配方模板,这样在开电子处方的时候可以一键导入…

计算机提示缺失dll文件怎么办?那种dll解决方法更值得推荐

当在运行游戏,软件程序的过程中遇到“找不到dll”的情况时,这实际上意味着系统或应用程序无法定位并加载必要的动态链接库文件(DLL),从而无法顺利完成预期的功能调用和执行流程。这种问题的发生可能会引发一系列严重后…

Selenium + Django + Echarts 实现亚马逊商品数据可视化爬虫项目

最近完成了1个爬虫项目,记录一下自己的心得。 项目功能简介 根据用户输入商品名称、类别名称,使用Selenium, BS4等技术每天定时抓取亚马逊商品数据,使用Pandas进行数据清洗后保存在MySql数据库中. 使用Django提供用户端功能,显…

【electron】安装网络问题处理

目录 场景排查问题排查结论electron 安装失败解决方案 新的问题electron-builder 打包失败处理 场景 在mac上使用electron进行代码开发的时候,无法正常下载与electron、electron-builder相关的依赖 排查问题 是不是因为没有翻墙导致资源无法下载是不是没有设置正…

MC3172 串口模块

MC3172 支持12个串口对应关系如下 串口模块初始化 第一个是uart0~11 inpin RX 脚 管脚号 outpin TX脚 管脚号 baud 波特率 read_ptr ,数据读取指针 void uart_init(u32 uart_num,u8 in_pin,u8 out_pin,u32 baud,u8* read_ptr) {INTDEV_SET_CLK_RST(uart_num,(INTDEV_RUN|…

HCIP-三层架构实验

实验拓扑 实验需求 实验思路 配置IP地址 链路聚合 vlan配置 配置生产树 实验步骤 配置IP地址 以R1为例 <Huawei>sys [Huawei]sys r1 [r1]int g0/0/02 [r1-GigabitEthernet0/0/2]ip address 12.1.1.1 24 Jan 28 2024 17:09:03-08:00 r1 %%01IFNET/4/LINK_STATE(l…

一天吃透面试八股文

内容摘自我的学习网站&#xff1a;topjavaer.cn 分享50道Java并发高频面试题。 线程池 线程池&#xff1a;一个管理线程的池子。 为什么平时都是使用线程池创建线程&#xff0c;直接new一个线程不好吗&#xff1f; 嗯&#xff0c;手动创建线程有两个缺点 不受控风险频繁创…

vue中使用jweixin-module

目录 一&#xff1a;安装jweixin-module 二&#xff1a;后端配置 三&#xff1a;获取签名并注入配置 四&#xff1a;调用微信JS接口 在Vue项目中使用jweixin-module&#xff08;或通常称为jweixin&#xff0c;即微信JS-SDK的封装&#xff09;来调用微信提供的JS接口&#x…