|
存储数据——利用STM32中的FLASH,
尽量少写入,可以在写入前加入一些判断,看看是否有必要存储。
首先
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中存储的数据是否有效。
{
for(i = 0;i< 6;i++){
if(!isalnum(Seat.SeatByte))
break;
}
Seat.SeatStorage[3] = 0;
if(i != 0)
DispSeat(Seat.SeatByte,i);
}
写入数据。
if((strcmp(Seat.SeatByte ,seat)!=0)){
strcpy(Seat.SeatByte, seat);
EE_WriteVariable(VirtAddVarTab[0], Seat.SeatStorage[0]);
EE_WriteVariable(VirtAddVarTab[1], Seat.SeatStorage[2]);
EE_WriteVariable(VirtAddVarTab[2], Seat.SeatStorage[3]);
} |
|