20、DMA----释放CPU压力,加快传输

1、DMA介绍

DMA,全称为:Direct Memory Access,即直接存储器访问。DMA传输方式无需CPU直接控制传输,也没有中断处理方式那样保留现场和恢复现场的过程,通过硬件为RAM与I/O设备开辟一条直接传送数据的通路,能使CPU的效率大为提高。

STM32F103内部有2个DMA控制器(DMA2仅存大容量产品中),DMA1有7个通道,DMA2有5个通道。每个通道专门用来管理来自于一个或多个外设对存储器访问的请求,一个仲裁器来协调各个DMA请求的优先权。

DMA有以下特性

  • 每个通道都直接连接专用的硬件DMA请求,每个通道都支持软件触发。通过软件来配置。
  • 优先权可以通过软件编程设置,有四个等级:很高、高、中、低,优先权相同时由硬件决定。
  • 独立源和目标数据区的传输宽度,可以根据字节、半字、全字,模拟打包和拆包过程。源和目标地址必须按照数据传输宽度对齐。
  • 支持循环的缓冲器管理。
  • 每个通道有3个事件标志:DMA半传输、DMA传输完成、DMA传输出错,3个事件标志逻辑或成为一个独立中断请求。
  • 存储器和存储器间的传输。
  • 外设和存储器,存储器和外设的传输。
  • 闪存、SRAM、外设SRAM、APB1、APB2、AHB外设都可以作为访问的源和目标。
  • 最大传输数目:65536

1.1、DMA框图

STM32F103ZET6有两个DMA控制器,DMA1和DMA2。

  • ①DMA请求: 外设想要通过DMA来传输数据,必须先给DMA控制器发送DMA请求,DMA收到请求信号后,控制器会给外设一个应答信号,当外设应答后且DMA控制器收到应答信号后,就会启动DMA传输,直到传输完毕。
  • ②通道:DMA具有12个独立可编程的通道,其中DMA1有7个通道,DMA2有5个通道,每个通道对应不同的外设的DMA请求。虽然每个通道可以接收多个外设的请求,但是同一时间只能接收一个,不能同时接收多个。
  • ③仲裁器:当发生多个DMA通道请求时,就会由仲裁器管理,仲裁器管理DMA通道请求分为两个阶段。第一阶段属于软件阶段,可以在DMA_CCRx寄存器中设置,有4个等级:非常高,高,中和低四个优先级。第二阶段属于硬件阶段,两个或以上的DMA通道请求设置的优先级一样,则他们优先级取决于通道编号,编号越低优先权越高,比如通道0高于通道1。DMA1控制器拥有高于DMA2控制器的优先级。

1.2、DMA请求映射表

2、DMA函数

DMA_HandleTypeDef结构体类型指针变量:

typedef struct __DMA_HandleTypeDef
{void                                *Instance;      /* 寄存器基地址 */DMA_InitTypeDef                     Init;           /* DAM 通信参数 */HAL_LockTypeDef                     Lock;           /* DMA 锁对象 */ __IO HAL_DMA_StateTypeDef           State;          /* DMA 传输状态 */ void                                *Parent;        /* 父对象状态,HAL库处理的中间变量 */ void(*XferCpltCallback)( struct __DMA_HandleTypeDef *hdma);    /*DMA传输完成回调*/ void(* XferHalfCpltCallback)( struct __DMA_HandleTypeDef * hdma);/* DMA一半传输完成回调 */void(* XferM1CpltCallback)( struct __DMA_HandleTypeDef * hdma); /* DMA传输完整的Memory1回调 */void(* XferM1HalfCpltCallback)( struct __DMA_HandleTypeDef * hdma);/* DMA传输半完全内存回调 */void(* XferErrorCallback)( struct __DMA_HandleTypeDef * hdma);/*DMA传输错误回调*/void(* XferAbortCallback)( struct __DMA_HandleTypeDef * hdma);/* DMA传输中止回调 */__IO uint32_t                       ErrorCode;              /* DMA存取错误代码 */DMA_TypeDef                         *DmaBaseAddress;        /* DMA通道基地址 */uint32_t                            ChannelIndex;           /* DMA通道索引 */ 
}DMA_HandleTypeDef;

  • Instance:是用来设置寄存器基地址,如果设置的对象是串口1的发送,串口1的DMA传输需要用到的是DMA1的通道4,即DMA1_Channel4。
  • Parent:是HAL库处理中间变量,用来指向DMA通道外设句柄。
  • XferCpltCallback:传输完成回调函数入口地址
  • XferHalfCpltCallback:半传输完成回调函数入口地址
  • XferM1CpltCallback:Memory1传输完成回调函数入口地址
  • XferErrorCallback:传输错误回调函数入口地址
  • Init:它是DMA_InitTypeDef结构体类型变量
