STM32 变量存储在片内FLASH的指定位置

STM32 变量存储在片内FLASH的指定位置

这里以STM32L4R5为例(官方出的DEMO板),将变量存储在指定的片内FLASH地址(0x081F8000)。

一、MDK Keil软件操作

uint8_t version[12] __attribute__((section(".ARM.__AT_0x081F8000")))= {0x11,0x12,0x13,0x14,0x15,0x16};

uint8_t version1[12] __attribute__((at(0x081F8010)))= {0x11,0x12,0x13,0x14,0x15,0x16};复制代码

如上图所示,采用上述方式,可以将version和version1分别存储在STM32单片机片内FLASH的0x081F8000和0x081F8010地址。

对于嵌入式系统或者单片机而言,通常会将一系列的配置文件存储在一个指定的区域(section)。也就是说,某种类型的变量存储在一个指定的区域内。在这里,就要修改STM32的链接文件了。

下图为STM32的默认链接文件配置。

20200310140231834.png (48.97 KB, 下载次数: 1)

下载附件

保存到相册

2022-10-4 14:23 上传

修改Scatter File文件。添加下图中红框内的代码,该代码的含义是定义一个区域RW_IROM2(段属性为UNINIT_FIXED_LOC),该区域的起始地址为0x081F8000,大小为0x00008000。.ANY(UNINIT_FIXED_LOC)表示存储任何段属性为UNINIT_FIXED_LOC的数据。

20200310141253364.png (22.88 KB, 下载次数: 6)

下载附件

保存到相册

2022-10-4 14:23 上传

取消1处的勾选,在2处选择自己修改过后的Scatter File。

20200310140527698.png (49.68 KB, 下载次数: 3)

下载附件

保存到相册

2022-10-4 14:23 上传

如此,在编程时,只需如此定义相应的数据类型。

uint8_t version2[12] __attribute__((section("UNINIT_FIXED_LOC"), zero_init));复制代码

在编译通过后,查看.map文件,可以看到0x081f8000处存储了0x0000000c大小的数据,段属性为UNINIT_FIXED_LOC

20200310142417547.png (22.02 KB, 下载次数: 3)

下载附件

保存到相册

2022-10-4 14:23 上传

二、IAR操作

在链接文件(.icf)中添加如下代码

define symbol __ICFEDIT_region_FIXED_LOC_start__ = 0x081F8000;

define region uninit_fixed_loc = mem:[from __ICFEDIT_region_FIXED_LOC_start__ size 32K];

place in uninit_fixed_loc { readonly section UNINIT_FIXED_LOC }; 复制代码

三、注意

该文是将变量存储在STM32片内FLASH中,故对变量进行操作时,需要按照片内FLASH的操作方式进行,即先解锁,然后修改,再加锁。

————————————————

版权声明:老谭_酸菜

相关推荐

用纸包住的中药要拆开煮吗?老药师教你正确煎药姿势
外勤365下载安装版本

用纸包住的中药要拆开煮吗?老药师教你正确煎药姿势

⌛ 10-11 👁️ 6828
打游戏一体机十大排名
365bet网址

打游戏一体机十大排名

⌛ 09-27 👁️ 6308