当前位置: 首页 > article >正文

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

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

DMA的基础知识与用法

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

二、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.kler.cn/a/500964.html

相关文章:

  • 后端Java开发:第十二天
  • ARP-Batch-Retargeting 部署实战
  • 计算机网络之---TCP连接管理
  • springCloud特色知识记录(基于黑马教程2024年)
  • JavaScript 学习总结
  • Java设计模式 —— 【行为型模式】命令模式(Command Pattern) 详解
  • el-table横向滚动条,滚动后消失
  • 解锁动态规划的奥秘:从零到精通的创新思维解析(5)
  • MathBuddyGUI:带控制系统仿真功能、积分运算的计算器,MATLAB课程设计
  • Golang笔记——Interface类型
  • Audio音频输出通道
  • defineProps 和 Pinia 的使用方法和区别总结
  • Mac Mini 最优雅的备份方式:使用极空间实现自动整机备份
  • 基于ILI9341液晶屏+STM32U5单片的显示试验
  • OKR 极简史及理解
  • 无需昂贵GPU:本地部署开源AI项目LocalAI在消费级硬件上运行大模型
  • 【Java】归并排序原理 / 实现过程
  • Windows自动化Python pyautogui RPA操作
  • 关于智能个人生活助手的一些想法
  • 【redis】ubuntu18安装redis7
  • MySQL数据导出导入
  • 动态规划七——背包问题
  • 【Redis学习 | 第5篇】Redis缓存 —— 缓存的概念 + 缓存穿透 + 缓存雪崩 + 缓存击穿
  • git问题
  • 详细全面讲解C++中重载、隐藏、覆盖的区别
  • SpringCloud微服务学习笔记(三)_RabbitMQ