首先来看看虚拟地址是什么? 对于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 次 变量写入
还有就是FLASH的读写过程都是先解锁HAL_FLASH_Unlock();,最后上锁HAL_FLASH_Lock(); 具体看怎么使用虚拟地址 #defineNumbOfVar ((uint8_t)0x03) 定义要写的 halfword 数量。
用的时候需要定义一个数组
/* Virtual address defined by the user: 0xFFFF value is prohibited */
uint16_t VirtAddVarTab[NumbOfVar];
需初始化
for(u16 i=0;i
{
VirtAddVarTab = i; //就是为每个变量分配一个地址,这个地址是虚的,只要不重复就可以。
}
|