typedef struct 
{    uint32_t Direction;               /* 传输方向,例如存储器到外设DMA_MEMORY_TO_PERIPH */  uint32_t PeriphInc;               /* 外设(非)增量模式,非增量模式DMA_PINC_DISABLE */   uint32_t MemInc;                  /* 存储器(非)增量模式,增量模式DMA_MINC_ENABLE */   uint32_t PeriphDataAlignment;     /* 外设数据大小:8/16/32位 */ uint32_t MemDataAlignment;        /* 存储器数据大小:8/16/32位 */ uint32_t Mode;                    /* 模式:循环模式/普通模式 */     uint32_t Priority;                /* DMA优先级:低/中/高/非常高 */  
}DMA_InitTypeDef;
  • HAL_StatusTypeDef HAL_DMA_Init(DMA_HandleTypeDef *hdma);DMA的初始化函数
  • __HAL_RCC_DMA1_CLK_ENABLE(); /* DMA1时钟使能 */ __HAL_RCC_DMA2_CLK_ENABLE(); /* DMA2时钟使能 */
  • __HAL_LINKDMA(&g_uart1_handler, hdmatx, g_dma_handle);连接DMA和外设句柄。
  • 外设的DMA发送、启动传输函数。
  • __HAL_DMA_GET_FLAG(&g_dma_handle, DMA_FLAG_TC4);查询DMA传输通道的状态
  • __HAL_DMA_GET_COUNTER(&g_dma_handle);获取当前传输剩余数据量
  • __HAL_DMA_SET_COUNTER (&g_dma_handle, 1000);设置对应的DMA数据流传输的数据量大小
  • DMA中断函数
    • DMA中断对于每个通道都有一个中断服务函数
    • HAL库提供了通用DMA中断处理函数HAL_DMA_IRQHandler, 在该函数内部,会对DMA传输状态进行分析,然后调用相应的中断处理回调函数:
      • 发送完成回调函数
      • 发送一般回调函数
      • 接收完成回调函数
      • 接收一半回调函数
      • 传输错误回调函数

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

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

相关文章

深入OpenHarmony OTA硬核升级

技术背景 OpenHarmony OTA(Over-The-Air)升级子系统为设备提供了远程升级能力,通过统一的升级接口屏蔽底层芯片差异,支持轻量系统、小型系统和标准系统的全量升级、差分升级和变分区升级。 核心特性 跨系统支持:覆盖轻量系统(Hi3861)、小型系统(Hi3516DV300)、标准系…

华为iVS1800接入SVMSPro平台

华为iVS1800接入SVMSPro平台 ** 华为好望Huawei HolosensIVS1800智能视频云平台采用首款昇腾310加持的嵌入式系统智能微边缘,独俱普惠AI鸿力。一台融合存储、计算、检索功能,满足小型园区、社区、银行网点、超市等场景安防需求,小机大智。 …

《异形战机2》v2.0.4数字豪华版,3D横版射击再临,机体武器海量升级

[游戏名称]: 《异形战机2》v2.0.4数字豪华版 [软件大小]: 17.7 GB [软件大小]: 夸克网盘 | 百度网盘 游戏介绍 《异形战机:最终版2》续作震撼登场!经典横版射击全面升级:3D 画面炫目、关卡与机体海量扩充,只为带来酣畅淋漓的灭…

Java 异常(Throwable)

1. Throwable Throwable: 所有异常和错误的根类。实现 Throwable 或其子类的对象才能被 throw 或 catch。 Error: 表示严重的系统级问题,通常不应该被捕获或处理,程序通常无法从中恢复。 Exception: 表示程序可以处理的问题。分为 运行时异常、 受检异常…

rocketmq常用命令

官方文档 https://rocketmq.apache.org/zh/docs/ https://rocketmq.apache.org/zh/docs/domainModel/02topic/ https://rocketmq.apache.org/zh/docs/4.x/deployment/02admintool 集群配置管理 https://mp.weixin.qq.com/s/688wNSwZPraGvAnr0K7hRw RocketMQ运维管理命令mqadm…

【C++详解】哈希表概念与实现 开放定址法和链地址法、处理哈希冲突、哈希函数介绍

文章目录一、unordered系列的使用unordered_set类的介绍unordered_set和set的使⽤差异unordered_map和map的使⽤差异unordered_xxx的哈希相关接⼝二、哈希表实现哈希概念直接定址法哈希冲突负载因⼦将关键字转为整数哈希函数除法散列法/除留余数法乘法散列法处理哈希冲突开放定…

电影感人文街拍摆摊纪实摄影后期Lr调色教程,手机滤镜PS+Lightroom预设下载!

调色介绍电影感人文街拍摆摊纪实摄影后期 Lr 调色是一种专注于捕捉街头生活烟火气的摄影风格,通过 Lightroom 后期调色赋予画面电影般的叙事感和情感深度。这种风格以摆摊小贩、市井行人、街头场景为主体,强调真实、自然的生活瞬间。调色核心在于低饱和暖…

【数据分享】298个地级市人工智能企业数量(1990-2023)

