当前位置: 首页 > news >正文

STM32的DMA技术介绍

DMA(Direct Memory Access,直接内存访问) 是一种允许外设直接与系统内存进行数据传输,而无需经过CPU的技术。在STM32微控制器中,DMA技术极大地提高了数据传输效率,降低了CPU的负担,从而提升系统整体性能。

1. DMA的基本概念
  • 工作原理:DMA控制器能够在外设和内存之间进行数据传输,而无需CPU介入。CPU只需初始化传输参数,DMA控制器便会自动完成数据传输任务。

  • 优点

    • 减轻CPU负担:CPU无需参与数据传输过程,可以处理其他任务,提高系统响应速度。
    • 高效的数据传输:DMA能够在总线空闲时进行数据传输,提高总线利用率。
    • 降低功耗:减少CPU的工作量,有助于降低系统功耗,尤其在低功耗应用中尤为重要。
2. STM32中的DMA模块

STM32系列微控制器通常集成多个DMA控制器,每个控制器包含多个DMA通道。不同的STM32系列(如F1、F4、L4等)在DMA模块的数量和功能上可能有所不同,但基本原理相似。

  • DMA控制器:负责管理多个DMA通道,协调数据传输任务。
  • DMA通道:每个通道可以独立配置,用于特定的外设或数据传输任务。
3. DMA的工作模式

STM32的DMA支持多种工作模式,以适应不同的应用需求:

  • 内存到内存模式(Memory-to-Memory):在两个内存区域之间传输数据,不经过外设。
  • 外设到内存模式(Peripheral-to-Memory):从外设(如USART、ADC)读取数据并存储到内存。
  • 内存到外设模式(Memory-to-Peripheral):从内存读取数据并传输到外设(如USART、DAC)。

此外,DMA还支持:

  • 循环模式(Circular Mode):数据传输完成后自动重新开始,适用于需要持续数据流的应用,如音频采集。
  • 双缓冲模式(Double Buffer Mode):使用两个内存缓冲区,交替进行数据传输,提高数据处理效率。
4. DMA的配置步骤

