STM32的DMA的五大问题

news2024/9/20 14:44:33

a2ef8aff3d5449a7ed1a6ddb550c2470.png

1,DMA控制器的内部结构

STM32中的DMA控制器是一种用于在外设和存储器之间传输数据的专用硬件。DMA控制器的内部结构主要包括以下几个关键部分:

通道: DMA控制器可以有多个通道,每个通道独立管理一个数据传输任务。通道的数量取决于具体的STM32型号,每个通道可以独立配置,使得DMA可以同时执行多个数据传输任务。

数据传输方向寄存器: 该寄存器用于配置数据传输的方向,可以设置为从外设到存储器(Memory-to-Memory)、从外设到存储器(Peripheral-to-Memory)、从存储器到外设(Memory-to-Peripheral)等不同方向。

地址寄存器: DMA控制器有两个地址寄存器,一个用于配置外设地址,另一个用于配置存储器地址。这些寄存器存储了传输数据的源地址和目的地址。

传输计数寄存器: 该寄存器用于设置传输的数据量,即希望传输的数据的数量。传输计数寄存器的值递减或递增,直到传输完成。

传输模式寄存器: DMA控制器支持不同的传输模式,例如循环模式、块传输模式、内存自增/自减等。传输模式寄存器用于配置这些传输模式。

优先级寄存器: 当多个通道同时请求DMA服务时,通过优先级寄存器可以配置通道的优先级。优先级高的通道将获得DMA控制权。

中断和事件寄存器: DMA控制器支持中断,用于在数据传输完成或发生错误时通知CPU。相关寄存器用于配置和监视中断和事件状态。

配置寄存器: DMA控制器有一些配置寄存器,用于配置DMA的工作模式、触发条件、错误处理等。

状态寄存器: 用于存储DMA通道的状态信息,例如传输完成、半传输等状态。

2,DMA处理过程

DMA的处理过程涉及以下几个关键步骤,这些步骤描述了DMA如何从源地址传输数据到目的地址,而无需CPU的干预:

通道配置: DMA控制器可以有多个通道,每个通道独立管理一个数据传输任务。首先,需要配置DMA通道,确定数据传输的方向、源和目的地址、传输数据量等参数。

源和目的地址设置: 配置DMA的源地址和目的地址,分别指定数据传输的起始点和目标存储位置。

传输数量设置: 配置传输计数寄存器,确定要传输的数据的数量。这个值在传输过程中递减或递增,直到传输完成。

传输模式设置: 配置传输模式寄存器,选择传输模式。常见的传输模式包括循环模式、块传输模式、内存自增/自减等。

启动DMA传输: 当DMA的配置完成后,通过软件或外部触发信号启动DMA传输。DMA控制器将开始在指定通道上执行数据传输任务。

数据传输: DMA控制器根据配置的参数,从源地址读取数据,然后将数据写入目的地址。这一过程在不需要CPU干预的情况下进行。

中断和事件处理: 如果配置了中断,DMA在传输完成时可以生成中断请求。CPU可以通过中断服务例程处理传输完成事件,执行相关的操作。另外,DMA还可以在传输完成或发生错误时生成事件,用于触发其他模块的操作。

传输结束: DMA控制器监视传输计数寄存器,当传输计数达到零时,传输完成。在某些情况下,可以在传输完成时产生传输完成事件,通知相关模块传输已经结束。

3,DMA中断

DMA中断是指在DMA(Direct Memory Access)传输过程中,当数据传输完成或者发生错误时,DMA控制器产生中断请求,通知CPU进行相应的处理。DMA中断允许CPU在数据传输阶段结束时或者在发生错误时执行特定的中断服务例程,以便对数据传输的完成状态进行处理或进行错误处理。

在使用DMA时,可以配置DMA中断,以便在以下情况之一发生时通知CPU:

