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

嵌入式开发实战之--DMA配置详解(上)

1. DMA到底是什么为什么嵌入式开发离不开它第一次接触DMA这个概念时我也被它绕晕了。直到有一次调试SPI通信CPU占用率直接飙到90%屏幕刷新卡成PPT才真正体会到DMA的价值。简单来说DMA就像你请了个私人助理Direct Memory Access控制器原本需要你亲自跑腿的搬运工作比如把UART接收的数据存到内存现在交给助理全权处理你只需要交代清楚任务要求。这个助理有多能干呢以STM32F407为例它的DMA控制器能在1个时钟周期内完成32位数据的搬运而同样的操作如果用CPU处理至少要6个时钟周期取指令解码执行。实际项目中用DMA传输1024字节的ADC采样数据CPU介入时间从2400个时钟周期降到几乎为零这才是真正的时间管理大师。DMA最擅长三类搬运工作外设↔内存比如把ADC采集的数据批量存到数组或者把LCD显示数据从显存发送到屏幕内存↔内存大数据块拷贝注意STM32F1系列不支持外设↔外设特殊场景如ADC数据直接送给DAC2. 配置DMA的五个关键步骤2.1 通道选择给外设分配专属车道STM32的DMA通道配置就像在规划城市交通。以DMA1控制器为例它有8条主干道数据流每条主干道又有8条车道通道。配置时最容易踩的坑就是通道冲突——比如SPI1_TX和I2C1_RX都默认使用DMA1_Stream3但CHSEL必须选择不同通道值。这里有个实用技巧打开芯片参考手册的DMA请求映射表我习惯用荧光笔标出已占用的通道。比如配置USART1_TX时// DMA1 Stream7 Channel4 用于USART1_TX DMA_InitStructure.DMA_Channel DMA_Channel_4;2.2 优先级仲裁急诊科的分诊策略当多个外设同时喊DMA干活时仲裁器就是急诊科的分诊护士。优先级设置要注意软件优先级PL[1:0]位分四级非常高(0b00)适合实时性要求高的外设如ADC高(0b01)常用在通信接口SPI/I2C中(0b10)批量数据传输内存拷贝低(0b11)后台任务硬件优先级当软件优先级相同时数据流编号小的优先。有次调试时DMA1_Stream5的数据总是被Stream3打断最后发现是优先级设置相同导致的。2.3 FIFO模式数据的中转仓库直接模式像快递员送货不上楼而FIFO模式则像有个快递柜。配置FIFO时要注意三个参数阈值选择1/4、1/2、3/4或满。通常内存到外设选1/2外设到内存选1/4数据宽度转换比如ADC采集的16位数据转32位存储突发传输类似快递批量送货减少跑腿次数实测发现在480Mbps的USB传输中启用FIFO突发模式能使传输效率提升40%。2.4 双缓冲边处理边传输的秘诀双缓冲配置就像流水线的两个工位DMA_InitStructure.DMA_Memory0BaseAddr (uint32_t)buf1; DMA_InitStructure.DMA_Memory1BaseAddr (uint32_t)buf2; DMA_InitStructure.DMA_BufferSize BUF_SIZE; DMA_InitStructure.DMA_Mode DMA_Mode_Circular;当DMA在填充buf2时CPU可以处理buf1的数据通过中断标志位切换缓冲区。我在音频采集项目中用这招完全消除了数据覆盖问题。2.5 结构体参数详解每个配置项的实际影响以SPI发送配置为例DMA_InitTypeDef DMA_InitStructure; DMA_InitStructure.DMA_PeripheralBaseAddr (uint32_t)SPI1-DR; DMA_InitStructure.DMA_Memory0BaseAddr (uint32_t)tx_buffer; DMA_InitStructure.DMA_DIR DMA_DIR_MemoryToPeripheral; DMA_InitStructure.DMA_BufferSize 128; DMA_InitStructure.DMA_PeripheralInc DMA_PeripheralInc_Disable; // SPI数据寄存器固定地址 DMA_InitStructure.DMA_MemoryInc DMA_MemoryInc_Enable; // 内存地址自动递增 DMA_InitStructure.DMA_PeripheralDataSize DMA_PeripheralDataSize_Byte; DMA_InitStructure.DMA_MemoryDataSize DMA_MemoryDataSize_Byte; DMA_InitStructure.DMA_Mode DMA_Mode_Normal; DMA_InitStructure.DMA_Priority DMA_Priority_High; DMA_InitStructure.DMA_FIFOMode DMA_FIFOMode_Enable; DMA_InitStructure.DMA_FIFOThreshold DMA_FIFOThreshold_HalfFull; DMA_InitStructure.DMA_MemoryBurst DMA_MemoryBurst_Single; DMA_InitStructure.DMA_PeripheralBurst DMA_PeripheralBurst_Single;特别要注意DMA_MemoryDataSize和DMA_PeripheralDataSize的匹配。有次配置CAN总线通信时误将内存设为32位而外设设8位导致数据错位排查了整整一天。3. 外设实战SPIDMA的配置陷阱3.1 硬件连接检查清单在调试SPIDMA时建议先确认SPI时钟相位/极性是否与从设备一致DMA通道是否与SPI请求映射匹配查参考手册Table 43GPIO是否配置为复用功能AF5对应SPI13.2 典型配置流程以SPI1发送为例开启时钟RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);配置DMADMA_DeInit(DMA2_Stream3); // SPI1_TX对应DMA2_Stream3 // ...初始化结构体见前文示例 DMA_Init(DMA2_Stream3, DMA_InitStructure);关键点SPI DMA使能要放在最后SPI_I2S_DMACmd(SPI1, SPI_I2S_DMAReq_Tx, ENABLE); DMA_Cmd(DMA2_Stream3, ENABLE);3.3 调试技巧遇到DMA传输异常时我常用的排查步骤检查DMA_GetFlagStatus的状态标志用逻辑分析仪抓取SPI时钟和数据线在DMA传输完成中断里打印缓冲区数据曾经有个诡异的问题DMA只能传输前16个字节。最终发现是SPI的CRC计算被意外启用占用了DMA资源。4. 常见问题解决方案4.1 数据覆盖双缓冲中断的正确用法在ADC连续采样时建议采用如下结构volatile uint8_t adc_buf_index 0; uint16_t adc_buf[2][256]; void DMA2_Stream0_IRQHandler(void) { if(DMA_GetITStatus(DMA2_Stream0, DMA_IT_TCIF0)) { adc_buf_index ^ 1; // 切换缓冲区 DMA_ClearITPendingBit(DMA2_Stream0, DMA_IT_TCIF0); } }4.2 内存对齐问题当使用32位传输时内存地址必须是4字节对齐。可以用这个宏检查#define IS_ALIGNED(addr) (((uint32_t)(addr) 0x3) 0)4.3 性能优化技巧将DMA缓冲区定义在CCM内存如果可用避免总线竞争对于大数据传输启用DMA_MemoryBurst模式使用__align(4)确保缓冲区对齐

