STM32H743+CubeIDE-将变量定义到指定的内存


相关笔记:
STM32H743+CubeMX-梳理MPU的设置
STM32CubeIDE教程-查看FLASH与RAM细节

一、前言

在实际项目中,充分发挥STM32H7的性能,必须将频繁存取的数据存放在DTCM内存。TCM:Tightly-Coupled Memory 紧密耦合内存,特点是跟内核速度一样(480M)。但是,其他内存(SRAM1,AXI SRAM,SRAM2,SRAM3等)跟CPU的通讯速度只有200M,CPU需要白白等待一段时间,才能把数据读取出来或者将数据存放进去。为了提高CPU与其他内存的通讯效率,Cortex-M7有了Cache(高速缓冲区,与CPU通讯速度400M)。但是,使用Cache并不是一件简单的事情,需要深入了解Cache的工作原理才能使用,这个笔记不讨论如何使用Cache。想了解Cache的使用,建议学习《安富莱_STM32-V7开发板_用户手册,含BSP驱动包设计(V3.2)》的第23章与第24章节。
在这里插入图片描述
STM32H743内存地址的分配:

  1. DTCM(在STM32CubeIDE称为RAM): 0x20000000 ~ 0x20020000(size:128K)
  2. AXI SRAM(RAM_D1) : 0x24000000 ~ 0x24080000(size:512K)
  3. AHB SRAM(RAM_D2):0x30000000 ~ 0x30048000(size:288K)
  4. SRAM4(RAM_D3):0x38000000 ~ 0x38010000(size:64K)

通过STM32CubeIDE编译成功后,可以通过Build Analyzer查看FLASH与RAM的情况,如下图所示:
关于Build Analyzer使用,参考我的另外一篇笔记《STM32CubeIDE教程-查看FLASH与RAM细节》
在这里插入图片描述

二、将变量定义到指定的内存

2.1、将变量定义到DTCM内存

普通方式定义的全局变量都被指定到DTCM内存。在STM32CubeIDE上不需要修改任何配置,普通方式定义的全局变量都被分配到DTCM内存上。试着看看定义的全局数组key[8]被放在哪里?通过Build Analyzer的Memory Detials的搜索功能查看到全局数组key存放的内存地址是0x20001920,属于DTCM内存的范围里。所以,使用CPU读写数组key肯定不会影响CPU的性能。
在这里插入图片描述
DTCM内存的大小仅仅只有128K,资源很宝贵。从下图看到,DTCM内存已经被使用掉47.52%了。如果项目规模较大,就需要考虑将一些全局变量存放到其他RAM里。比如一些变量仅仅在程序初始化阶段配置使用的,就可以将它们放到其他内存里。如果项目的规模较小,怎么样都不会把DTCM内存挤满,那么根本就不需要继续把这篇笔记看下去了。
在这里插入图片描述

2.2、将变量定义到RAM_D1内存

在ld链接文件分配一个用户段(section),段的名字是_D1_Area,段的地址是>RAM_D1,4个字节对齐。内容看不懂没关系,本文最后会解释。
在这里插入图片描述
接着,使用_attribute__((section(“name”)))声明变量。定义变量后,一定编译成功,Build Analyzer才会更新。

__attribute__((section("._D1_Area"))) uint8_t D1_array[8] = {0,};  //将数组定义到段_D1_Area里面。

在这里插入图片描述
进入DEBUG模式,进一步检查变量的内存地址。进入DEBUG模式后,需要点击“暂停”按钮才能显示变量的信息。从图片看到,数组D1_array的地址是0x24000000,属于RAM_D1的地址范围。
在这里插入图片描述

三、STM32CubeIDE实用技巧之ld链接文件解读

ST官方文件《STM32CubeIDE实用技巧之ld链接文件》,一定要认真读几遍。奇怪的是,我去ST官网试图搜索这份文件,根本搜不出来。我在google搜索上意外地搜到这份文件,看来还是google搜索给力啊。为此,我上传到百度网盘上,方便大家下载学习。一般使用上,只需了解ld链接文件上的MEMORY就可以。
链接:https://pan.baidu.com/s/1oz9wGy6M9A0cbkik0kA4fg
提取码:imim

3.1、内存(MEMORY)

STM32CubeIDE生成的ld链接文件的开头MEMORY,描述了当前项目上STM32芯片的内存架构。除了FLASH的属性是xr外,其他RAM内存都是xrw。xrw表示可执行,可读,可写。所以,在ld链接文件上,FLASH是不可写的。熟悉STM32的同学应该也知道其实FLASH也是可以写的,只需在程序里调用HAL库函数就能将数据写进去。
在这里插入图片描述
在这里插入图片描述

3.2、段(Section)

在定义变量到指定内存之前,用户需先定义一个段,才能将变量指定到段里(相当于内存里)。所以在调用__attribute__((section("._D1_Area"))) 之前,需要先在ld链接文件里创建段_D1_Area。
在这里插入图片描述
在这里插入图片描述

四、细节补充

  1. 在Keil 与 IAR环境下,建议直接参考《安富莱_STM32_V7开发板_用户手册,含BSP驱动包设计(V3.2)》的第25章与第26章,教程很不错。
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wallace Zhang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值