数据介绍引言人工智能产业作为数字经济的核心驱动力,其发展规模与分布格局深刻反映区域科技创新活力与产业升级潜力。为助力相关研究,本文分享一份涵盖全国 298 个地级市 1990-2023 年的人工智能企业核心数据,包含人工智能企业存量和人工智能…

LeetCode 面试经典 150_双指针_验证回文串(25_125_C++_简单)(双指针)

LeetCode 面试经典 150_数组/字符串_验证回文串(25_125_C_简单)题目描述:输入输出样例:题解:解题思路:思路一(双指针):代码实现代码实现(思路一(双…

无障碍辅助模块|Highcharts引领可访问数据可视化的交流

在现代数据可视化中,无障碍辅助技术已成为必不可少的一部分。对于视障人士或使用屏幕阅读器的用户来说,传统图表往往难以获取有效信息,而 Highcharts 在设计之初便充分考虑了无障碍体验。 Highcharts作为可访问数据可视化的倡导者&#xff0…

从0到1:数据库进阶之路,解锁SQL与架构的奥秘

目录一、SQL 基础启航1.1 SQL 基础语法1.2 SQL 进阶查询1.3 SQL 实战案例分析二、分库分表实战2.1 分库分表的背景与原理2.2 分库分表策略设计2.3 分布式 ID 生成2.4 数据迁移方案三、中间件实战3.1 中间件概述3.2 DBLE 中间件实战3.3 MyCat 中间件实战四、高可用架构搭建4.1 高…

【数据结构入门】排序算法(2):直接选择排序->堆排序

目录 1.直接选择排序 1.1 思想 1.2 代码 2.堆排序 2.1 向下调整算法 2.1.1 代码 2.2 建堆 2.2.1 代码 2.3 正式排序 2.3.1 代码 3. 冒泡排序 3.1 思路 3.1.1 单趟排序 3.1.2 多趟排序 3.1.3优化 3.2 代码 1.直接选择排序 1.1 思想 每次从未排序区中选择一个最小…

Fluent Bit系列:字符集转码测试(下)

#作者:程宏斌 文章目录fluent-bit 1.9.4 转换测试结论接上篇:《Fluent Bit系列:字符集转码测试(上)》https://blog.csdn.net/qq_40477248/article/details/150776142?spm1001.2014.3001.5501fluent-bit 1.9.4 转换测试…

redis-缓存-持久化

redis-缓存-持久化一、来因宫1、啥叫持久化?为何需要持久化?2、redis持久化方案2.1、RDB - 快照持久化A、定义原理B、快照生成流程:Copy-on-Write(写时复制)C、dump.rdb文件说明D、RDB 数据恢复流程E、RDB的优缺点2.2、…

C++11(Linux/GCC)字节序工具

#pragma once #include <cstdint> #include <climits> #include <type_traits> // 用于类型检查// 端序宏获取&#xff08;保持原有逻辑&#xff09; #if __has_include(<endian.h>)#include <endian.h> #elif __has_include(<bits/endian.h…

【MTCNN网络结构记忆卡片】--003nets.py

&#x1f9e0; MTCNN网络结构记忆卡片 &#xfffd;&#xfffd; 基础概念速查 &#x1f524; 库引入&#xff1a;import torch 和 import torch.nn as nn import torch # PyTorch深度学习框架 import torch.nn as nn # nn Neural Networks (神经网络)&#x1f3d7;️…

可视化-模块1-HTML-03

1.发现问题<p>大数据可视化技术及应用课程</p> <img src"pic/图片2.png" width"300" height"300"/><p></p><img />HTML 标签按闭合方式只分两类&#xff1a;双标签&#xff08;paired / container&#xff…

前端开发:详细介绍npm、pnpm和cnpm分别是什么,使用方法以及之间有哪些关系

目录 npm、pnpm和cnpm分别是什么 npm pnpm cnpm NPM包管理器 使用npm管理&#xff0c;创建/初始化项目 修改npm镜像&#xff08;npm源设置&#xff09; 基本命令 安装依赖项 下载特定版本的依赖 下载开发依赖 下载全局依赖&#xff08;全局安装&#xff09; 升级依赖项 根据依赖…

我们为你连接网络,安装驱动程序

Windows 11 家庭版/专业版在安装时默认要求联网&#xff0c;其实可以跳过。在这个联网界面按下 Shift F10 打开命令行。输入以下命令并回车&#xff1a;OOBE\BYPASSNRO系统会自动重启&#xff0c;回到联网界面。这时会多出一个 “我没有 Internet” 选项&#xff0c;点它&…

智慧交通夜间逆光误检率↓81.4%!陌讯多模态融合算法在主干道监测的落地优化

一、智慧交通视觉检测的行业痛点智慧交通作为城市基建的核心环节&#xff0c;其视觉检测系统&#xff08;车辆识别、车牌匹配、交通事件预警&#xff09;的可靠性直接影响通行效率与交通安全。但根据《2023 年中国智慧交通发展报告》数据&#xff0c;当前主流方案仍面临三大核心…