(STM32笔记)十二、DMA的基础知识与用法 第二部分

devtools/2025/1/16 6:44:18/

我用的是正点的STM32F103来进行学习,板子和教程是野火的指南者
之后的这个系列笔记开头未标明的话,用的也是这个板子和教程。

DMA的基础知识与用法

    • 二、DMA传输设置
      • 1、数据来源与数据去向
        • 外设到存储器
        • 存储器到外设
        • 存储器到存储器
      • 2、每次传输大小
      • 3、传输结束标志

DMA_4">二、DMA传输设置

通常来说,DMA传输最重要的三个内容为:

  1. 数据来源与数据去向
  2. 每次传输大小
  3. 传输结束标志

1、数据来源与数据去向

我们知道 DMA 传输数据的方向有三个:

  • 从外设到存储器 P->M
  • 从存储器到外设 M->P
  • 从存储器到存储器 M->M

具体的方向 DMA_CCR 位 4 DIR 配置:0 表示从外设到存储器,1 表示从存储器到外设。
在这里插入图片描述
在这里插入图片描述

这里面涉及到的外设地址由 DMA_CPAR 配置,存储器地址由 DMA_CMAR 配置。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

外设到存储器

当我们使用从外设到存储器传输时,以 ADC 采集为例。

DMA 外设寄存器的地址对应的就是 ADC数据寄存器的地址,DMA 存储器的地址就是我们自定义的变量(用来接收存储 AD 采集的数据)的地址。

外设到存储器
自定义的变量地址
ADC数据寄存器地址
存储器到外设

当我们使用从存储器到外设传输时,以串口向电脑端发送数据为例。

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

存储器到外设
串口数据寄存器的地址
自定义的变量地址
存储器到存储器

当我们使用从存储器到存储器传输时,以内部 FLASH 向内部 SRAM 复制数据为例。

DMA 外设寄存器的地址对应的就是内部 FLASH(我们这里把内部 FALSH 当作一个外设来看)的地址,DMA存储器的地址就是我们自定义的变量(相当于一个缓冲区,用来存储来自内部 FLASH 的数据)的地址。

存储器到存储器
自定义变量的地址
内部FLASH地址
(当做外设看待)

跟上面两个不一样的是,这里需要把DMA_CCR 位 14:MEM2MEM(存储器到存储器模式)配置为 1,启动 M2M 模式。
在这里插入图片描述
在这里插入图片描述

2、每次传输大小

当我们配置好数据要从哪里来到哪里去之后,我们还需要知道我们要传输的数据是多少,数据的单位是什么。

传输数据设置
如果打开了自动重加载模式
数据量传输至0后复位
设置源地址和目标地址的增量模式
(设置数据存放的方向)
设置源地址和目标地址的宽度
(设置传输单位)
设置传输数据量大小
(设置传输总量)

以串口向电脑发送数据为例,我们可以一次性给电脑发送很多数据,具体多少由 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,而串口数据寄存器只有一个,那么外设的地址指针就固定不变。具体的数据指针的增量模式由实际情况决定。

3、传输结束标志

数据什么时候传输完成,我们可以通过查询标志位或者通过中断的方式来鉴别。

每个 DMA 通道在 DMA 传输过半、传输完成和传输错误时都会有相应的标志位,如果使能了该类型的中断后,则会产生中断。
有关各个标志位的详细描述请参考 DMA 中断状态寄存器 DMA_ISR 的详细描述。
在这里插入图片描述

传输完成还分两种模式,是一次传输还是循环传输,一次传输很好理解,即是传输一次之后就停止,要想再传输的话,必须关断 DMA 使能后再重新配置后才能继续传输。循环传输则是一次传输完成之后又恢复第一次传输时的配置循环传输,不断的重复。

具体的由 DMA_CCRx 寄存器的CIRC 循环模式位控制。
在这里插入图片描述
在这里插入图片描述


http://www.ppmy.cn/devtools/150872.html

相关文章

ubuntu20.04中vscode配置django

1.下载插件 我用的是这两个 2.配置环境 Ubuntu20.04创建虚拟环境 python3 -m venv .venv 没有 venv 的记得装一下 sudo apt install python3.8-venv 装好之后,会出现 .venv 的文件夹 找一下 activate ,我的在 bin 里 按照提示 source bin/activate…

嵌入式无人机: 防止信号被有意干扰入侵策略

在嵌入式无人机项目中,防止信号被有意干扰或入侵是一个重要的安全问题。有效的防护措施可以从硬件、软件和通信协议等多个方面入手,确保系统的稳定性和安全性。以下是详细的防护策略: 1. 物理层保护 频率跳变(Frequency Hopping…

LeetCode 热题 100 | 普通数组

普通数组基础 动态规划五部曲: 1.确定dp数组的含义 2.递推公式 3.dp数组初始化 4.遍历顺序 5.模拟dp数组合并区间提前排序好数组轮转数组先翻转全部元素,再根据k % nums.length来翻转不同区间。前缀和,后缀和的提前计算。如果想省空间&#x…

funcaptcha手势指向验证码识别

注意,本文只提供学习的思路,严禁违反法律以及破坏信息系统等行为,本文只提供思路 如有侵犯,请联系作者下架 本文滑块识别已同步上线至OCR识别网站: http://yxlocr.nat300.top/ocr/other/21 该验证码会给出某物品所有的…

JAVA多线程学习

文章目录 线程相关概念线程创建继承Thread类Runnable接口多个线程同时操作同一个对象测试:实现callable接口(了解)静态代理lamda表达式 线程状态线程停止线程休眠线程礼让 线程相关概念 线程:是进程的一部分,一个进程之内的线程之间共享进程的…

基于禁忌搜索算法的TSP问题最优路径搜索matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于禁忌搜索算法的TSP问题最优路径搜索,旅行商问题(TSP)是一个经典的组合优化问题。其起源可以追溯到 19 世纪初,…

CSS3的aria-hidden学习

前言 aria-hidden 属性可用于隐藏非交互内容,使其在无障碍 API 中不可见。即当aria-hidden"true" 添加到一个元素会将该元素及其所有子元素从无障碍树中移除,这可以通过隐藏来改善辅助技术用户的体验: 纯装饰性内容,如…

【初识扫盲】厚尾分布

厚尾分布(Fat-tailed distribution)是一种概率分布,其尾部比正态分布更“厚”,即尾部的概率密度更大,极端值出现的概率更高。 一、厚尾分布的特征 尾部概率大 在正态分布中,极端值(如距离均值很…