传输完成中断: 当DMA传输的数据量达到设定值时,DMA控制器产生传输完成中断请求。这时,CPU可以执行相应的中断服务例程,处理传输完成后的操作,如数据处理、状态更新等。

半传输中断: 在一些DMA控制器中,还可以配置半传输中断,即在传输完成一半数据时产生中断请求。这对于一些特殊的数据传输场景可能会有用。

错误中断: 如果在DMA传输过程中发生错误,例如总线错误或存储器溢出,DMA控制器可以产生错误中断请求。CPU可以通过错误中断服务例程来处理这些错误,采取相应的措施。

DMA中断的使用可以提高系统的灵活性和可靠性。通过合理配置DMA中断,可以在不占用CPU时间的情况下及时获取数据传输的状态,进行相应的处理。配置DMA中断的具体步骤包括:

使能DMA中断: 在DMA控制寄存器中,通常有一个使能中断的位,设置为1表示允许产生中断。

配置中断优先级: 在中断控制器中,配置DMA中断的优先级,以确保在多个中断同时发生时,能够按照优先级顺序进行响应。

编写中断服务例程: CPU需要编写中断服务例程,以定义在中断发生时要执行的操作。这可以包括数据处理、状态更新、错误处理等。

4,DMA映射

DMA中断映射是指将DMA(Direct Memory Access)传输的中断请求映射到特定的中断线上,以便在中断控制器中进行管理和处理。在某些DMA控制器中,可以配置DMA中断映射,以确定DMA传输完成或发生错误时触发的中断是哪一个中断线上的中断。

为了更好地理解DMA中断映射,以下是一些相关的概念:

中断线: 中断线是连接外设或模块到中断控制器的通道。每个中断线上可以连接多个中断源,中断控制器可以通过中断优先级和中断屏蔽来决定哪个中断源获得服务。

DMA通道: DMA控制器有多个通道,每个通道负责一个数据传输任务。当数据传输完成或发生错误时,DMA通道可以产生中断请求。

DMA中断映射: DMA中断映射允许将DMA通道的中断请求映射到特定的中断线上。这样,CPU就可以通过中断控制器管理和处理DMA通道产生的中断。

中断控制器配置: 在某些STM32系列微控制器中,中断控制器(NVIC)提供了中断线的配置和管理功能。通过配置中断线,可以确定DMA中断映射到哪个中断线上,以及中断线的优先级等参数。

下面是一个简化的例子,说明DMA中断映射的可能配置:

#include "stm32f4xx_hal.h"


void DMA_Configuration(void) 
{    
  // 初始化 DMA 结构体    
  DMA_HandleTypeDef dma_handle;    
  dma_handle.Instance = DMA1_Stream0;    
  dma_handle.Init.Channel = DMA_CHANNEL_0;    
  dma_handle.Init.Direction = DMA_MEMORY_TO_MEMORY;    
  dma_handle.Init.PeriphInc = DMA_PINC_ENABLE;    
  dma_handle.Init.MemInc = DMA_MINC_ENABLE;    
  dma_handle.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;   
  dma_handle.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;    
  dma_handle.Init.Mode = DMA_NORMAL;    
  dma_handle.Init.Priority = DMA_PRIORITY_HIGH;    
  
  // 关联 DMA 句柄与 DMA 控制器    
  HAL_DMA_Init(&dma_handle);    
  
  // 关联 DMA 句柄与源、目的地地址    
  HAL_DMA_Start(&dma_handle, (uint32_t)sourceBuffer, (uint32_t)destinationBuffer, BUFFER_SIZE);    
  
  // 配置 DMA 中断映射    
  HAL_NVIC_SetPriority(DMA1_Stream0_IRQn, 0, 0);    
  HAL_NVIC_EnableIRQ(DMA1_Stream0_IRQn);
}

==========

往期回顾:

单片机的各个通信协议的波特率

C语言有哪些预处理操作?

面试题--函数指针的五大作用

卡尔曼滤波的原理和C代码

中值滤波的原理和C代码

