[开发工具] IAR6.5 下如何将数据存放至 Flash 中

[复制链接]
999|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 文件中做添加脚本:
  1. define symbol ICFEDIT_region_DATAROM_start = 0x0800 4000;
  2. define symbol ICFEDIT_region_DATAROM_end = 0x0800 7FFF;
  3. define region DATA_region = mem:[from ICFEDIT_region_DATAROM_start to
  4. ICFEDIT_region_DATAROM_end ];
  5. place in DATA_region { readonly section .rom_data };


 楼主| 药无尘 发表于 2021-11-15 13:14 | 显示全部楼层
2. 预编译的处理
  1. #define DATA_ROM _Pragma("location=".rom_data"")
  2. DATA_ROM const uint32_t test_data[] = {32,33,34};
  3. 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 | 显示全部楼层
这个就是下载时候的配置了吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则

79

主题

623

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部