数据搬运工-DMA(上)
DMADirect Memory Access直接存储器访问提供在外设与内存、存储器和存储器之间的高速数据传输使用。它允许不同速度的硬件装置来沟通而不需要依赖于CPU在这个时间中CPU对于内存的工作来说就无法使用。目录三种搬运方式工作方式DMA控制器DMA优先级管理DMA传输方式指针递增模式DMA数据对齐方式DMA寄存器及库函数介绍函数使用说明启用 DMA1 时钟初始化 DMA启动 DMA 传输链接 DMA 到外设UART DMA 传输检查 DMA 标志启用/禁用 DMA示例代码片段三种搬运方式存储器→存储器例如复制某特别大的数据buf存储器→外设 例如将某数据buf写入串口TDR寄存器外设→存储器 例如将串口RDR寄存器写入某数据buf工作方式DMA控制器STM32F103有2个DMA控制器DMA1有7个通道DMA 2有5个通道。一个通道每次只能搬运一个外设的数据如果同时有多个外设的DMA请求则按照优先级进行响应。STM32F103C8T6只有DMA1DMA优先级管理优先级管理采用软件硬件软件每个通道的优先级可以在DMA_CCRx寄存器中设置有4个等级最高级高级中级低级硬件如果2个请求它们的软件优先级相同则较低编号的通道比较高编号的通道有较高的优先权。比如如果软件优先级相同通道2优先于通道4DMA传输方式DMA_Mode_Normal正常模式一次DMA数据传输完后停止DMA传送 也就是只传输一次DMA_Mode_Circular循环传输模式当传输结束时硬件自动会将传输数据量寄存器进行重装进行下一轮的数据传输。 也就是多次传输模式指针递增模式外设和存储器指针在每次传输后可以自动向后递增或保持常量。当设置为增量模式时下一个要传输的地址将是前一个地址加上增量值DMA数据对齐方式源-目标一般右对齐多的高位补0DMA寄存器及库函数介绍常用库函数__HAL_RCC_DMA1_CLK_ENABLE(…)HAL_DMA_Init(…)HAL_DMA_Start(…)__HAL_LINKDMA(…)HAL_UART_Transmit_DMA(…)HAL_UART_Receive_DMA(…)__HAL_DMA_GET_FLAG(…)__HAL_DMA_ENABLE(…)__HAL_DMA_DISABLE(…)函数使用说明启用 DMA1 时钟__HAL_RCC_DMA1_CLK_ENABLE()用于启用 DMA1 控制器的时钟。在使用 DMA 功能前必须调用此函数以确保 DMA 控制器正常工作。初始化 DMAHAL_DMA_Init()用于初始化 DMA 通道。需要传入一个DMA_HandleTypeDef结构体指针该结构体包含 DMA 配置参数如传输方向、数据宽度、源和目标地址等。启动 DMA 传输HAL_DMA_Start()启动 DMA 传输。需要指定源地址、目标地址和传输长度。通常在初始化 DMA 后调用此函数开始数据传输。链接 DMA 到外设__HAL_LINKDMA()用于将 DMA 通道与外设如 UART关联。通常传入外设句柄、DMA 句柄和 DMA 句柄的成员变量名。UART DMA 传输HAL_UART_Transmit_DMA()和HAL_UART_Receive_DMA()分别用于通过 DMA 发送和接收 UART 数据。需要传入 UART 句柄、数据缓冲区指针和数据长度。检查 DMA 标志__HAL_DMA_GET_FLAG()用于检查 DMA 传输状态标志如传输完成标志TC或半传输标志HT。通常用于轮询方式检查传输状态。启用/禁用 DMA__HAL_DMA_ENABLE()和__HAL_DMA_DISABLE()分别用于启用或禁用 DMA 通道。可用于动态控制 DMA 传输的启停。示例代码片段以下是一个简单的 UART DMA 传输示例DMA_HandleTypeDef hdma_usart1_tx; UART_HandleTypeDef huart1; // 启用 DMA1 时钟 __HAL_RCC_DMA1_CLK_ENABLE(); // 初始化 DMA hdma_usart1_tx.Instance DMA1_Channel4; 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; HAL_DMA_Init(hdma_usart1_tx); // 链接 DMA 到 UART __HAL_LINKDMA(huart1, hdmatx, hdma_usart1_tx); // 启动 UART DMA 传输 uint8_t data[] Hello DMA!; HAL_UART_Transmit_DMA(huart1, data, sizeof(data));

相关新闻

ANTLR4:解析器生成工具的强大力量

ANTLR4:解析器生成工具的强大力量

探索ANTLR4:解析器生成工具的强大力量 ANTLR4(ANother Tool for Language Recognition)是一个强大的解析器生成工具,广泛应用于计算机科学领域,特别是在编译器设计、语言处理和文本分析等方面。今天,我们将…

2026/7/3 15:50:04 阅读更多 →
vue 插槽详解

vue 插槽详解

在 Vue.js 中,插槽(Slots) 是一种极为强大且灵活的内容分发机制。它允许父组件向子组件“注入”模板片段,从而实现组件的高度可复用性和布局的动态定制。通过插槽,我们可以将组件的结构与内容解耦,让子组件…

2026/7/3 15:50:04 阅读更多 →
图像算法优化常用方式-vivado hls设计

图像算法优化常用方式-vivado hls设计

一、图像算法优化常用方式 1.双层for循环结构 对于灰度图像或者二值图像&#xff0c;一般使用双层循环 for(ap_uint<32> i0;i<height;i){ for(ap_uint<32> j0;j<height;j){ #pragma HLS pipeline II1 } } 然后对内存循环进行pipeline优化&#xff…

