DMA学习笔记

参考文章

https://blog.csdn.net/as480133937/article/details/104927922

DMA简介

DMA,全称Direct Memory Access,即直接存储器访问。DMAC 即 DMA 控制器,提供了一种硬件的数据传输方式,无需 CPU 的介入,可以处理外设和存储器之间或者存储器和存储器之间的传输数据。因无 CPU 介入,从而使 CPU 可以专注在处理其他系统功能上。由此可以减轻CPU的负担,使得更多的CPU资源分配到其他的任务处理上面去。

主要配置参数

了解DMA是什么,以及为什么要使用DMA后,我们之后就是要知道如何去配置DMA,以及需要配置哪些参数。下面是一些主要需要配置的参数。

DMA的传输通道

不同单片机有不同的通道可供使用,结合实际资源参数进行选择。

目标外设和源外设号(有些可能是直接配置地址)

DMA的传输方式

  • 外设到内存
  • 内存到外设
  • 内存到内存
  • 外设到外设

数据传输宽度

这个可以根据实际需求配置成一个字节、半个字、全字这三种方式

  • DMA_SRC_WIDTH_BYTE    
  • DMA_SRC_WIDTH_HALF_WORD
  • DMA_SRC_WIDTH_WORD   

模式设置

  • 模式可以设置为正常模式(开启之后仅只传输一次)
  • 循环模式(会一直循环传输数据)

地址生成方式

所谓地址生成方式,就是看你使不使用,地址递增或者固定地址。也就是

固定模式和递增模式。

  • 在固定模式中,地址一直固定为初始化的基地址(DMACCxSrcAddr、 DMACCxDestAddr)。
  • 在递增模式中,下一次传输数据的地址是当前地址加 1(或者 2, 4),这个值取决于数据
  • 传输宽度

具体配置代码

void DMA_SPITransmit_Init(void)
{DMA_SPIT_Handle.Instance              = DMA_Channel1;DMA_SPIT_Handle.Init.Data_Flow        = DMA_DATA_FLOW_M2P;DMA_SPIT_Handle.Init.Request_ID       = REQ3_SPI2_SEND;DMA_SPIT_Handle.Init.Mode             = DMA_NORMAL;DMA_SPIT_Handle.Init.Source_Inc       = DMA_SOURCE_ADDR_INCREASE_ENABLE;DMA_SPIT_Handle.Init.Desination_Inc   = DMA_DST_ADDR_INCREASE_DISABLE;DMA_SPIT_Handle.Init.Source_Width     = DMA_SRC_WIDTH_BYTE;DMA_SPIT_Handle.Init.Desination_Width = DMA_DST_WIDTH_BYTE;/*-----------------------------------------------------------------------------------*//* Note:If user dons not apply interrupt, Set DMA_ITC_Callback?¢DMA_IE_Callback NULL *//*-----------------------------------------------------------------------------------*/DMA_SPIT_Handle.DMA_ITC_Callback = NULL;DMA_SPIT_Handle.DMA_IE_Callback  = NULL;HAL_DMA_Init(&DMA_SPIT_Handle);__HAL_LINK_DMA(SPI_Handle, HDMA_Tx, DMA_SPIT_Handle);
}

我这里使用的是SPI+DMA配置方式,单片机还是航芯的单片机,选择了寄存器地址(目标地址)不变,源地址(数据地址)递增,这样配置满足我们需求。然后传输完成回调函数和传输出错回调函数暂时没有配置。

DMA中断

每个 DMA 通道都有一个专用的中断。中断事件有两种类型:传输完成传输错误。 每一个中断事件在状态寄存器和清除寄存器中有专用的标志位。通过检测两种中断标志位可以获取我们DMA的传输情况。

__weak void HAL_DMA_IRQHandler(DMA_HandleTypeDef *hdma)
{uint32_t lu32_Channel_Index;/* Get DMA Channel number */lu32_Channel_Index = ((uint32_t)(hdma->Instance) - (uint32_t)(DMA_Channel0)) / 0x20;/* Channel has been interrupted */if (DMA->INT_STATUS & (1 << lu32_Channel_Index)){/* Transfer complete interrupt */if (DMA->INT_TC_STATUS & (1 << lu32_Channel_Index)){DMA->INT_TC_CLR |= (1 << lu32_Channel_Index);if (NULL != hdma->DMA_ITC_Callback){hdma->DMA_ITC_Callback();}}/* Transfer error interrupt */if (DMA->INT_ERR_STATUS & (1 << lu32_Channel_Index)){DMA->INT_ERR_CLR |= (1 << lu32_Channel_Index);if (NULL != hdma->DMA_IE_Callback){hdma->DMA_IE_Callback();}}}}

