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。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

VS Code 常用快捷键大全

Visual Studio Code 是目前最好用的代码编辑器之一。它提供了许多开箱即用的功能以及丰富的第三方扩展&#xff0c;本文将分享常用的 VS Code 快捷键&#xff0c;助你提高开发效率&#xff01; 代码导航 跳转指定行&#xff1a;快速跳转到文件中的指定行&#xff0c;只需按下快…

从0开始transformer代码理解(附带调试和个人原理理解)

代码来源 本次代码来源自github https://github.com/graykode/nlp-tutorial 里面的5.1 transformer代码 本文目录 代码来源第一步 数据准备&#xff08;从main函数开始&#xff09;make_batch函数 **Transformer 主体函数定义代码**Encoder层词向量维度嵌入掩码部分实现多层e…

Linux运维之需掌握的基本Linux命令

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 目录 一、SHELL 二、执行命令 三、常用系统工作命令 四、系统状态检测命令 五、查找定位文件命令 六、文本文件编辑命令 七、文件目录管理命令…

echarts--Tree的label上添加图片

使用echarts的rich富文本&#xff0c;配合lable的formatter去实现 主要代码&#xff1a;label里 rich: {img1: {backgroundColor: {image: Cloudy,},height: 40}},formatter: function (param) {var res "";res {img1|} param.name;return res;}, 如果想要哪一节…

Python 生成Md文件带超链 和 PDF文件 带分页显示内容

software.md # -*- coding: utf-8 -*- import os f open("software.md", "w", encoding"utf-8") f.write(内部测试版2024 MD版\n) for root, dirs, files in os.walk(path): dax os.path.basename(root)if dax "":print("空白…

大模型补贴政策来了!!!

广州琶洲人工智能与数字经济试验区管理委员会 广州市海珠区科技工业商务和信息化局关于印发广州市海珠区建设人工智能大模型应用示范区实施细则的通知 各有关单位&#xff1a; 为进一步促进海珠区人工智能大模型产业发展&#xff0c;加快建设人工智能大模型应用示范区&#xf…

昇思MindSpore学习总结八——模型保存与加载

在训练网络模型的过程中&#xff0c;实际上我们希望保存中间和最后的结果&#xff0c;用于微调&#xff08;fine-tune&#xff09;和后续的模型推理与部署&#xff0c;接下来将介绍如何保存与加载模型。 1.构建模型 import numpy as np import mindspore from mindspore impo…

【RocketMQ】记录一次RocketMQ消费延迟问题排查思路

文章目录 背景问题排查Consumer负载均衡机制订阅关系的一致 背景 业务团队反馈使用我提供的RocketMQ集群&#xff0c;上游生产的消息&#xff0c;部分消息&#xff0c;消费程序需要等1分钟&#xff0c;甚至几分钟后&#xff0c;才能收到。 问题排查 见怪不怪&#xff0c;大部…

TapData 医疗美容行业数字化白皮书上线

随着颜值经济的发展&#xff0c;人们追求“美”的热情也不断高涨&#xff0c;而作为近年来被资本频频下注的赛道之一&#xff0c;医疗美容逐渐走进大众视野。 一方面&#xff0c;社会对外貌的重视程度不断提升&#xff0c;越来越多的人愿意通过医疗美容来提升自身形象&#xf…

后端加前端Echarts画图示例全流程(折线图,饼图,柱状图)

本文将带领读者通过一个完整的Echarts画图示例项目&#xff0c;演示如何结合后端技术&#xff08;使用Spring Boot框架&#xff09;和前端技术&#xff08;使用Vue.js或React框架&#xff09;来实现数据可视化。我们将实现折线图、饼图和柱状图三种常见的数据展示方式&#xff…

【python】PyQt5事件机制、定时器原理分析和实战演练

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

哨兵1SAR空间数据包协议数据单元文档(五)

《哨兵1SAR空间数据包协议数据单元》文档对数据包的结构进行了详细描述&#xff0c;并提供了用户数据的格式和解码算法。 原文链接: 哨兵1SAR空间数据包协议数据单元文档英文版 同系列中的其他文章篇链接: 哨兵1SAR空间数据包协议数据单元文档&#xff08;一&#xff09; 哨兵1…

亚太万人eVTOL展!2024深圳eVTOL将于9月登陆鹏城

2024年以来&#xff0c;北京、上海等十多个省市&#xff0c;先后发布了鼓励低空经济发展的行动方案&#xff0c;其中&#xff0c;eVTOL&#xff08;电动垂直起降航空器&#xff09;成为低空经济最火热的细分赛道。2023年&#xff0c;中国eVTOL产业规模达9.8亿元&#xff0c;同比…

【C++】相机标定源码笔记- RGB 相机与 ToF 深度传感器校准类

类的设计目标是为了实现 RGB 相机与 ToF 深度传感器之间的高精度校准&#xff0c;从而使两种类型的数据能够在同一个坐标框架内被整合使用。这在很多场景下都是非常有用的&#xff0c;比如在3D重建、增强现实、机器人导航等应用中&#xff0c;能够提供更丰富的场景信息。 -----…

64位Office API声明语句第120讲

跟我学VBA&#xff0c;我这里专注VBA, 授人以渔。我98年开始&#xff0c;从源码接触VBA已经20余年了&#xff0c;随着年龄的增长&#xff0c;越来越觉得有必要把这项技能传递给需要这项技术的职场人员。希望职场和数据打交道的朋友&#xff0c;都来学习VBA,利用VBA,起码可以提高…

工厂模式之简单工厂模式

文章目录 工厂模式工厂模式分为工厂模式的角色简单工厂模式案例代码定义一个父类&#xff0c;三个子类定义简单工厂客户端使用输出结果 工厂模式 工厂模式属于创造型的模式&#xff0c;用于创建对象。 工厂模式分为 简单工厂模式&#xff1a;定义一个简单工厂类&#xff0c;根…

Vue3的模板语法插值表达式用法

在template中输入“5 3” &#xff0c;是没有运算能力的&#xff0c;只会把字符直接显示出来&#xff0c;代码如下&#xff1a; <template><view>这是demo</view><view>5 3</view><navigator open-type"navigateBack"><vi…

永劫无间国服延迟高、报错、卡顿的处理措施一览

永劫无间国服延迟高、报错、卡顿怎么办&#xff1f;快速解决办法分享 第一个办法&#xff1a;改善延迟 如果是一直遇到永劫无间国服延迟高、报错、卡顿的问题&#xff0c;重启游戏也不管用的话&#xff0c;那应该就是网络问题&#xff0c;玩家可以启动雷神&#xff0c;让其快速…

服了!DELETE 同一行记录也会造成死锁!!

1 问题背景 “哥们&#xff0c;又双叒叕写了个死锁&#xff0c;秀啊&#xff01;&#x1f60f;” 就算是经常写死锁的同学看到估计都会有点懵&#xff0c;两条一模一样的 DELETE 语句怎么会产生死锁呢&#xff1f; 2 MySQL 锁回顾 看到这里的靓仔肯定对 MySQL 的锁非常了解&…

红酒与建筑:品味历史与艺术的交汇

在时间的长河中&#xff0c;红酒与建筑都是人类智慧的结晶&#xff0c;它们各自承载着历史的厚重与艺术的韵味。当这两者交汇时&#xff0c;仿佛是一场穿越时空的对话&#xff0c;将我们带入一个既古老又现代、既深沉又温柔的世界。今天&#xff0c;就让我们一起走进这个奇妙的…