==========

5dc01151fd0d5b1fd0f5bf89f7e50e5c.png

681faa0e34e2ca24127ddc6826607ec5.png

a2c09eed650ce559c7ac1de18b43c213.png

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

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

相关文章

【解决】Windows 11检测提示电脑不支持 TPM 2.0(注意从DTPM改为PTT)

win11升级,tpm不兼容 写在最前面1. 打开电脑健康状况检查2. 开启tpm3. 微星主板AMD平台开启TPM2.0解决电脑健康状况检查显示可以安装win11,但是系统更新里显示无法更新 写在最前面 我想在台式电脑上用win11的专注模式,但win10不支持 1. 打…

[论文精读] 使用扩散模型生成真实感视频 - 【李飞飞团队新作,文生视频 新基准】

论文导读: 论文背景:2023年12月11日,AI科学家李飞飞团队与谷歌合作,推出了视频生成模型W.A.L.T(Window Attention Latent Transformer)——一个在共享潜在空间中训练图像和视频生成的、基于Transformer架构的扩散模型。李飞飞是华…

本地 SIEM 与云原生 SIEM:哪一种适合您?

安全信息和事件管理 (SIEM) 解决方案对于各种规模的组织监控其环境中的安全威胁至关重要。 SIEM 解决方案收集并审查来自不同来源(例如防火墙、入侵检测系统和 Web 服务器)的安全日志。随后可以利用这些数据来检测潜在威胁、检查安全事件并针对网络攻击…

ELADMIN - 免费开源 admin 后台管理系统,基于 Spring Boot 和 Vue ,包含前端和后端源码

一款简单好用、功能强大的 admin 管理系统,包含前端和后端源码,分享给大家。 ELADMIN 是一款基于 Spring Boot、Jpa 或 Mybatis-Plus、 Spring Security、Redis、Vue 的前后端分离的后台管理系统。 ELADMIN 的作者在 Github 和 Gitee 上看了很多的项目&…

什么是FPGA原型验证?

EDA工具的使用主要分为设计、验证和制造三大类。验证工作贯穿整个芯片设计流程,可以说芯片的验证阶段占据了整个芯片开发的大部分时间。从芯片需求定义、功能设计开发到物理实现制造,每个环节都需要进行大量的验证。 现如今验证方法也越来越多&#xff…

链路追踪详解(四):分布式链路追踪的事实标准 OpenTelemetry 概述

目录 OpenTelemetry 是什么? OpenTelemetry 的起源和目标 OpenTelemetry 主要特点和功能 OpenTelemetry 的核心组件 OpenTelemetry 的工作原理 OpenTelemetry 的特点 OpenTelemetry 的应用场景 小结 OpenTelemetry 是什么? OpenTelemetry 是一个…

Java常用注解

文章目录 第一章、Java注解与元数据1.1)元数据与注解概念介绍1.2)Java注解的作用和使用1.3)注解的分类 第二章、Mybatis框架常用注解2.1)Mybatis注解概览2.2)常用注解MapperScanMapperSelectInsertUpdateDeleteParam结…

mysql的负向条件查询会不会使用索引

mysql的负向条件查询,例如not in,会不会使用索引? 其实,mysql还是会尽量利用索引。如果查询的列上有索引,并且索引能够覆盖查询所需的列,那么mysql可能会使用索引来获取结果,而不是进行全表扫描…

CentOS 7 部署frp穿透内网

