【温酒笔记】DMA

STM32——DMA知识点及实战总结 DMA,全称Direct Memory Access,即直接存储器访问。DMA传输 将数据从一个地址空间复制到另一个地址空间。注意:DMA传输无需CPU直接控制传输。 阅读详情

参考文档:野火STM32F103
网友资料整理

1. Direct Memory Access-直接内存访问

DMA控制器独立于内核
是一个单独的外设

  • DMA1有7个通道
  • DMA2有5个通道
  • DMA有四个等级,非常高,高,中,低四个优先级
  • 如果优先等级相同,通道编号越小优先级越高
  • 数据流向: 存储器到存储器,存储器到外设,外设到存储器
  • 单次传输或循环传输
  • 传输过半中断,传输完成中断,传输错误中断

2. 串口示例

  1. 初始化

// 定义一个GPIO初始化结构体,并初始化为0
GPIO_InitTypeDef GPIO_InitStruct = {0};

// 检查当前USART实例是否为USART1
if(uartHandle->Instance==USART1)
{
  // 用户自定义代码区域开始(USART1_MspInit 0)
  /* USER CODE BEGIN USART1_MspInit 0 */

  // 用户自定义代码区域结束(USART1_MspInit 0)
  /* USER CODE END USART1_MspInit 0 */

  // 使能USART1时钟
  __HAL_RCC_USART1_CLK_ENABLE();

  // 使能GPIOA时钟
  __HAL_RCC_GPIOA_CLK_ENABLE();

  // USART1 GPIO配置说明
  /**USART1 GPIO Configuration
  PA9     ------> USART1_TX
  PA10     ------> USART1_RX
  */

  // 配置GPIO引脚
  GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10; // 选择PA9和PA10引脚
  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;       // 设置为复用推挽输出模式
  GPIO_InitStruct.Pull = GPIO_NOPULL;           // 不使用上拉或下拉电阻
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; // 设置最高频率
  GPIO_InitStruct.Alternate = GPIO_AF4_USART1;  // 选择USART1复用功能
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);       // 初始化GPIO

  // USART1 DMA初始化
  // USART1_TX DMA通道初始化
  hdma_usart1_tx.Instance = DMA1_Channel2;      // 选择DMA1通道2
  hdma_usart1_tx.Init.Request = DMA_REQUEST_3;  // 选择DMA请求3
  hdma_usart1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH; // 数据传输方向:内存到外设
  hdma_usart1_tx.Init.PeriphInc = DMA_PINC_DISABLE;     // 禁用外设地址递增
  hdma_usart1_tx.Init.MemInc = DMA_MINC_ENABLE;         // 启用内存地址递增
  hdma_usart1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; // 外设数据对齐方式:字节
  hdma_usart1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;   // 内存数据对齐方式:字节
  hdma_usart1_tx.Init.Mode = DMA_NORMAL;                 // 设置为普通模式
  hdma_usart1_tx.Init.Priority = DMA_PRIORITY_LOW;       // 设置优先级为低
  if (HAL_DMA_Init(&hdma_usart1_tx) != HAL_OK)           // 初始化DMA
  {
    Error_Handler();                                     // 如果初始化失败,调用错误处理函数
  }

  // 将DMA与USART1_TX关联
  __HAL_LINKDMA(uartHandle,hdmatx,hdma_usart1_tx);

  // USART1中断初始化
  HAL_NVIC_SetPriority(USART1_IRQn, 2, 0);               // 设置USART1中断优先级
  HAL_NVIC_EnableIRQ(USART1_IRQn);                       // 使能USART1中断

  // 用户自定义代码区域开始(USART1_MspInit 1)
  /* USER CODE BEGIN USART1_MspInit 1 */

  // 用户自定义代码区域结束(USART1_MspInit 1)
  /* USER CODE END USART1_MspInit 1 */
}
  1. DMA发送

  /* USART1 向 DMA发出TX请求 */
     HAL_UART_Transmit_DMA(&UartHandle, (uint8_t *)SendBuff ,SENDBUFF_SIZE);
  1. 使用DMA传输完成中断
//初始化
void MX_DMA_Init(void)
{
  // 使能DMA控制器时钟
  __HAL_RCC_DMA1_CLK_ENABLE();

  // DMA中断初始化
  // 配置DMA1通道2和3的中断
  HAL_NVIC_SetPriority(DMA1_Channel2_3_IRQn, 2, 0); // 设置DMA1通道2和3中断的优先级为2,子优先级为0
  HAL_NVIC_EnableIRQ(DMA1_Channel2_3_IRQn);         // 使能DMA1通道2和3的中断
}
//中断服务函数
/**
  * @brief This function handles DMA1 channel 2 and channel 3 interrupts.
  */
