[开发工具]

IAR6.5 下如何将数据存放至 Flash 中

[复制链接]
587|7
手机看帖
扫描二维码
随时随地手机跟帖
药无尘|  楼主 | 2021-11-15 13:11 | 显示全部楼层 |阅读模式
一. 应用背景
当客户遇到存储小量的数据,同时数据写的频率比较低的情况下。从成本角度希望省掉外置 EEPROM, STM32 提供了
Backup SRAM(4K)和 Flash 模拟 EEPROM 两种方案来解决该问题。但是, Backup SRAM 需要提供备用电源, Flash 模拟
EEPROM 又比较浪费空间(存放复杂的结构体数据也不方便)。 如果数据擦鞋频率较低( Flash 擦写次数有限),可以考虑
直接将数据存放在 Flash 中。本文提供了如 何在 IAR6.5 实现该操作。  

使用特权

评论回复
药无尘|  楼主 | 2021-11-15 13:12 | 显示全部楼层
二. IAR 下的实现
1. icf 文件的配置
在 IAR 的 linker, config file editer 中设置中断向量表位置保持不变 0x0800 0000,代码的存放地址设 置为 0x0800 8000 ~
0x080F FFFF。我们将数据保存在 0x0800 4000 ~ 0x0800 7FFF 中。

同时在.icf 文件中做添加脚本:
define symbol ICFEDIT_region_DATAROM_start = 0x0800 4000;
define symbol ICFEDIT_region_DATAROM_end = 0x0800 7FFF;
define region DATA_region = mem:[from ICFEDIT_region_DATAROM_start to
ICFEDIT_region_DATAROM_end ];
place in DATA_region { readonly section .rom_data };


使用特权

评论回复
药无尘|  楼主 | 2021-11-15 13:14 | 显示全部楼层
2. 预编译的处理
#define DATA_ROM _Pragma("location=\".rom_data\"")
DATA_ROM const uint32_t test_data[] = {32,33,34};
DATA_ROM const uint32_t test_data2[] = {33,33,34};
编译后的.map 文件中
683036191ec9a85162.png
可以看到 test_data 已经放在了我们希望存储的地址。
用户可以通过调用标准外设库提供的 flash 函数对该数据进行修改。  




使用特权

评论回复
drer| | 2021-12-9 20:56 | 显示全部楼层
跟版本没关系的

使用特权

评论回复
gwsan| | 2021-12-9 20:57 | 显示全部楼层
貌似我还没看见过这个工具的操作手册

使用特权

评论回复
kxsi| | 2021-12-9 21:02 | 显示全部楼层
如果地址设置错了怎么办

使用特权

评论回复
nawu| | 2021-12-9 21:03 | 显示全部楼层
我觉得可以不用顾虑次数

使用特权

评论回复
qcliu| | 2021-12-9 21:07 | 显示全部楼层
这个就是下载时候的配置了吧

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

73

主题

449

帖子

2

粉丝