本文将介绍如何在CentOS 7.9上部署frp,并通过示例展示如何配置和测试内网穿透。 文章目录 (1)引言(2)准备工作(4)frps服务器端配置(5)frpc客户端配置(6&#…

从零到一:influxdb时序性数据库的基本概念与操作指南

目录 ​编辑 引言 数据库(database) 创建数据库 删除数据库 进入数据库 展示influxdb中所有数据库 测量(measurement) 写入测量 展示测量 总结 引言 InfluxDB是一个开源的时序数据库,专门设计用于处理时间序列数据。它是由InfluxD…

052:vue重新发布,软件热更新方面的一点经验示例

第052个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下,本专栏提供行之有效的源代码示例和信息点介绍,做到灵活运用。 (1)提供vue2的一些基本操作:安装、引用,模板使…

Excel: Python 如何干掉 VBA 系列 乙

以下内容为本人的学习笔记,如需要转载,请声明原文链接 微信公众号「ENG八戒」https://mp.weixin.qq.com/s/k2XtfXS3GUt4r2QhizMOVg 创建工作表格 创建表格 xlwings 就可以协助创建插入了宏的 excel 表格。 先找到一个心满意足的目录,一般我…

随记-nginx docker + SSL 配置 - 配置等资源挂宿主机

随记-Nginx docker SSL 配置 - 配置等资源挂宿主机等 笔者动手配置,随手写的笔者,保证可操作 话说现在padmon是不是已经有代替docker的趋势了,谁能告诉我一把? 配置前准备 # 拉取nginx镜像 docker pull nginx #启动(暂时) doc…

DevEco Studio 鸿蒙(HarmonyOS)项目结构

DevEco Studio 鸿蒙(HarmonyOS)项目结构 一、操作环境 操作系统: Windows 10 专业版 IDE:DevEco Studio 3.1 SDK:HarmonyOS 3.1 二、项目结构 创建简单的Hello World移动应用项目结构如下图 由上到下说明各个文件夹的作用 .hvigor:存…

【已解决】ModuleNotFoundError: No module named ‘tensorflow‘

问题描述 Traceback (most recent call last): File "dataset_tool.py", line 16, in <module> import tensorflow as tf ModuleNotFoundError: No module named tensorflow 如果直接pip install tensorflow&#xff0c;还会报错 解决办法 方法一 pip i…

【华为数据之道学习笔记】4-3信息架构建设核心要素:基于业务对象进行设计和落地

4.3.1 按业务对象进行架构设计 业务对象是指业务领域中重要的人、事、物对象。业务对象承载了业务运作和管理涉及的重要信息&#xff0c;是信息架构中最重要的管理要素。 业务对象同时还是业务和IT的关键连接点&#xff0c;也是实现IA&#xff08;信息架构&#xff09;、BA&…

IntelliJ IDEA 自带HTTP Client接口插件上传文件示例

如何使用IntelliJ IDEA自带的HTTP Client接口插件进行文件上传的示例。在这个示例中&#xff0c;我们将关注Controller代码、HTTP请求文件&#xff08;xxx.http&#xff09;&#xff0c;以及文件的上传和处理。 Controller代码 首先&#xff0c;让我们看一下处理文件上传的Co…

持续集成交付CICD:Jenkins使用GitLab共享库实现自动上传前后端项目Nexus制品

目录 一、实验 1.GitLab本地导入前后端项目 2.Jenkins新建前后端项目流水线 3.Sonarqube录入质量阈与质量配置 4.修改GitLab共享库代码 5.Jenkins手动构建前后端项目流水线 6.Nexus查看制品上传情况 7.优化代码获取RELEASE分支 8.优化Jenkins流水线项目名称 一、实验 …

SpringBoot对PDF进行模板内容填充、电子签名合并

1. 依赖引入–这里只包含额外引入的包 原有项目包不含括在内 <!-- pdf编辑相关--> <dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.13.3</version> </dependency><de…

【ARM Trace32(劳特巴赫) 使用介绍 6 -- 通用寄存器查看与修改】

请阅读【Trace32 ARM 专栏导读】 文章目录 通用寄存器查看与修改Rester 命令语法Register.InitRegister.RELOAD高亮显示Register变化的值多核寄存器显示设置寄存器的值修改 通用寄存器查看与修改 在使用Trace32进行调试时&#xff0c;有时候需要查看并修改通用寄存器、PC指针、…