void DMA1_Channel2_3_IRQHandler(void)
{
  /* USER CODE BEGIN DMA1_Channel2_3_IRQn 0 */

  /* USER CODE END DMA1_Channel2_3_IRQn 0 */
  HAL_DMA_IRQHandler(&hdma_usart1_tx);
  /* USER CODE BEGIN DMA1_Channel2_3_IRQn 1 */

  /* USER CODE END DMA1_Channel2_3_IRQn 1 */
}
//中断回调函数-打印传输完成结果

void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
	if(huart == &huart1)
	{
		printf(" dma_ok\r\n");
	}
}
//主函数
  while (1)
  {
		HAL_UART_Transmit_DMA(&huart1, Tx_buff, 10);
		HAL_Delay(1000);
  }

结果:传输完数据到中断回调函数中打印 : dma ok
在这里插入图片描述

3. 库函数备注

串口发送/接收函数
HAL_UART_Transmit():串口发送数据,使用超时管理机制
HAL_UART_Receive():串口接收数据,使用超时管理机制
HAL_UART_Transmit_IT():串口中断模式发送
HAL_UART_Receive_IT():串口中断模式接收
HAL_UART_Transmit_DMA():串口DMA模式发送
HAL_UART_Transmit_DMA():串口DMA模式接收

串口中断函数
HAL_UART_IRQHandler(UART_HandleTypeDef *huart); //串口中断处理函数
HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart); //串口发送中断回调函数
HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart); //串口发送一半中断回调函数(用的较少)
HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart); //串口接收中断回调函数
HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart);//串口接收一半回调函数(用的较少)
HAL_UART_ErrorCallback();串口接收错误函数
DMA通道优先级配置:通俗解释硬件调度逻辑 深入解析DMA通道优先级的设置原理,揭示硬件如何通过优先级调度高效传输数据,掌握dma机制对系统性能优化至关重要。 阅读详情

相关推荐

STM—DMA的理解学习

摘要:DMA(直接内存访问)技术通过绕过CPU实现外设与存储器间的高效数据传输,减轻CPU负担。其核心配置包括数据源、目标地址、传输单位、数据量及传输模式(单次/循环)。DMA通道具有硬件优先级,冲突时编号越小优先级越高。配置时需注意地址递增设置(如内存地址需递增防数据覆盖)、数据单位一致性及传输方向(外设⇄存储器)。典型应用如串口通讯中,通过DMA将内存数据批量发送至外设寄存器。内存到内存传输需特殊硬件支持,通常默认禁用以确保安全。开发时需严格参照厂商手册配置参数。

xh0427的博客 1671

DMA学习笔记

内存到内存所有的通道都可以使用,通道变化越小,越块发送。DMA1优先级大于DAM2优先级。DMA主要是把数据从一个地方搬运到另一个地方,不占用CPU。内存到外设,外设到内存,内存到内存。有DMA1,DMA2。通道:传输数据的管道DMA1七条,DMA2有5条。DMA请求由发送方,外设,内存谁是发送方谁请求。把外设的数据寄存器地址当外设地址。每个通道有专门的DMA外设请求。DMA功能框架分3部分。串口发送是DM1通道4。

weixin_73005210的博客 644

RAGFlow API 实战指南:从数据集管理到智能对话

本文提供了RAGFlow API的实战指南,详细介绍了如何从零开始构建基于检索增强生成(RAG)的智能应用。内容涵盖环境准备、API密钥获取、核心概念理解,以及通过API进行数据集创建与管理、文档上传解析、知识块管理、检索测试,最终创建并配置智能聊天助手,实现基于私有知识库的精准对话。

weixin_29284885的博客 379

DMA学习

不同外设对应不同通道,DMA处理每个通道对应一或多个外设对存储器的访问请求,且都有一个仲裁器遇到一个通道对应多个外设多看手册。

m0_62995834的博客 561

CMOS锁相环核心:四种鉴频鉴相器(PFD)结构深度剖析与选型指南

