【嵌入式】STM32H743, D-cache, DMA注意事项

发布时间:2026/10/6 22:29:41

【嵌入式】STM32H743, D-cache, DMA注意事项 1. 问题STM32H743开启D-cache以后如果使用DMA会导致数据错乱。2. 原因DMA访问的是RAM, 实际的数据可能还在D-cache中没有与RAM同步。3. 解决方法3.1 使用前同步DMA发送前将cache中的数据写会RAMSCB_CleanDCache_by_Addr()DMA接收数据后cache获取RMA的数据SCB_InvalidateDCache_by_Addr()详情//用于将 D-Cache 数据回写到 SRAM 里面SCB_CleanDCache_by_Addr((uint32_t*)buf,len);//用于重新从 SRAM 获取数据, 丢弃 D-Cache 当前数据SCB_InvalidateDCache_by_Addr((uint32_t*)buf,len);//写回数据到 SRAM, 并重新获取 D-Cache数据SCB_CleanInvalidateDCache_by_Addr((uint32_t*)buf,len);3.2 MPU方式推荐通过MPU关闭一块SRAM的Cache功能例如以0x30000000为首地址的128KSRAM1为什么不用0x24000000(AXI SRAM)这一块因为这块ram的速度快关闭Cache太浪费。DMA使用到的内存需要定义到关闭Cache的内存范围内步骤1. 开启MPU并设置voidMPU_Config(void){MPU_Region_InitTypeDef MPU_InitStruct{0};/* Disables the MPU */HAL_MPU_Disable();/** Initializes and configures the Region and the memory to be protected */MPU_InitStruct.EnableMPU_REGION_ENABLE;MPU_InitStruct.NumberMPU_REGION_NUMBER0;MPU_InitStruct.BaseAddress0x30000000;MPU_InitStruct.SizeMPU_REGION_SIZE_128KB;MPU_InitStruct.SubRegionDisable0x0;MPU_InitStruct.TypeExtFieldMPU_TEX_LEVEL0;MPU_InitStruct.AccessPermissionMPU_REGION_FULL_ACCESS;MPU_InitStruct.DisableExecMPU_INSTRUCTION_ACCESS_ENABLE;MPU_InitStruct.IsShareableMPU_ACCESS_SHAREABLE;MPU_InitStruct.IsCacheableMPU_ACCESS_NOT_CACHEABLE;MPU_InitStruct.IsBufferableMPU_ACCESS_NOT_BUFFERABLE;HAL_MPU_ConfigRegion(MPU_InitStruct);/* Enables the MPU */HAL_MPU_Enable(MPU_HFNMI_PRIVDEF);}2. Keil工程设置Linker3 STM32H743_DMA.sct;STM32H743IITx;Flash2MB;AXISRAM(D1)512KB;SRAM1SRAM2SRAM3(D2)288KB LR_IROM10x080000000x00200000{ER_IROM10x080000000x00200000{*.o(RESET,First)*(InRoot$$Sections).ANY(RO)};普通RW/ZI变量 RW_RAM_D10x240000000x00080000{.ANY(RWZI)};DMA专用区域 RW_DMA0x300000000x00048000{*(.dma_buffer)}}4. 使用#define__DMA_RAM\__attribute__((section(.dma_buffer)))\__attribute__((aligned(32)))//注意这里buf需要是全局变量或static变量__DMA_RAMuint8_tbuf[512]{0};//buf在0x30000000 sram段//备注这里赋初值可能没作用。例如下面两行代码赋的初值不起效果__DMA_RAMuint8_tbuf[512]{123};static__DMA_RAMuint8_tbuf[512]{1,2,3};3.3 D-Cache 的透写模式缺点 会损失一些性能因为每次都要从从Cache写会数据。/** * brief 使能 STM32H7 的 L1-Cache, 同时开启 D cache 的强制透写 * param 无 * retval 无 */voidsys_cache_enable(void){SCB_EnableICache();/* 使能 I-Cache,函数在 core_cm7.h 里面定义 */SCB_EnableDCache();/* 使能 D-Cache,函数在 core_cm7.h 里面定义 */SCB-CACR|12;/* 强制 D-Cache 透写,如不开启透写,实际使用中可能遇到各种问题 */}
延伸阅读

更多相关文章

2026/10/6 22:31:21

基于Claude API与GitHub Actions构建AI自动化内容发布系统

1. 这篇文章真正要解决的问题 你是否想过,一个每天更新的、内容丰富的在线报纸,其背后可能没有编辑团队,甚至不需要人工干预?这听起来像是未来新闻业的幻想,但今天,一个名为“Dissecting the automation of…

2026/10/6 22:31:38

Havenlon | 杂谈:AI 时代,谁拥有让事情发生的权力?