上面就是在触发中断后在中断函数中处理函数的中断程序,主要逻辑就是先获取哪个中断触发,然后判断触发源(传输完成或者传输错误)。

总结

DMA配置使用起来参数不多也比较简单,但是要真正使用并理解还是需要时间去消化。像之前不使用DMA不知道有啥作用,只模糊地知道可以帮CPU减负,导致很多情况下都乱用DMA。

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

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

相关文章

【LeetCode】九、双指针算法:环形链表检测 + 救生艇

文章目录 1、双指针算法1.1 对撞双指针1.2 快慢双指针 2、leetcode141&#xff1a;环形链表3、leetcode881&#xff1a;救生艇 1、双指针算法 用两个指针来共同解决一个问题&#xff1a; 1.1 对撞双指针 比如先有一个有序的数组array int[] array {1, 4, 5, 7, 9}先要找两个…

小程序-<web-view>嵌套H5页面支付功能

背景&#xff1a;小程序未发布前&#xff0c;公司使用vue框架搭建了管理系统&#xff0c;为了减少开发成本&#xff0c;微信提供了web-view来帮助已有系统能在小程序上发布&#xff0c;详见web-view | 微信开放文档。因公司一直未打通嵌套H5小程序的支付功能&#xff0c;导致用…

3D模型如何在力控组态中打开?---模大狮模型网

在展览3D模型设计行业中&#xff0c;力控组态是一个关键的技术应用。通过适当的力控组态&#xff0c;可以实现模型的互动性和真实感&#xff0c;提升展览效果和用户体验。本文将探讨如何在力控组态中打开和应用3D模型&#xff0c;从而达到更加生动和引人入胜的展示效果。 一、了…

WPF/C#:BusinessLayerValidation

BusinessLayerValidation介绍 BusinessLayerValidation&#xff0c;即业务层验证&#xff0c;是指在软件应用程序的业务逻辑层&#xff08;Business Layer&#xff09;中执行的验证过程。业务逻辑层是应用程序架构中的一个关键部分&#xff0c;负责处理与业务规则和逻辑相关的…

MySql Innodb 索引有哪些与详解

概述 对于MYSQL的INNODB存储引擎的索引&#xff0c;大家是不陌生的&#xff0c;都能想到是 B树结构&#xff0c;可以加速SQL查询。但对于B树索引&#xff0c;它到底“长”得什么样子&#xff0c;它具体如何由一个个字节构成的&#xff0c;这些的基础知识鲜有人深究。本篇文章从…

俄罗斯ozon运费计算工具,跨境电商ozon物流运费计算工具

OZON平台服装类目卖家而言&#xff0c;如何快速、准确地为产品定价&#xff0c;并有效管理运费成本&#xff0c;直接关系到市场竞争力与利润空间。接下来我们看看俄罗斯ozon运费计算工具&#xff0c;跨境电商ozon物流运费计算工具。 萌啦Ozon定价工具&#xff1a;智能模拟&…

你想活出怎样的人生?

hi~好久不见&#xff0c;距离上次发文隔了有段时间了&#xff0c;这段时间&#xff0c;我是裸辞去感受了一下前端市场的水深火热&#xff0c;那么这次咱们不聊技术&#xff0c;就说一说最近这段时间的经历和一些感触吧。 先说一下自己的个人情况&#xff0c;目前做前端四年&am…

day62--若依框架(基础应用篇)

若依搭建 若依版本 官方 若依官方针对不同开发需求提供了多个版本的框架&#xff0c;每个版本都有其独特的特点和适用场景&#xff1a; 前后端混合版本&#xff1a;RuoYi结合了SpringBoot和Bootstrap的前端开发框架&#xff0c;适合快速构建传统的Web应用程序&#xff0c;其…

Unity Shader 软粒子