本文深入剖析了CMOS锁相环中四种鉴频鉴相器(PFD)的结构与性能,包括传统RS触发器型、非时钟型、预充电型和边沿触发型PFD。通过详细的电路分析、实测数据和工程案例,提供了PFD选型的实用指南,帮助工程师根据速度、功耗和精度需求选择最优方案,提升锁相环设计效率。

weixin_42530458的博客 587

告别版本冲突!在Ubuntu 20.04上优雅实现ROS Noetic与ROS2 Foxy双环境切换

本文详细介绍了在Ubuntu 20.04系统上实现ROS Noetic(ROS1)与ROS2 Foxy双环境共存与切换的完整方案。通过智能脚本设计和工作空间隔离,解决了版本冲突问题,帮助开发者高效管理不同ROS版本项目。特别适合需要同时开发ROS1和ROS2应用的机器人开发者。

weixin_28452161的博客 408

STM32入门(十七)----DMA

DMA理论DMA简介框图实践 理论 DMA简介 框图 实践

m0_46070147的博客 935

【20260309】【亲测可用】【异常】Get https://registry-1.docker.io/v2/: net/http: request canceled

【异常】Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting for connection。

奶爸的编程之路,也就一周冷个三天 2万+

【温酒笔记】UART

参考文档:野火STM32F103。

Longrun的博客 1503

Unity零基础到进阶 ☀️| Unity中的 GC及优化 超级全面解析 ☆(ゝω・)v 建议收藏!

介绍: 在游戏运行的时候,数据主要存储在内存中,当游戏的数据在不需要的时候,存储当前数据的内存就可以被回收以再次使用。内存垃圾是指当前废弃数据所占用的内存,垃圾回收(GC)是指将废弃的内存重新回收再次使用的过程。 Unity中将垃圾回收当作内存管理的一部分,如果游戏中废弃数据占用内存较大,则游戏的性能会受到极大影响,此时垃圾回收会成为游戏性能的一大障碍点。 本文我们主要学习垃圾回收的机制,垃圾回收如何被触发以及如何提GC收效率来提高游戏的性能。 Unity内存管理机制简介 要想了解垃圾回收如何工作以及何时被

努力前行,总会成为自己心中的那道光 6万+

在 SAP ABAP 里可靠地对接 FTP 服务器:从连接、命令到传输与排错的完整实战

本文详细介绍了在SAP ABAP中实现FTP文件交换的完整技术方案。文章首先解析了FTP协议的双连接特性(控制连接与数据连接),强调保持控制连接的重要性。随后详细说明了ABAP中FTP操作的四步标准流程:建立连接(包含HTTP_SCRAMBLE加密)、执行命令、断开连接和关闭RFC通道。文章提供了实战案例代码,演示如何将FTP文件复制到应用服务器再读取进内表处理,特别指出后台作业与前台操作的关键差异。最后总结了常见错误排查要点,包括连接模型、路径设置和资源释放等问题。全文通过SAP标准函数模块的调用顺序、典

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 305

【温酒笔记】SPI

1. SPI基础 物理层 片选线 :选中拉低 SCK: 时钟线 MOSI:主出从入 MISO:主入从出 协议层 CPOL:时钟极性:空闲电平高低 CPHA:时钟相位:第一个还是第二个边沿采样

Longrun的博客 523

S7-1200与ABB机器人进行SOCKET通信的具体方法示例

S7-1200与ABB机器人进行SOCKET通信的具体方法示例

Robot_PLC_HMI_Automation 3292

STM32学习-DMA介绍及一般使用方法

m0_52850679的博客 8479

【华为OD机试】真题-小明减肥(Java)

摘要:题目要求从n个可选运动中选取k个,使其卡路里总和等于目标值t,统计可行方案数。输入包含运动数量n、目标t、选择数量k及卡路里数组。采用DFS回溯算法,通过剪枝优化(提前终止无效分支),分别处理选择/不选当前运动的情况。当遍历完所有运动且满足条件时计数。示例输入"4 3 2"和"1 2 3"时,输出2(对应两种选择组合)。Java实现通过递归完成搜索,最终输出符合条件的方案总数。(149字)

u014481728的博客 285

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

为什么DMA方式的优先级高于程序中断方式

为什么DMA方式的优先级高于程序中断方式 DMA传送方式的优先级高于程序中断,两者的区别主要表现在对CPU的干扰程度不同。 程序中断请求不但使CPU停下来,而且要CPU执行中断服务程序为中断请求服务,这个请求包括了对断点和现场的处理以及CPU与外设的传送,所以CPU付出了很多的代价;DMA请求仅仅使CPU暂停一下,不需要对断点和现场的处理,并且是由DMA控制外设与主存之间的数据传送,无需CPU的干...

