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

【STM32】在链接脚本中指定DMA Buffer的地址

简介

在使用ARM Keil工具链的项目中,分散加载文件是编译过程中必不可少的一个文件,它在代码编译的链接期间起作用,链接器根据sct文件的配置分配各个节区地址,生成分散加载代码。就是.sct文件(Scatter-Loading File)。

其实在Linux环境下用gcc编译时也需要用到类似的文件,叫做链接脚本文件,就是.ld文件,例如在使用STM32CubeIDE工具的项目中。

如何查看和生成链接脚本

Keil项目为例,我们使用的是STM32F407ZGT6的MCU。STM32F407ZGT6 的存储器资源是分析链接脚本的基础:

  • Flash (ROM): 1 MB,起始地址 0x0800 0000
  • SRAM (RAM): 192 KB,分为:
    • 112KB SRAM1 + 16KB SRAM2,起始地址 0x2000 0000 (CPU和DMA均可访问)
    • 64KB CCMRAM,起始地址 0x1000 0000 (仅CPU可访问,DMA不能访问)

在魔术棒的target页中,我们已经配置了Flash和SRAM的地址和大小。(这里ROM的起始地址修改了,是因为我们的项目中有bootloader,并不影响本篇文章的介绍内容)

在这里插入图片描述
在这里插入图片描述

在Linker页中,有一个选项Use Memory Layout from Target Dialog,这个如果勾选后,就不允许点击Edit按钮了。也就是说.sct文件是根据target dialog中的配置自动生成的,我们可以到.\Haptic\Haptic.sct查看该文件。

LR_IROM1 0x08020000 0x00100000  {   ; 加载区域(Load Region),名为 LR_IROM1ER_IROM1 0x08020000 0x00100000  { ; 第一个执行区域(Execution Region),名为 ER_IROM1*.o (RESET, +First)              ; 向量表必须放在最开头*(InRoot$$Sections)              ; 特殊的库段(如 __main.o, __scatter*.o).ANY (+RO)                       ; 所有只读数据(代码和常量).ANY (+XO)}RW_IRAM1 0x20000000 0x00020000  { ; 第二个执行区域,名为 RW_IRAM1.ANY (+RW +ZI)                   ; 所有可读写数据(全局/静态变量)和未初始化数据}RW_IRAM2 0x10000000 0x00010000  { ; 第二个执行区域,名为 RW_IRAM2.ANY (+RW +ZI)                   ; 所有可读写数据(全局/静态变量)和未初始化数据}
}
  • LR_IROM1 定义了加载区域(Load Region)位于 Flash(起始地址 0x08020000,大小 0x00100000)。

  • ER_IROM1 定义了执行区域(Execution Region)位于 Flash,并指定了哪些代码段放置在此区域。

  • RW_IRAM1 定义了可读写区域(Read-Write Region)位于 SRAM(起始地址 0x20000000,大小 0x00020000),用于存放数据。

  • RW_IRAM2 定义了可读写区域(Read-Write Region)位于 SRAM(起始地址 0x10000000,大小 0x00010000),用于存放数据。

修改SCT文件

一般我们修改.sct文件是为了把函数放到SRAM中运行,或者把变量放在指定位置。我们使用自己修改的.sct文件,就需要这样配置:

在这里插入图片描述

这样配置后不再根据target dialog中的配置自动生成的.sct文件,并且我们可以直接Edit

将变量指定到某一块RAM中

在代码中定义数组时,使用 __attribute__((section("your_section_name"))) 来指定一个自定义的段名。例如在F407MCU中,DMA不能访问CCMRAM中的内存,但是可以访问其他地方的RAM。

/* 将数组放置在 SRAM1 的区域 */
uint8_t my_array_sram1[1024] __attribute__((section(".sram1_section")));

然后修改.sct文件

LR_IROM1 0x08020000 0x00100000  {   ; 加载区域(Load Region),名为 LR_IROM1ER_IROM1 0x08020000 0x00100000  { ; 第一个执行区域(Execution Region),名为 ER_IROM1*.o (RESET, +First)              ; 向量表必须放在最开头*(InRoot$$Sections)              ; 特殊的库段(如 __main.o, __scatter*.o).ANY (+RO)                       ; 所有只读数据(代码和常量).ANY (+XO)}RW_IRAM1 0x20000000 0x00020000  { ; 第二个执行区域,名为 RW_IRAM1.ANY (+RW +ZI)                   ; 所有可读写数据(全局/静态变量)和未初始化数据*(.sram1_section)                ; 将自定义的 sram1_section 段也放在这里}RW_IRAM2 0x10000000 0x00010000  { ; 第二个执行区域,名为 RW_IRAM2.ANY (+RW +ZI)                   ; 所有可读写数据(全局/静态变量)和未初始化数据}
}
http://www.xdnf.cn/news/19642.html

相关文章:

  • 智慧班牌系统基于Java+Vue技术栈构建,实现教育信息化综合管理。
  • shell脚本编辑(小白基础学习)
  • 从拿起简历(resume)重新找工作开始聊起
  • 【算法】算法题核心类别与通用解题思路
  • git基础命令
  • React中纯 localStorage 与 Context + useReducer + localStorage对比
  • HTML应用指南:利用GET请求获取MSN财经股价数据并可视化
  • IDEA Spring属性注解依赖注入的警告 Field injection is not recommended 异常解决方案
  • 【0426】insert into 内核实现之 找到 buffe, 插入 tuple (2)
  • YOLO 目标检测:YOLOv4数据增强、CIoU Loss、网络结构、CSP、SPPNet、FPN和PAN
  • 模型量化(Model Quantization) 和低精度计算(Low-Precision Computing)
  • 程序员与杀毒软件:一场不必要的“战争”?程序员用什么杀毒软件?-优雅草卓伊凡
  • pandas自学笔记16 pandas可视化
  • 2025年职场人士专业证书选择与分析
  • 免费GIS服务器方案:OGC标准3DTiles服务发布与跨平台渲染实践
  • word运行时错误‘53’,文件未找到:MathPage.WLL,更改加载项路径完美解决
  • 漏洞挖掘 渗透测试思路图总结
  • 洛谷 P1115 最大子段和
  • Onion-LO(已开源)——LIDAR里程计的统一框架
  • LeetCode 面试经典 150_滑动窗口_串联所有单词的子串(32_30_C++_困难)(滑动窗口:控制起点和滑动距离)
  • GPS:开启定位时代的科技魔杖
  • 四、操作系统
  • 松灵斯坦福Mobile ALOHA同款 | 通过低成本全身远程操作实现双手机器人移动操控学习
  • Docker的应用
  • 机器学习通关秘籍|Day 05:过拟合和欠拟合、正则化、岭回归、拉索回归、逻辑回归、Kmeans聚类
  • ubantu安装配置hive
  • GitLab 18.3 正式发布,更新多项 DevOps、CI/CD 功能【一】
  • Android入门到实战(六):Android主流图片加载框架
  • 夜莺监控新版表格配置图文讲解
  • TypeScript交叉类型、重复属性、类型断言和as const详解