过去二十年,软件安全最习惯问的问题是:谁有权限?谁能登录,谁能审批,谁能调用接口,谁能修改配置,谁能拿到管理员账号。整个权限体系因此越来越复杂,RBAC、ABAC、多因素认证、多签、审…

2026/10/5 23:02:04

Spring Boot+Vue在线考试系统全栈开发实战:从架构设计到部署上线

在线考试系统是高校、培训机构和企业内部考核的常见需求,一个功能完整、流程清晰、技术栈主流的系统是计算机相关专业毕业设计的优秀选题。它要求开发者不仅要掌握前后端分离的开发模式,还要处理复杂的业务逻辑,如用户角色管理、试卷生成、实…

2026/10/6 23:24:53

UE5 Niagara粒子系统:死神特效完整制作流程与模块化思维

提到“死神特效”,你脑海里会浮现什么?暗色斗篷扬起的烟尘、往上升腾的幽蓝灵魂、刀刃划过的发光残影、地面散开的黑色法阵。这类效果几乎是暗黑系BOSS战、召唤仪式和死亡结算画面的标配。在UE里把这类效果做出来,今天绕不开的工具就是Niagar…

2026/10/6 23:24:53

用JavaScript优化大模型调用:Token压缩、缓存与模型路由实战

平时写 JavaScript 多半是在折腾页面交互、接口数据,但你可能没想到,它也能跑去给大语言模型“打理财务”。我这里说的不是炒股,而是真正帮大语言模型省钱省电:用 200 行不到的 JavaScript,写了一个能压缩请求、缓存结…

2026/10/6 23:24:53

RTS5411 Type-C USB3.0 HUB 原理图与PCB设计全解析

1. 为什么选择 RTS5411 来做这个 USB3.0 HUB1.1 从一颗芯片说起:RTS5411 的定位与核心优势搞硬件设计的同行应该都有体会,USB HUB 芯片市场长期被几家大厂把持,选型时既要看通道数、协议支持,又要考虑封装、功耗、外围元件数量和整…

2026/10/6 23:24:53

AI Agent 记忆底座实战:从向量库选型到检索策略与更新机制

前阵子帮朋友排查一个客服 Agent 的诡异行为:客户在对话里明确说了三遍“以后公司统一走银行转账,不再用支付宝了”,Agent 当时答应得好好的,下一轮客户问“收款有什么要注意的”,它张口就是“支持支付宝付款&#xff…

2026/10/6 23:24:53

MOS管衬底接法全解析:从原理图到版图的避坑指南

1. 衬底到底该接哪儿:一个被很多人忽略的基础问题做模拟电路或者版图的朋友,尤其是刚入行的,大概率都遇到过这个场景:画原理图的时候,NMOS的衬底引脚随手就接到了地上,PMOS的衬底引脚随手就接到了电源上&am…

2026/10/6 23:19:53

CPU性能优化方法论:从流水线、缓存到伪共享的硬件原理

1. 硬件为什么快:藏在芯片里的几台“流水线工厂”硬件体系结构这门学问,听起来像是学电脑的人才会碰的东西。但你要是经历过线上服务偶发超时、数据库连接被打满、或者同一套代码换台机器性能翻倍却说不清原因,就会意识到:硬件不是…

2026/10/5 6:32:56

Jev+Agent接管浏览器:browser-use实战与jev-ultrafast性能优化

1. 从“Jev”说起:为什么我要把Agent接进浏览器“Jev”这个词最近在圈子里出现的频率越来越高,很多人第一次听到会以为是某个新模型的名字,其实它更像是一种思路——把Jev模型的能力当作底座,通过Agent的方式去接管浏览器&#xf…

2026/10/6 4:01:51

多智能体集群实战:DeepAgents编排、MCP与A2A协议及Skills体系

1. 从"单兵作战"到"集群协同":多智能体编排到底在解决什么问题如果你最近在折腾 Agent 相关的东西,大概率会有一种感觉:单个 Agent 能做的事情,其实很快就摸到天花板了。你给它一个提示词,挂几个工…

2026/10/6 17:46:51

无源低通滤波器设计实战:从RC到LC,手把手教你避开那些坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 0:03:23

MR25H40CDF+STM32F031C6工业级高可靠数据存储方案

1. 项目概述:为什么在工业现场非得用 MR25H40CDF 配 STM32F031C6 做数据存储?在工厂产线的 PLC 控制柜里、在风电变流器的散热片背面、在矿井监测终端的金属外壳下,你经常能看到一块指甲盖大小的黑色芯片——它既不是 Flash,也不是…

2026/10/6 0:03:23

MRAM+STM32工业断电数据保全实战指南

1. 项目概述:为什么在工业现场非得用 MR25H40CDF 配 STM32F031C6 做数据存储?在工厂产线的PLC柜里、在野外无人值守的环境监测终端里、在高速运转的包装机控制板上,你经常能看到一块指甲盖大小的黑色芯片,旁边贴着“MR25H40CDF”丝…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