ALTLI的博客 7941

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

DMA验证复习(一)

dma

whddddddddddd的博客 2752

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

STM32之DMA

寄存器名称作用DMA_CCRxDMA通道x配置寄存器用于配置DMA(核心控制寄存器)DMA_ISRDMA中断状态寄存器用于查询当前DMA传输状态DMA_IFCRDMA中断标志清除寄存器用来清除DMA_ISR对应位DMA_CNDTRxDMA通道x传输数量寄存器用于控制DMA通道x每次传输的数据量DMA_CPARxDMA通道x外设地址寄存器用于存储STM32外设地址DMA_CMARxDMA通道x存储器地址寄存器。

huangjavase的博客 2142

【正点原子STM32】DMA直接存储器访问(DMA传输、DMA请求、DMA通道、DMA优先级、DMA处理过程、DMA相关寄存器和HAL库驱动、DMA配置步骤、DMAMUX DMA请求复用器)

一、DMA介绍一、DMA介绍DMA(直接存储器访问):DMA是一种计算机系统中的重要技术,它允许数据在内存和外设之间直接传输,而无需CPU的直接干预。这种直接传输的方式可以显著提高数据传输的效率,因为它可以在数据传输过程中不占用CPU的时间,从而使CPU能够专注于执行其他任务。DMA工作原理是在CPU控制下配置好DMA的参数后,DMA控制器会独立地从一个地址空间(通常是内存)中获取数据,并将数据传输到另一个地址空间(可以是内存或者外设)。

咖喱年糕的博客 4454

STM32 DMA直接存储器存取

DMA可以直接提供外设和存储器(运行存储器和程序存储器Flash)之间的高速数据传输,无需CPU干预,节省了CPU的资源。12个独立可配置的通道:DMA1(7个通道)和DMA2(5个通道)。每个通道都支持软件触发和特定的硬件触发。在同一个DMA模块上,多个请求间的优先权可以通过软件编程设置(共有四级:很高、高、中等和低),优先权设置相等时由硬件决定(请求0优先于请求1,依此类推)。

qq_43861548的博客 859

DMA传输优先级与中断优先级:嵌入式系统的协同调度之道 ——解析两大机制的协作原理与实战优化策略

DMA传输优先级与中断优先级:嵌入式系统的协同调度之道 ——解析两大机制的协作原理与实战优化策略

wwwmy1的博客 1425

DMA介绍

DMA(Direct Memory Access,直接存储器访问)提供外设与内存、存储器和存储器、外设与外设之间的高速数据传输使用。允许不同速度的硬件装置来沟通,而不需要依赖CPU,在这个时间中,CPU对于内存的工作来说就无法使用。简单描述:DMA就是数据的搬运工。

d0203的博客 5591

关于DMA的一些总结

当有大量数据需要转运的时候,如果由CPU来进行数据转运的操作,数据转运属于简单操作,而CPU主要是运行一些较为复杂的程序,这样会占用大量CPU资源。为此就存在一个专门转运数据的外设,也就是DMA,译为(Direct Memory Access)直接存储器存取,DMA可以提供外设和存储器或者存储器和存储器之间的高速数据传输,无须CPU干预,节省了CPU的资源。

qq_68915581的博客 4263

DMA实验

DMA实验

qq_64531765的博客 2528

操作系统解答

操作系统解答

qq_35231482的博客 915

STM32—— DMA介绍

1.1 DMA结构框图 DMA 控制器独立于内核,属于一个单独的外设,结构比较简单,从编程的角度来看,我们只需掌握结构框图中的三部分内容即可。 如图:(大家也可以查看《STM32F10x中文参考手册》-10 DMA控制器(DMA)章节 内容) (1)标号1:DMA请求 如果外设要想通过 DMA 来传输数据,必须先给 DMA 控制器发送 DMA 请求, DMA收到请求信号之后,控制器会给外设一个应答信号,当外设 应答后且 DMA 控制器收到应答信号之后,就会启动 DMA 的传输,直到 传输完毕。 根据前面介

王某的博客 3019
上一篇: 【速查笔记】单片机
下一篇: 【温酒笔记】UART
Long-Run
博客等级 码龄3年 4600粉丝 85原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值