Unity Shader 软粒子 前言项目Shader连连看项目渲染管线设置 鸣谢 前言 当场景有点单调的时候&#xff0c;就需要一些粒子点缀&#xff0c;此时软粒子就可以发挥作用了。 使用软粒子与未使用软粒子对比图 项目 Shader连连看 这里插播一点&#xff0c;可以用Vertex Color与…

XML简介XML 使用教程XML的基本结构XML的使用场景

学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……&#xff09; 2、学会Oracle数据库入门到入土用法(创作中……&#xff09; 3、手把手教你开发炫酷的vbs脚本制作(完善中……&#xff09; 4、牛逼哄哄的 IDEA编程利器技巧(编写中……&#xff09; 5、面经吐血整理的 面试技…

汽车IVI中控开发入门及进阶(三十三):i.MX linux开发之开发板

前言: 大部分物料/芯片,不管MCU 还是SoC,都会有原厂提供配套开发板,有这样一个使用原型,在遇到问题时或者进行开发时可以使用。 i.MX 8QuadXPlus MEK board: 1、要测试display显示器,可使用i.MX mini SAS将“LVDS1_CH0”端口连接到LVDS到HDMI适配器的cable。 2、要测试…

微服务部署上线过程总结

目录 一、找到适合自己的部署方式 二、开始部署&#xff0c;先安装需要的环境 2.1 梳理一下都需要安装什么软件 2.2 配置数据库环境 2.3 配置redis 2.4 配置nacos 2.5 配置rabbitmq 2.6 配置docker环境 三、环境配置好了&#xff0c;开始部署后端 3.1 梳理后端都…

仓库管理系统12--供应商设置

1、添加供应商窗体 2、布局控件UI <UserControl x:Class"West.StoreMgr.View.SupplierView"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:mc"http://…

使用python做飞机大战

代码地址: 点击跳转

【论文阅读】伸缩密度比估计:Telescoping Density-Ratio Estimation

文章目录 一、文章概览&#xff08;一&#xff09;问题提出&#xff08;二&#xff09;文章工作 二、判别比估计和密度鸿沟问题三、伸缩密度比估计&#xff08;一&#xff09;核心思想&#xff08;二&#xff09;路标创建&#xff08;三&#xff09;桥梁构建&#xff08;四&…

Linux 生产消费者模型

&#x1f493;博主CSDN主页:麻辣韭菜&#x1f493;   ⏩专栏分类&#xff1a;Linux初窥门径⏪   &#x1f69a;代码仓库:Linux代码练习&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多Linux知识   &#x1f51d; 前言 1. 生产消费者模型 1.1 什么是生产消…

每日一题——Python实现PAT乙级1005 继续(3n+1)猜想(举一反三+思想解读+逐步优化)五千字好文

一个认为一切根源都是“自己不够强”的INTJ 个人主页&#xff1a;用哲学编程-CSDN博客专栏&#xff1a;每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 我的写法 代码逻辑概述 时间复杂度分析 空间复杂度分析 总结 我要更强 代码优化点…

Nginx详解-安装配置等

目录 一、引言 1.1 代理问题 1.2 负载均衡问题 1.3 资源优化 1.4 Nginx处理 二、Nginx概述 三、Nginx的安装 3.1 安装Nginx 3.2 Nginx的配置文件 四、Nginx的反向代理【重点】 4.1 正向代理和反向代理介绍 4.2 基于Nginx实现反向代理 4.3 关于Nginx的location路径…

Jetson系列机载电脑创建热点模式配置方法

Jetson nano为例—— 创建热点模式配置方法 1.1、新建一个 WiFi 在屏幕右上角找到网络图标&#xff0c;点击后选择“Edit Connections”选项&#xff0c;进入选择网络连接页面&#xff0c;然后点击左下角加号&#xff0c;新建一个连接&#xff0c;类型选择 WiFi 后点击 “cre…

如何选择适合自己的巴比达内网穿透方案

选择适合自己的巴比达内网穿透方案&#xff0c;需要考虑几个关键因素&#xff0c;包括您的具体需求、安全性要求、技术水平以及预算。以下是一些选择巴比达内网穿透方案的建议步骤&#xff1a; 1. 确定需求和用途 首先&#xff0c;需要明确您希望通过内网穿透实现的具体目标和…