2026/7/3 15:50:09 阅读更多 →

最新新闻

Claude 4.7 Opus接入AWS Bedrock的Agentic Coding工程实践

Claude 4.7 Opus接入AWS Bedrock的Agentic Coding工程实践

1. 项目概述&#xff1a;这不是一次简单的API调用&#xff0c;而是一场对AI工程化边界的压力测试“Claude 4.7 Opus落地 AWS Bedrock”——这个标题里藏着三重现实张力。第一重是模型代际的跃迁&#xff1a;Opus作为Anthropic当前公开能力最强的闭源模型&#xff0c;其上下文窗…

2026/7/6 23:40:40 阅读更多 →
AI战略规划系统:从顶层设计到工程落地的实战指南

AI战略规划系统:从顶层设计到工程落地的实战指南

1. 项目概述&#xff1a;为什么需要一个AI战略规划系统&#xff1f;在技术圈子里泡了十几年&#xff0c;我见过太多团队在拥抱AI时的“阵痛期”。大家往往一上来就扎进模型选型、数据清洗的细节里&#xff0c;热火朝天地搞了几个月&#xff0c;最后却发现系统难以维护、成本失控…

2026/7/6 23:40:40 阅读更多 →
OpenVINS 前端特征追踪对比:KLT 光流与 SuperPoint 神经网络在 EuRoC 数据集上的 3 项指标分析

OpenVINS 前端特征追踪对比:KLT 光流与 SuperPoint 神经网络在 EuRoC 数据集上的 3 项指标分析

OpenVINS 前端特征追踪对比&#xff1a;KLT 光流与 SuperPoint 神经网络在 EuRoC 数据集上的性能差异分析视觉惯性里程计&#xff08;VIO&#xff09;系统的前端特征追踪模块直接影响着整个系统的精度和鲁棒性。作为开源VIO框架中的佼佼者&#xff0c;OpenVINS提供了多种前端特…

2026/7/6 23:40:40 阅读更多 →
Linux 进程管理进阶:kill -9 与 -15 的3种场景选择与僵尸进程清理

Linux 进程管理进阶:kill -9 与 -15 的3种场景选择与僵尸进程清理

Linux 进程管理进阶&#xff1a;kill -9 与 -15 的3种场景选择与僵尸进程清理在Linux系统管理中&#xff0c;进程管理是每个管理员必须掌握的核心技能。当我们需要终止一个进程时&#xff0c;kill命令是最常用的工具之一。然而&#xff0c;不同的终止信号会导致完全不同的结果。…

2026/7/6 23:38:39 阅读更多 →
如何彻底告别系统激活烦恼:KMS_VL_ALL_AIO智能激活脚本完全指南

如何彻底告别系统激活烦恼:KMS_VL_ALL_AIO智能激活脚本完全指南

如何彻底告别系统激活烦恼&#xff1a;KMS_VL_ALL_AIO智能激活脚本完全指南 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 你是否曾经因为Windows系统或Office办公软件显示"未激活"而…

2026/7/6 23:38:39 阅读更多 →
C# 运动控制框架多线程实战:3种线程同步原语对比与ManualResetEvent应用

C# 运动控制框架多线程实战:3种线程同步原语对比与ManualResetEvent应用

C# 运动控制框架多线程实战&#xff1a;3种线程同步原语深度对比与ManualResetEvent工程实践引言&#xff1a;工业控制场景下的线程同步挑战在数控机床的G代码执行过程中&#xff0c;当急停按钮被触发时&#xff0c;系统需要在5毫秒内完成所有轴的制动——这个场景完美诠释了工…

2026/7/6 23:36:39 阅读更多 →

日新闻

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2与MySQL单元测试兼容性&#xff1a;5个关键SQL语句差异与规避方案1. 单元测试中的数据库兼容性挑战在Java开发领域&#xff0c;单元测试是保证代码质量的重要环节。当应用涉及数据库操作时&#xff0c;测试环境的搭建往往成为开发者的痛点。H2数据库因其轻量级、内存模式和快…

2026/7/6 0:01:17 阅读更多 →
Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南&#xff1a;用RBTray一键隐藏窗口到系统托盘 【免费下载链接】rbtray A fork of RBTray from http://sourceforge.net/p/rbtray/code/. 项目地址: https://gitcode.com/gh_mirrors/rb/rbtray 你是否厌倦了Windows任务栏上密密麻麻的图标&…

2026/7/6 0:01:17 阅读更多 →
Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C 运行时库一键安装终极指南&#xff1a;告别DLL缺失烦恼 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过这样的情况&#xff1a;下载了…

2026/7/6 0:05:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools&#xff1a;5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱&#xff0c;支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/6 8:11:50 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里&#xff0c;参与了关于混合后量子密码学的讨论&#xff0c;应付端点攻击找茬的人&#xff0c;还参与留言板讨论后&#xff0c;发现“威胁模型”对多数人仍是陌生概念&#xff0c;且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/6 8:11:52 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”&#xff1a;我理解的渗透测试到底是什么&#xff1f;每次看到新闻里说某个大公司的数据被“黑”了&#xff0c;或者某个网站被攻击导致服务瘫痪&#xff0c;你是不是和我一样&#xff0c;心里会冒出两个念头&#xff1a;一是“这黑客真厉害”&#x…

2026/7/6 6:52:56 阅读更多 →

月新闻