尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
【嵌入式】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 透写,如不开启透写,实际使用中可能遇到各种问题 */}
RELATED

相关推荐

llama.cpp默认effort-level优化:从xhigh到medium的性能提升实践

llama.cpp默认effort-level优化:从xhigh到medium的性能提升实践

如果你最近在本地部署或使用 Qwen3.8-27B 这类大语言模型,很可能在启动 llama.cpp 时遇到过这样的困惑:为什么默认的 --effort-level 参数是 xhigh ?这个设置对推理速度影响有多大?有没有更平衡的选择? 这个看似微…

📅 2026/10/26 22:24:29
企业级AI原生应用落地:从试点到规模化的真实路径

企业级AI原生应用落地:从试点到规模化的真实路径

摘要 2026奇点智能技术大会"企业级AI原生应用与落地"专题直面一个尴尬现实:70%的企业AI试点项目无法走到规模化阶段。本文基于京东段楠、阿里云杨文婷、网易智企冀明利3位已确认嘉宾的工程经验,拆解企业AI转型的ROI评估矩阵、四阶段实施路径、5大常见陷阱,并附3个真…

📅 2026/10/17 9:31:46
Spring Boot+Vue在线考试系统全栈开发实战:从架构设计到部署上线

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

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

📅 2026/10/17 8:46:53
MORE NEWS

更多资讯

📰

Windows右键菜单优化:一键新建文件夹的注册表修改方法

1. 项目背景与需求解析 Windows资源管理器的右键菜单"新建"子菜单中,"文件夹"选项默认位于第二层级,需要先点击"新建"才能看到。对于频繁创建文件夹的用户而言,这个设计略显低效。通过修改注册表,我…

📰

Windows系统密码重置全攻略:原理与六种实战方法

1. Windows系统密码重置完整指南:从原理到实战遇到Windows登录密码遗忘的情况,无论是个人电脑还是企业IT运维都经常需要处理。不同于普通软件重置,系统密码涉及安全验证机制,需要特定的技术手段。本指南将系统性地介绍六种主流密码…

📰

text-to-cad:从自然语言到参数化CAD模型的工程语义翻译

1. 什么是text-to-cad:不是“文字变图纸”的魔法,而是工程语义的精准翻译你搜“text-to-cad”时,大概率会撞上一堆CAD安装教程、STL修复技巧、中望CAD下载链接——这些全是下游应用,但text-to-cad本身,是上游范式革命。…

📰

零基础入门LibreCAD:从画第一条线到完整平面图

简介:LibreCAD 是一款基于 Qt 框架、以 C11 编写的跨平台开源 2D CAD 程序,支持 Windows、Linux 与 macOS,可读写 DXF、DWG 文件并导出 DXF、PDF、SVG。该资源面向设计师、工程师、学生及需要免费 CAD 替代方案的个人与企业用户,解…

📰

SDL2渲染器创建与销毁:SDL_CreateRenderer和SDL_DestroyRenderer详解

SDL2 这套东西,我用了快七八年,从最早的 SDL 1.2 迁移到 2.x 的时候,最不习惯的就是渲染这一块被彻底重构成了"渲染器 纹理"的双层结构。很多刚上手的朋友写第一行绘图代码时都会卡在同一个地方:窗口建好了&#xff0c…

📰

YOLOv6在农业辣椒检测中的优化与应用实践

1. 项目概述:当YOLO遇上辣椒田去年夏天,我在某农业示范基地第一次见识到这样的场景:烈日下的辣椒田里,巡检员举着平板电脑对植株拍照,屏幕上实时跳出红色方框标记出每一颗成熟辣椒,同时显示预估产量和成熟度…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