相关文章:

嵌入式开发实战之--DMA配置详解(上)

1. DMA到底是什么?为什么嵌入式开发离不开它? 第一次接触DMA这个概念时,我也被它绕晕了。直到有一次调试SPI通信,CPU占用率直接飙到90%,屏幕刷新卡成PPT,才真正体会到DMA的价值。简单来说,DMA就…...

Rust高阶类型模拟:突破局限与编译挑战

【导语:本文围绕在Rust中模拟高阶类型(HKTs)展开,作者在编写函数式编程脚本语言时遇到Rust缺乏HKTs的问题,通过泛型关联类型(GATs)尝试解决,却引发了编译错误,揭示了Rust…...

PHP高并发架构设计、微服务拆分、消息队列削峰、容器化部署 (Docker/K8s)、CI/CD 流程的庖丁解牛

将 PHP 高并发架构、微服务拆分、消息队列削峰、容器化部署 (Docker/K8s)、CI/CD 流程 这五者结合,实际上构成了一个现代企业级 PHP 系统的完整生命周期。 高并发架构是目标(支撑海量流量);微服务拆分是手段(解耦复杂业…...

OPPO Find N6:折叠屏手机新势力的崛起与挑战

OPPO Find N6:零感折痕开启折叠屏新体验OPPO 推出的折叠屏手机 Find N6 带来了令人瞩目的“零感折痕”体验。借助液态 3D 打印铰链柱,其折痕是目前所有折叠屏手机中最浅的,几乎难以看到或摸到,虽未完全消失,但已近乎完…...

分布式拒绝服务攻击(DDOS)论文复现:Sin-Cos-bIAVOA方法探索

分布式拒绝服务攻击(DDOS)论文复现 实验复现 Matlab代码 Sin-Cos-bIAVOA: A new feature selection method based on improved African vulture optimization algorithm and a novel transfer function to DDoS attack detection 一种基于改进的非洲秃鹰…...

31:社会危害图谱分析:网络图论与社区检测算法

作者: HOS(安全风信子) 日期: 2026-03-15 主要来源平台: GitHub 摘要: 本文深入探讨如何构建社会危害图谱,通过网络图论和社区检测算法实现对犯罪网络的分析和识别。结合《死亡笔记》中魅上照的严谨风格,我…...

修车师傅都不知道的OBD冷知识:CAN总线接头隐藏的4种改装玩法

修车师傅都不知道的OBD冷知识:CAN总线接头隐藏的4种改装玩法 当你打开汽车OBD接口的塑料盖板时,看到的可能只是一个16针的标准诊断插座。但在这个看似平凡的接口背后,CAN总线接头的不同形态正在成为汽车改装界的"瑞士军刀"。从自制…...

抖音abogus参数逆向实战:从JSVMP混淆到算法还原的全过程

抖音abogus参数逆向实战:从JSVMP混淆到算法还原的全过程 在当今互联网环境中,数据安全与反爬虫技术日益复杂,作为开发者,理解主流平台的防护机制已成为必备技能。抖音作为头部短视频平台,其接口防护体系尤为严密&#…...

光伏储能系统电流传感器选型指南:从霍尔效应到磁通门技术

光伏储能系统电流传感器选型指南:从霍尔效应到磁通门技术 在光伏储能系统设计中,电流测量环节的精度与可靠性直接影响整个系统的发电效率与安全运行。随着双碳目标的推进,2023年全球光伏新增装机容量突破400GW,其中配备储能系统的…...

如何避免数据清洗中的常见坑?从缺失值到归一化的完整指南

数据清洗避坑实战:从缺失值陷阱到标准化误区 数据清洗是机器学习项目中最容易被低估的环节,却往往决定了80%的模型效果。我曾见过一个金融风控项目,团队花了三个月优化算法,最终发现问题竟源于原始数据中未被发现的传感器故障导致…...

旧手机秒变蓝牙键盘鼠标:实测这款神器比触控板好用10倍(附下载)

旧手机秒变蓝牙键盘鼠标:实测这款神器比触控板好用10倍(附下载) 你是否曾为桌面空间不足而烦恼?或是厌倦了在笔记本电脑上使用触控板的糟糕体验?现在,只需一款神奇的软件,就能让你的旧手机焕发新…...

MCP连接超时、消息乱序、ACK丢失全解析,深度解读协议栈层错误码映射表及自愈配置模板

第一章:MCP协议与传统REST API性能对比MCP(Message-Centric Protocol)是一种面向实时消息流与低延迟交互设计的二进制协议,其核心目标是在微服务间、边缘设备与云平台之间实现高吞吐、低开销的通信。相较之下,传统REST…...

又一个Linux发行版抛弃KDE Plasma了

最近Linux社区炸锅了:KaOS Linux 在2026年2月的最新ISO(KaOS 2026.02)中,正式结束了长达12年的KDE Plasma“专属”时代,转而默认采用Niri(一个滚动式平铺Wayland合成器)+ Noctalia Shell的组合。 乍一听很多人会震惊:“KaOS不是一直以‘Qt & KDE至上’闻名吗?怎么…...

一丹一世界FLUX.1部署指南:阿里云ECS轻量应用服务器7861端口全配置

一丹一世界FLUX.1部署指南:阿里云ECS轻量应用服务器7861端口全配置 1. 引言:从文字到画面的魔法 你有没有过这样的经历?脑子里浮现出一个绝美的画面——比如一位优雅的女士漫步在夕阳下的金色沙滩,海浪轻抚着她的脚踝&#xff0…...

AutoGod:安卓5-16全兼容!一站式自动化框架,开发效率直接拉满

一站式安卓自动化解决方案!兼容全安卓版本,功能全覆盖 还在为安卓自动化开发找零散工具? 手势、图色、视觉、网络、UI、拓展、安全,东拼西凑还不稳定? Auto-God是一站式安卓自动化框架,集成交互、视觉、…...

亚洲艺术电影节携澳门文化亮相深圳

亚洲艺术电影节携澳门文化亮相深圳“一节一会”,共担APEC2026时代使命2026年3月13日至15日,由国家广播电视总局与深圳市人民政府联袂主办,广东省广播电视局及中共深圳市委宣传部指导,深圳市文化广电旅游体育局、深圳广播电影电视集…...

低查重率AI教材编写指南,借助AI工具开启高效写作之路!

教材的初稿终于写好了,但接下来的修改和优化过程真是令人头疼。逐篇通读,试图找出逻辑不严谨和知识错误,真的是要耗费不少时间;一个章节结构的调整,结果却牵扯到之后的多个部分,修改的工作量似乎呈现几何增…...

DeepChat网络安全教学系统:渗透测试对话模拟

DeepChat网络安全教学系统:渗透测试对话模拟 1. 引言 网络安全教育一直面临着一个核心难题:如何在安全的环境中让学生真正体验和理解网络攻击的实际过程?传统的理论教学往往让学生感到抽象和枯燥,而真实的渗透测试环境又存在法律…...

海洋噪音过滤测试:在鲸鱼歌声中捕捉潜艇

1 声学测试环境的复杂性建模现代水下探测系统面临的核心挑战是海洋声场的极端复杂性。根据声学传播特性,海洋背景噪声主要由三类构成:环境噪声(40-100dB):包括海浪湍流(0.1-10kHz)、地震低频波动…...

电源篇2——降压BUCK芯片的实战选型与设计考量

1. BUCK芯片选型的核心参数解析 第一次选BUCK芯片时,我看着密密麻麻的规格书参数直接懵了——效率95%、开关频率2MHz、最大电流3A...这些数字到底哪个最关键?后来踩过几次坑才明白,选型就像相亲,不能只看表面数据,得看…...

Instagram“算法可调”时代来了!INS协议工具如何把曝光做稳、把线索接住、把转化跑通?

最近热议点很明确:Instagram开始让用户更直观看到并调整 Reels 的兴趣主题(Your Algorithm),推荐会更“按人下菜”。https://115.haiwangads.com/ 这意味着品牌想持续出量,必须做到:更准的匹配、更强的互动…...

怎样高效掌握QuPath脚本:5个实战技巧解密生物图像分析自动化

怎样高效掌握QuPath脚本:5个实战技巧解密生物图像分析自动化 【免费下载链接】qupath QuPath - Bioimage analysis & digital pathology 项目地址: https://gitcode.com/gh_mirrors/qu/qupath 面对海量的病理切片和显微图像,你是否还在手动标…...

摄影爱好者必看:如何用MTF曲线挑选最适合你的镜头(附实测对比)

摄影爱好者必看:如何用MTF曲线挑选最适合你的镜头(附实测对比) 当你站在琳琅满目的镜头柜台前,面对从几千到数万元不等的各款镜头,是否曾感到无从下手?专业评测中那些晦涩的MTF曲线图,对普通摄影…...

Fluent16.0边界条件设置实战:以密闭空间气体注入为例的完整流程

Fluent16.0边界条件设置实战:密闭空间气体注入全流程解析 在计算流体动力学(CFD)仿真中,边界条件的设置往往是决定仿真结果准确性的关键因素之一。对于密闭空间气体注入这类工程问题,合理的边界条件配置不仅能提高计算…...

IIC总线协议实战:手把手教你用Verilog实现从机应答逻辑(附完整代码)

IIC总线协议实战:从机应答逻辑的Verilog实现与时钟域同步技巧 IIC总线作为嵌入式系统和芯片间通信的经典协议,其简洁的两线设计(SCL时钟线和SDA数据线)背后隐藏着复杂的时序要求。许多工程师在实现从机应答逻辑时,常遇…...

微信小程序实战:YOLOv11目标检测模型从训练到部署全流程(附避坑指南)

微信小程序实战:YOLOv11目标检测模型从训练到部署全流程(附避坑指南) 在移动端实现实时目标检测一直是计算机视觉领域的热门课题。随着微信小程序的生态日趋成熟,将先进的YOLO系列模型部署到小程序平台,成为许多开发者…...

Win10下OpenCV4.5.2环境配置避坑指南:从下载到测试的完整流程

Win10下OpenCV4.5.2环境配置实战:从零到图像处理的完整指南 对于计算机视觉开发者来说,OpenCV无疑是最强大的工具之一。但在Windows系统上配置OpenCV环境,尤其是手动编译版本,常常会遇到各种"坑"。本文将带你完整走通Op…...

Few-shot 图像生成的记忆原型与注意力调制:MoCA 机制解析

1. Few-shot图像生成的挑战与突破 想象一下,你手里只有5张猫咪的照片,却要让AI画出100只不同姿态的猫咪——这就是Few-shot图像生成要解决的难题。传统GAN就像个贪吃的大胃王,动辄需要上万张训练图片才能产出像样结果。而现实世界中&#xff…...

leetcode 3070. 元素和小于等于 k 的子矩阵的数目 中等

给你一个下标从 0 开始的整数矩阵 grid 和一个整数 k。返回包含 grid 左上角元素、元素和小于或等于 k 的 子矩阵的数目。示例 1:输入:grid [[7,6,3],[6,6,1]], k 18 输出:4 解释:如上图所示,只有 4 个子矩阵满足&am…...

南北阁Nanbeige 4.1-3B资源消耗深度评测:轻量模型的大能量

南北阁Nanbeige 4.1-3B资源消耗深度评测:轻量模型的大能量 最近在和朋友聊起本地部署大模型时,大家最头疼的往往不是模型效果,而是那令人望而却步的硬件门槛。动不动就几十GB的显存需求,让很多个人开发者和中小团队只能“望模兴叹…...