硬汉嵌入式论坛

 找回密码
 立即注册
查看: 4180|回复: 7
收起左侧

[Flash] 使用STM32内部Flash模拟EEPROM务必告诉编译使用的扇区

  [复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106738
QQ
发表于 2020-3-2 00:23:13 | 显示全部楼层 |阅读模式

使用内部 Flash 模拟 EEPROM 切不可随意定义一个扇区使用。 因为编译器并不知道用户使用了这个扇区,导致应用程序也会编程到此扇区里面,所以就需要告诉编译器。

告诉 MDK 的方法如下(0x0810 0000 是 H7 的 BANK2 首地址):

  1. const uint8_t para_flash_area[128*1024] __attribute__((at(0x08100000)));
复制代码


告诉 IAR 的方法如下:

  1. #pragma location=0x08100000
  2. const uint8_t para_flash_area[128*1024];
复制代码



这里有两点特别注意:

1、模拟 EEPROM 的扇区可以定义到从第 2 个扇区开始的任何扇区,但不可以定义到首扇区,因为这个扇区是默认的 boot 启动地址。

2、如果应用程序不大的话,不推荐定义到末尾扇区,以 MDK 为例,定义到末尾扇区后,会导致整个 Flash空间都被使用,从而让程序下载下载时间变长。
回复

使用道具 举报

23

主题

211

回帖

280

积分

高级会员

积分
280
发表于 2021-5-13 11:28:21 | 显示全部楼层
硬汉,这样设置后,每次下载程序都会把已经保存的数据给覆盖掉吧?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106738
QQ
 楼主| 发表于 2021-5-13 14:53:21 | 显示全部楼层
blackfire531 发表于 2021-5-13 11:28
硬汉,这样设置后,每次下载程序都会把已经保存的数据给覆盖掉吧?

这么全局定义,会有个初始化,得设置下。

回复

使用道具 举报

22

主题

93

回帖

159

积分

初级会员

积分
159
发表于 2021-6-18 11:24:14 | 显示全部楼层
eric2013 发表于 2021-5-13 14:53
这么全局定义,会有个初始化,得设置下。

同问,这么定义一个全局变量para_flash_area,每次上电系统不就把这个全局变量都初始化为0了嘛,对应的flash也都变成0了,还怎么模方EEPROM?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106738
QQ
 楼主| 发表于 2021-6-18 11:33:20 | 显示全部楼层
shibinjie 发表于 2021-6-18 11:24
同问,这么定义一个全局变量para_flash_area,每次上电系统不就把这个全局变量都初始化为0了嘛,对应的fl ...

不会,这个是Flash,不是RAM。
只有在IDE使用下载算法才能操作Flash区。


回复

使用道具 举报

1

主题

20

回帖

23

积分

新手上路

积分
23
发表于 2021-6-18 12:16:13 | 显示全部楼层
我一般把这个地址放到flash的尾部,这样只要不是全片清除,数据还在
回复

使用道具 举报

334

主题

2032

回帖

3039

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3039
发表于 2021-6-18 14:39:13 | 显示全部楼层
eric2013 发表于 2021-5-13 14:53
这么全局定义,会有个初始化,得设置下。

怎么设置,可以避免在下载程序的时候把这个参数区给置零了呢?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106738
QQ
 楼主| 发表于 2021-6-18 15:29:51 | 显示全部楼层
caicaptain2 发表于 2021-6-18 14:39
怎么设置,可以避免在下载程序的时候把这个参数区给置零了呢?

这里有个SDRAM不初始化的设置,可以参考。
http://www.armbbs.cn/forum.php?mod=viewthread&tid=98697

1、程序定义__attribute__((section (".RAM_SDRAM"),zero_init)) uint32_t SDRAMSRAMBuf[10];
2、设置分散加载

1.png



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-3 06:13 , Processed in 0.177551 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表