在STM32中配置DMA通常包括以下步骤:

  1. 启用DMA时钟:通过配置相应的时钟寄存器,确保DMA控制器的时钟信号开启。

    __HAL_RCC_DMA1_CLK_ENABLE();
    
  2. 配置DMA通道

    • 选择通道:根据外设选择合适的DMA通道。
    • 配置传输方向:内存到外设、外设到内存或内存到内存。
    • 数据大小:设置源和目的地的数据宽度(如8位、16位、32位)。
    • 传输模式:如普通模式或循环模式。
    • 优先级:设置通道优先级,决定在多个通道同时请求时的处理顺序。
    DMA_HandleTypeDef hdma;
    hdma.Instance = DMA1_Stream1;
    hdma.Init.Channel = DMA_CHANNEL_4;
    hdma.Init.Direction = DMA_MEMORY_TO_PERIPH;
    hdma.Init.PeriphInc = DMA_PINC_DISABLE;
    hdma.Init.MemInc = DMA_MINC_ENABLE;
    hdma.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
    hdma.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
    hdma.Init.Mode = DMA_NORMAL;
    hdma.Init.Priority = DMA_PRIORITY_LOW;
    HAL_DMA_Init(&hdma);
    
  3. 链接DMA与外设:将DMA通道与具体的外设进行绑定,如USART、ADC等。

    __HAL_LINKDMA(&huart, hdmatx, hdma);
    
  4. 配置中断(可选):根据需要配置DMA传输完成、半完成或错误中断,便于在传输完成后进行相应处理。

    HAL_NVIC_SetPriority(DMA1_Stream1_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(DMA1_Stream1_IRQn);
    
  5. 启动DMA传输:调用相应的HAL库函数或直接操作寄存器启动数据传输。

    HAL_DMA_Start_IT(&hdma, (uint32_t)source, (uint32_t)destination, data_length);
    
5. DMA在常见外设中的应用
  • USART(串口通信):通过DMA进行数据的发送和接收,可以实现高速数据传输,减少CPU的干预。

    HAL_UART_Transmit_DMA(&huart, buffer, length);
    HAL_UART_Receive_DMA(&huart, buffer, length);
    
  • ADC(模数转换器):使用DMA自动将ADC转换结果存储到内存,适合采集大量连续数据,如传感器数据采集。

    HAL_ADC_Start_DMA(&hadc, buffer, length);
    
  • SPI/I2C:通过DMA进行高速数据传输,适用于需要大量数据交换的应用,如存储设备通信。

6. DMA与中断的协同工作

虽然DMA能够独立完成数据传输,但通常会与中断机制结合使用,以实现更灵活和高效的系统设计。例如,当DMA传输完成时,可以触发中断,通知CPU进行后续处理,如数据解析或下一步操作。

void DMA1_Stream1_IRQHandler(void)
{HAL_DMA_IRQHandler(&hdma);
}void HAL_DMA_TxCpltCallback(DMA_HandleTypeDef *hdma)
{// 传输完成后的处理
}
7. DMA的注意事项
  • 内存对齐:某些DMA传输要求源地址和目的地址对齐,避免数据错误。
  • 缓存一致性:在使用带缓存的系统中,需确保缓存与内存的一致性,防止数据传输错误。
  • 优先级管理:合理设置DMA通道的优先级,避免高优先级通道频繁占用总线,导致低优先级任务延迟。
  • 资源冲突:确保多个DMA通道之间没有资源冲突,如同一外设的多次访问需合理分配通道。
8. 实际应用示例

使用DMA进行USART数据传输

以下是一个使用DMA进行USART数据发送和接收的简单示例:

  1. 初始化USART和DMA

    // USART初始化代码
    MX_USART2_UART_Init();// DMA初始化代码
    MX_DMA_Init();
    
  2. 发送数据

    uint8_t txBuffer[] = "Hello DMA!";
    HAL_UART_Transmit_DMA(&huart2, txBuffer, sizeof(txBuffer));
    
  3. 接收数据

    uint8_t rxBuffer[10];
    HAL_UART_Receive_DMA(&huart2, rxBuffer, sizeof(rxBuffer));
    
  4. 处理传输完成中断

    void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
    {// 发送完成后的处理
    }void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
    {// 接收完成后的处理
    }
    
9. 总结

DMA技术在STM32微控制器中扮演着至关重要的角色,通过高效的数据传输机制,显著提升了系统性能和响应速度。在实际应用中,合理配置和使用DMA,可以使系统设计更加优化,满足复杂和高性能的应用需求。掌握DMA的工作原理、配置方法及其在不同外设中的应用,是深入理解和高效使用STM32微控制器的重要步骤。

相关文章:

STM32的DMA技术介绍

DMA(Direct Memory Access,直接内存访问) 是一种允许外设直接与系统内存进行数据传输,而无需经过CPU的技术。在STM32微控制器中,DMA技术极大地提高了数据传输效率,降低了CPU的负担,从而提升系统…...

C++11 多线程编程-小白零基础到手撕线程池

提示:文章 文章目录 前言一、背景二、 2.1 2.2 总结 前言 前期疑问: 本文目标: 一、背景 来源于b站视频 C11 多线程编程-小白零基础到手撕线程池 学习来源:https://www.bilibili.com/video/BV1d841117SH/?p2&spm_id_f…...

智源研究院与百度达成战略合作 共建AI产研协同生态

2024年9月24日,北京智源人工智能研究院(简称“智源研究院”)与北京百度网讯科技有限公司(简称“百度”)正式签署战略合作协议,双方将充分发挥互补优势,在大模型等领域展开深度合作,共…...

Flask-SQLAlchemy:在Flask应用中优雅地操作数据库

在Python的Web开发领域,Flask是一个备受欢迎的轻量级Web框架,它以简洁、灵活而著称。而当我们需要在Flask应用中与数据库进行交互时,Flask-SQLAlchemy就成为了一个强大而便捷的工具。它将Flask的简洁性与SQLAlchemy的强大数据库抽象能力完美结…...

智能巡检机器人 数据库

智能巡检机器人AI智能识别。无需人工。只需后台监控结果即可!...

Spring AOP异步操作实现

在Spring框架中,AOP(面向切面编程)提供了一种非常灵活的方式来增强应用程序的功能。异步操作是现代应用程序中常见的需求,尤其是在处理耗时任务时,它可以帮助我们提高应用程序的响应性和吞吐量。Spring提供了一种简单的…...

【2006.07】UMLS工具——MetaMap原理深度解析

文献:《MetaMap: Mapping Text to the UMLS Metathesaurus》2006 年 7 月 14 日 https://lhncbc.nlm.nih.gov/ii/information/Papers/metamap06.pdf MetaMap:将文本映射到 UMLS 元数据库 总结 解决的问题 自动概念映射问题:解决如何将文本…...

ros2 colcon build 构建后,install中的local_setup.bash 和setup.bash有什么区别

功能概述 在 ROS2 中,colcon build是用于构建软件包的工具。构建完成后会生成install文件夹,其中的setup.bash和local_setup.bash文件都与环境设置相关,但存在一些区别。setup.bash 作用范围 setup.bash文件用于设置整个工作空间的环境变量。…...

Thymeleaf基础语法

Thymeleaf 是一种用于 Web 和非 Web 环境的现代服务器端 Java 模板引擎。它能够处理 HTML、XML、JavaScript、CSS 甚至纯文本。以下是 Thymeleaf 的一些基础语法&#xff1a; 1. 变量表达式 <!-- 显示变量的值 --> <p th:text"${name}">Default Name&l…...

spring cloud alibaba学习路线

以下是一条学习Spring Cloud Alibaba的路线&#xff1a; 一、基础前置知识 1. Java基础 熟练掌握Java语言特性&#xff0c;包括面向对象编程、集合框架、多线程等知识。 2. Spring和Spring Boot基础深入理解Spring框架&#xff0c;如依赖注入&#xff08;DI&#xff09;、控…...

基于 Seq2Seq 的中英文翻译项目(pytorch)

项目简介 本项目旨在使用 PyTorch 构建一个基于 Seq2Seq(编码器-解码器架构)的中英文翻译模型。我们将使用双语句子对的数据进行训练,最终实现一个能够将英文句子翻译为中文的模型。项目的主要步骤包括: 数据预处理:从数据集中提取英文和中文句子,并进行初步清洗和保存。…...

部标主动安全(ADAS+DMS)对接说明

1.前言 上一篇介绍了部标&#xff08;JT/T1078&#xff09;流媒体对接说明&#xff0c;这里说一下如何对接主动安全附件服务器。 流媒体的对接主要牵扯到4个方面&#xff1a; &#xff08;1&#xff09;平台端&#xff1a;业务端系统&#xff0c;包含前端呈现界面。 &#x…...

C++ STL(1)迭代器

文章目录 一、迭代器详解1、迭代器的定义与功能2、迭代器类型3、示例4、迭代器失效4.1、vector 迭代器失效分析4.2、list 迭代器失效分析4.3、set 与 map 迭代器失效分析 5、总结 前言&#xff1a; 在C标准模板库&#xff08;STL&#xff09;中&#xff0c;迭代器是一个核心概念…...

uview表单校验不生效问题

最近几次使用发现有时候会不生效&#xff0c;具体还没排查出来什么原因&#xff0c;先记录一下解决使用方法 <u--formlabelPosition"top"labelWidth"auto":model"form":rules"rules"ref"uForm" ><view class"…...

前端开发设计模式——单例模式

目录 一、单例模式的定义和特点&#xff1a; 1.定义&#xff1a; 2.特点&#xff1a; 二、单例模式的实现方式&#xff1a; 1.立即执行函数结合闭包实现&#xff1a; 2.ES6类实现&#xff1a; 三、单例模式的应用场景 1.全局状态管理&#xff1a; 2.日志记录器&#xff1a; …...

行情叠加量化,占据市场先机!

A股久违的3000点&#xff0c;最近都没有更新&#xff0c;现在终于对我们的市场又来点信息。相信在座的朋友这几天都是喜笑颜开&#xff0c;对A股又充满信心。当前行情好起来了&#xff0c;很多朋友又开始重回市场&#xff0c;研究股票学习量化&#xff0c;今天我们给大家重温下…...

大厂面试真题-ConcurrentHashMap怎么保证的线程安全?

ConcurrentHashMap是Java中的一个线程安全的哈希表实现&#xff0c;它通过一系列精妙的机制来保证线程安全。以下是ConcurrentHashMap保证线程安全的主要方式&#xff1a; 分段锁&#xff08;Segment Locking&#xff0c;Java 1.8之前&#xff09;&#xff1a; 在Java 1.8之前的…...

【RabbitMQ】消息堆积、推拉模式

消息堆积 原因 消息堆积是指在消息队列中&#xff0c;待处理的消息数量超过了消费者处理能力&#xff0c;导致消息在队列中不断堆积的现象。通常有以下几种原因&#xff1a; 消息生产过快&#xff1a;在高流量或者高负载的情况下&#xff0c;生产者以极高的速率发送消息&…...

MySQL常用SQL语句(持续更新中)

文章目录 数据库相关表相关索引相关添加索引 编码相关系统变量相关 收录一些经常用到的sql 数据库相关 建数据库 CREATE DATABASE [IF NOT EXISTS] <数据库名> [[DEFAULT] CHARACTER SET <字符集名>] [[DEFAULT] COLLATE <校对规则名>];例如&#xff1a; C…...

【更新】红色文化之红色博物馆数据集(经纬度+地址)

数据简介&#xff1a;红色博物馆作为国家红色文化传承与爱国主义教育的重要基地&#xff0c;遍布全国各地&#xff0c;承载着丰富的革命历史与文化记忆。本数据说明旨在汇总并分析全国范围内具有代表性的红色博物馆的基本信息&#xff0c;包括其地址、特色及教育意义&#xff0…...

变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析

一、变量声明设计&#xff1a;let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性&#xff0c;这种设计体现了语言的核心哲学。以下是深度解析&#xff1a; 1.1 设计理念剖析 安全优先原则&#xff1a;默认不可变强制开发者明确声明意图 let x 5; …...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局&#xff1a;PCB行业的时代之问 在数字经济蓬勃发展的浪潮中&#xff0c;PCB&#xff08;印制电路板&#xff09;作为 “电子产品之母”&#xff0c;其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透&#xff0c;PCB行业面临着前所未有的挑战与机遇。产品迭代…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统

医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上&#xff0c;开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识&#xff0c;在 vs 2017 平台上&#xff0c;进行 ASP.NET 应用程序和简易网站的开发&#xff1b;初步熟悉开发一…...

Debian系统简介

目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版&#xff…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器

——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的​​一体化测试平台​​&#xff0c;覆盖应用全生命周期测试需求&#xff0c;主要提供五大核心能力&#xff1a; ​​测试类型​​​​检测目标​​​​关键指标​​功能体验基…...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接&#xff1a;3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯&#xff0c;要想要能够将所有的电脑解锁&#x…...

C#学习第29天:表达式树(Expression Trees)

目录 什么是表达式树&#xff1f; 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持&#xff1a; 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...

省略号和可变参数模板

本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...

(一)单例模式

一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...

DAY 45 超大力王爱学Python

来自超大力王的友情提示&#xff1a;在用tensordoard的时候一定一定要用绝对位置&#xff0c;例如&#xff1a;tensorboard --logdir"D:\代码\archive (1)\runs\cifar10_mlp_experiment_2" 不然读取不了数据 知识点回顾&#xff1a; tensorboard的发展历史和原理tens…...