您好, 登录| 注册|
论坛导航
您好, 登录| 注册|
子站:
论坛首页    单片机MCU/嵌入式
  •  发帖
  • 收藏

看STM32FLASH模拟EEPROM的虚拟地址
阅读: 375 |  回复: 5 楼层直达

2019/01/27 14:18:11
1
lihui710884923[实习版主]
电源币:447 | 积分:1 主题帖:146 | 回复帖:482
LV8
师长

QQ截图20160321155901 【直播】最纯粹的技术直播!乐云老师带你实战电子负载

QQ截图20160321155901 【免费送】 美信MAX17220评估板免费试用免费送


先看一下falsh模拟eeprom的流程

首先

1、在ST 的网站上下载 AN2594 及例程。

2、在例程中src目录中找到eeprom.c 及inc目录中找到eeprom.h拷贝到自己的工程目录中。

3.、在工程中添加这个eeprom.c

4、在工程中的外设库里添加 stm32f10x_flash.c

5、在eeprom.c 文件中包含 #include "stm32f10x_flash.h"

6、main.c中包含include "eeprom.h"

7、添加数据,在 AN2594中,存入到FLASH的数据是以16位的方式存的。每个数据包含数据本身,还需要存16位的虚拟地址。所以在main.c中需要定义虚地址。:

/* Virtual address defined by the user: 0xFFFF value is prohibited */

uint16_t VirtAddVarTab[NumbOfVar] = {0x5555, 0x6666, 0x7777};

需要多少个16位的数据,将定义在 eeprom.h 中的将NumbOfVar修改成需要的个数。虚地址需要是16位,非0xFFFF,互不重复就可以。

定义数据,如果实际的数据不是16位的,可以定义一个联合来解决。

union {

uint16_t SeatStorage[NumbOfVar+1];

uint8_t SeatByte[NumbOfVar * 2+2];

}Seat;

8、使用时,先初始化

EE_Init();

读出数据

if((0 == EE_ReadVariable(VirtAddVarTab[0], &Seat.SeatStorage[0])) &&

(0 == EE_ReadVariable(VirtAddVarTab[1], &Seat.SeatStorage[1])) &&

(0 == EE_ReadVariable(VirtAddVarTab[2], &Seat.SeatStorage[2])))

// 可以用EE_ReadVariable的返回值是否为0判断FLASH中存储的数据是否有效。

标签 STM32
2019/01/28 19:35:10
2
lingyan
电源币:303 | 积分:31 主题帖:19 | 回复帖:1076
LV8
师长
学习
2019/02/11 10:36:42
3
lihui710884923[实习版主]
电源币:447 | 积分:1 主题帖:146 | 回复帖:482
LV8
师长

这里主要用到虚拟地址

如果理解文档中的图3,你就明白什么是虚拟地址。
对于EPPROM,读取数据是通过I2C的,传入的是Addr,读出的是数据。这里地址就是物理地址。
对于FLASH模拟EPPROM,我们假设FLASH里面的一块区域0x10000000-0x10001000这4K空间用来模拟,其中数据结构都是
typedef Struct
{
   UINT16 data; 
   UINT16 Address;
}STRUCT_EPPROM;
若在0x10000000处的数据为{0x0001, 0x5555}
这里面0x10000000就是物理地址,
结合一些逻辑和接口,就可以通过0x5555(结构体中的Address)这个地址找到数/数组,也就是被称为虚拟地址的原因
data就是内部存储的数据。


如 果 变 量 是 16 位,则每个变量都占用 32 位( 16 位数据加 16 位虚拟地址),这意味着每次 写入新数据时,各个变量分别使用 4 字节的 Flash 。也就是每个变量实际占用四个物理地址,每个 1 KB 页在变满之前可执行 256 次 变量写入

2019/02/11 12:11:05
4
lihui710884923[实习版主]
电源币:447 | 积分:1 主题帖:146 | 回复帖:482
LV8
师长

我们在103c8中,64K的flash

程序中我i们选择后4k作为物理地址来存储数据

#define EEPROM_START_ADDRESS    ((uint32_t)0x0800F000) /* EEPROM emulation start address:
                                                  after 4KByte of used Flash memory */


结束地址就是0x0800FFFF,就是4k的空间

2019/02/18 16:27:58
5
dianda341
电源币:0 | 积分:0 主题帖:8 | 回复帖:27
LV4
连长
2019/02/19 14:35:36
6
lihui710884923[实习版主]
电源币:447 | 积分:1 主题帖:146 | 回复帖:482
LV8
师长
看看有啥问题没?
客服热线
服务时间:周一至周五9:00-18:00
微信关注
免费技术研讨会
获取一手干货分享

互联网违法不良信息举报

Reporting Internet Illegal and Bad Information
editor@netbroad.com
022-58392381