【STM32学习】直接存储器访问——DMA

2023-05-16

【STM32学习】直接存储器访问——DMA

  • 零、参考
  • 一、对DMA的理解
  • 二、DMA通道优先级
  • 三、DMA通道x传输数量寄存器(DMA_CNDTRx)
  • 四、DMA缓冲区设计

零、参考

一个严谨的STM32串口DMA发送&接收(1.5Mbps波特率)机制
【组件】通用环形缓冲区模块

上述是我的参考链接,对理解DMA发送与接受,以及缓冲区的使用非常有帮助。
建议将代码通读,而不仅仅是使用。

一、对DMA的理解

这里用大白话,描述一下个人对DMA的理解。
即不用在CPU干预的情况下 ,DMA能将外设与内存之间的数据进行直接交换,也就是DMA能直接将内存中的数据发送至外设接口,或者从外设接口接收数据放到内存中。
对于发送(内存到外设),我们只需要启动DMA发送(每次发送都需要启动),然后CPU就能去干别的事情了,整个发送过程由DMA处理,不占用CPU,当数据发送完毕时,会触发传输完成的终端,我们再处理即可。
对于接收(外设到内存),我们只需要配置一次DMA接收,当外设数据到来时,我们根本不会察觉到,因为CPU根本就不鸟它,数据会被直接放到我们设置的内存中。只有当接收的数据半满或者全满时,触发中断,我们才能感知到。

二、DMA通道优先级

在这里插入图片描述
在这里插入图片描述

上述是STM32F103RBT6的DMA通道接口图。
可以看到一共有7个通道,每个通道有几个请求,同一个通道在同一时间,只能相应一个请求。
这么多个通道同一时间也只能有一个通道能进行DMA传输。
这就涉及到了优先级问题。
优先级控制由仲裁器进行管理:先看软件配置的等级,谁高谁就先传输;如果软件等级相同,那就看硬件,谁的通道号小,谁就先传输。
在这里插入图片描述

三、DMA通道x传输数量寄存器(DMA_CNDTRx)

在这里插入图片描述

该寄存器只能在通道不工作的时候,才能写入。
如果该寄存器需要修改了,我们可以停止该通道,然后重新配置,再使能即可。

这个寄存器的数值到底代表了什么?
对于发送(内存到外设),我们一般会将内存的大小,放入这个寄存器中。当启动DMA发送,每传输一个数据,这个寄存器的数值就减少一;例如,假设内存大小为128,我们要将这128个数据全部发送,需要将128写入到该寄存器,然后启动DMA发送。每当内存到外设传输一个数据,该寄存器就减一。比如已经发送了20个数据,那么我们查询还有多少数据没有发送呢?就是CNDTR(剩余多少个数据没发送)。当数据发送了一半或者数据发送完毕,分别会触发DMA传输半满和全满中断。
对于接收(外设到内存),我们一般会将内存的大小,放入这个寄存器中。DMA接收时,CPU是无感知的,是直接往该内存中存放的。每当DMA接收一个数据,该寄存器中的数值就减少一;例如;假设内存大小为128,当DMA接收了100个时,CNDTR中的数据为128-100=28,表示还有多少个数据没有接收到。当数据接收了内存大小的一半或者全部,分别会触发DMA传输半满和全满终端。

DMA传输半满和全满的判断标准是以CNDTR寄存器中的数据为标准的。

在一个问题是:该寄存器中的这一句话的意思是什么?“数据传输结束后,寄存器的内容或者变为0;或者当该通道配置为自动重加载模式时,寄存器的内容将被自动重新加载为之前配置时的数值。”。
在这里插入图片描述
自动重加载模式好比就是循环工作模式

四、DMA缓冲区设计

对于接收而言,如果外设交互速度很快,DMA设置的内存中的数据,如果没有及时取出的话,就被覆盖掉。所以,需要设立缓冲区,为CPU处理数据提供空当;当然,如果CPU处理缓冲区的数据很慢的话,数据也是会被覆盖掉的。
这里常用就是利用半满和全满中断的双缓冲机制,大家可以看我参考的链接,十分值得学习。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【STM32学习】直接存储器访问——DMA 的相关文章

随机推荐

  • 张量的通俗理解

    1 关于张量的四种定义 张量 在不同的运用场景下有不同的定义 xff08 1 xff09 张量是多维数组 xff0c 这个定义常见于各种人工智能软件 听起来还好理解 xff08 2 xff09 张量是某种几何对象 xff0c 不会随着坐标系
  • 如何搭建node_exporter

    如何搭建node exporter 1 观看条件 1 假设你已经看过上一篇文章 如何搭建普罗米修斯 Prometheus 2 假设你已经会搭建普罗米修斯 xff08 promethus xff09 3 上面两个假设 xff0c 只要满足一个
  • python类中初始化形式:def __init__(self)和def __init__(self, 参数1,参数2,···,参数n)区别

    前言 这两种初始化形式 xff0c 就类似于C 43 43 类中的构造函数 形式1 def init self span class token keyword class span span class token class name
  • Go语言操作grpc详细使用

    Go语言操作grpc详细使用 零 参考链接一 protobuf的详细使用二 grpc与protobuf的go文件的生成1 安装两个插件2 写proto文件3 编译proto文件 xff0c 生成go文件 三 grpc的详细使用1 一元RPC
  • Steghide使用教程及其密码爆破

    Steghide使用教程及其密码爆破 工具介绍 Steghide是一款开源的隐写术软件 xff0c 它可以让你在一张图片或者音频文件中隐藏你的秘密信息 xff0c 而且你不会注意到图片或音频文件发生了任何的改变 而且 xff0c 你的秘密文
  • 一道Gloang并发、锁的面试题,你会吗?

    Gloang并发 锁的面试题 1 题目描述2 问题分析2 1问题一2 2问题二2 3问题三2 4问题四2 5问题五 3 问题解决方法4 代码实现4 1 map前后加锁的方式4 2 sync map解决方式 1 题目描述 源地址 xff1a
  • 阿里云、腾讯云centos7安装mysql

    阿里云 腾讯云centos7安装mysql 1 下载2 解压与准备3 安装4 配置4 1配置数据库4 2查看默认密码4 3启动mysql4 4设置密码 5 开启远程登录5 1开放3306端口5 2开启远程登录6 参考链接 1 下载 镜像网站
  • go语言gin、net/http的优雅关机

    gin net http的优雅关机 什么是优雅关机 xff1f 优雅关机的实现参考链接 什么是优雅关机 xff1f http server运行过程中 xff0c 若进程被关闭 xff0c 那么正在处理的请求可能只被处理了一半就停止了 xff
  • C语言不详细记录

    C记录 1 内存管理2 结构体内存对其规则3 字符串函数4 二维数组5 const 指针6 字符串7 图片记录8 函数指针 1 内存管理 C语言内存讲解 详说内存分布和heap空间 2 结构体内存对其规则 C语言结构体对齐规则 C语言 结构
  • 【web压测】压测常用工具、压测指标到底是什么?

    压测常用工具 压测指标到底是什么 xff1f 一 压测指标 I1 QPS xff0c 每秒查询2 TPS xff0c 每秒事务3 RT xff0c 响应时间 二 压测指标 II三 压测工具1 ab2 go wrk 在window上压测 一
  • C语言结构体字节对其规则简述

    C语言结构体字节对其规则简述 规则描述示例示例一示例二 字节对齐规则 xff0c 一直不是很理解 xff0c 网上的答案也是参差不齐 规则描述 首先 xff0c 预处理指令 pragma pack n 可以改变默认对齐数进行字节对齐 n 取
  • 【STM32学习】SysTick定时器(嘀嗒定时器)

    SysTick定时器 一 参考资料二 时钟源选择与定时时间计算1 时钟源选择2 定时时间计算 三 SysTick Handler中断服务函数 一 参考资料 嘀嗒定时器 xff1a 时钟源 寄存器 二 时钟源选择与定时时间计算 结合正点原子的
  • 【STM32学习】GPIO口的八种工作模式

    GPIO口的八种工作模式 一 参考资料二 GPIO八种模式1 输入模式2 输出模式 三 施密特触发器1 电路2 电路计算 一 参考资料 GPIO原理图详解 强烈建议观看 xff1a GPIO为什么这样设计 xff1f 施密特触发器 原理 施
  • 【STM32学习】WWDG窗口看门狗

    STM32学习 WWDG窗口看门狗 x1f415 1 图展示WWDG原理2 复位 中断条件3 溢出时间计算4 与独立看门狗 x1f415 的对比 1 图展示WWDG原理 2 复位 中断条件 产生复位的情况 xff1a 当递减计数器数值递减到
  • 【STM32学习】时钟配置详解

    STM32学习 时钟配置详解 看懂时钟图结合代码外部高速时钟修改 看懂时钟图 在刚开始学习32的时候 xff0c 并不会在意这些 xff0c 或者即使看了也看的不是很明白 随着学习的深入 xff0c 我们发现看门狗 定时器 ADC很多外设都
  • vnc远程访问ubuntu18.04桌面系统 vncserver开机自启动

    文章目录 一 windows端准备二 ubuntu端准备三 远程连接桌面四 配置vncserver开机自启动 一 windows端准备 下载TightVNC xff1a https www tightvnc com 二 ubuntu端准备
  • 【STM32学习】定时器寄存器配置、功能工作过程详解

    STM32学习 定时器寄存器配置 功能工作过程详解 零 参考一 引言二 功能以及寄存器说明1 最基本的定时功能 xff08 时基单元 xff09 1 1 框图1 2 工作流程1 3 寄存器介绍1 3 1 CR1寄存器1 3 2 CNT PS
  • 【STM32学习】实时时钟 —— RTC

    STM32学习 实时时钟 RTC 零 参考一 工作原理1 RTC介绍2 工作过程 二 相关寄存器三 代码说明1 rtc初始化2 关于中断3 中断配置代码 xff08 仅供参考 xff09 3 1 秒中断 43 普通闹钟功能3 2 待机模式唤
  • 【JLink仿真器】盗版检测、连接故障、检测不到芯片问题

    JLink仿真器 盗版检测 连接故障 检测不到芯片问题 一 问题描述二 解决方法1 降低驱动 xff08 解决非法问题以及连接故障 xff09 2 SWD引脚被锁 xff08 解决检测不到芯片 xff09 三 说明 一 问题描述 盗版检测
  • 【STM32学习】直接存储器访问——DMA

    STM32学习 直接存储器访问 DMA 零 参考一 对DMA的理解二 DMA通道优先级三 DMA通道x传输数量寄存器 DMA CNDTRx 四 DMA缓冲区设计 零 参考 一个严谨的STM32串口DMA发送 amp 接收 xff08 1 5