Use flash para simular la experiencia del usuario de eeprom
void ee_flashInit() : flash de formato, solo el flash formateado puede usar las siguientes dos funciones API.ee_uint8 ee_readDataFromFlash() : Leer datosee_uint8 ee_writeDataToFlash(); : Escribir datosvariableLists variables de la tabla para leer y escribir datos en Flash a través de esta tablaPrimero ingrese el archivo de encabezado y complete las cuatro macros en su totalidad según los comentarios
SECTOR_SIZE : el tamaño de capacidad de un sector (la unidad mínima de almacenamiento de flash) en la actualidad flashee_flashWrite : nombre de la función del controlador de operación de escritura flashee_flashRead : Nombre de la función del controlador de operación de lectura flashee_flashEraseASector : Flash borra un nombre de función del controlador (la unidad de memoria mínima de memoria)Macros relleno (ningún relleno no afecta la operación de la función)
BLOCk_SECTOR_NUM : ¿Cuántos sectores hay en un bloque de flash?Dos macros especiales:
SECTORS(x) : devuelve el tamaño total del sector xBLOCKS(x) : Devuelve el tamaño total del bloque x Para usar esta macro, debe completar el macro BLOCk_SECTOR_NUM por adelantado. Las dos macros anteriores se utilizan principalmente para transferir parámetros de la función ee_flashInit() para facilitar el uso de direcciones flash.
Ejemplo:
// 首先在flash_MemMang.h枚举类型中添加数据名,用于管理数据
typedef enum
{
// 用户将变量名添加到下面
G_MYSENSORDATA ,
G_FLOAT ,
// DATA_NUM用于标识flash中一共存了多少个数据(不允许删改)
DATA_NUM ,
} variableLists ;
//------------------主函数-------------
/* 创建flash管理句柄 */
ee_flash_t g_fm ;
/* 想要存入flash中的变量 */
int g_mySensorData = 16 ;
float g_float = 3.14 ;
char g_txt [ 20 ] = "change data test" ;
int main ( void )
{
int dataTmp = 0 ;
float ftmp = 0 ;
char tt [ 20 ];
/* 格式化传入地址的格式 */
ee_flashInit ( & g_fm , /* 管理句柄 */
SECTORS ( 0 ), /* 索引区起始地址 */
SECTORS ( 2 ), /* 交换索引区起始地址 */
2 , /* 总索引区大小(单位:扇区) */
1 , /* 索引区大小(详见README图例,indexRegionSize) */
SECTORS ( 4 ), /* 数据区起始地址 */
SECTORS ( 5 ), /* 交换数据区起始地址 */
1 ); /* 数据区大小(单位:扇区) */
/* 数据写入顺序错误,写入失败 */
ee_writeDataToFlash ( & g_fm , & g_float , sizeof ( g_float ), G_FLOAT );
ee_writeDataToFlash ( & g_fm , & g_mySensorData , sizeof ( g_mySensorData ), G_MYSENSORDATA );
/* 正确将数据写入flash */
ee_writeDataToFlash ( & g_fm , & g_mySensorData , sizeof ( g_mySensorData ), G_MYSENSORDATA );
ee_writeDataToFlash ( & g_fm , & g_float , sizeof ( g_float ), G_FLOAT );
/* 将数据读出 */
ee_readDataFromFlash ( & g_fm , & dataTmp , G_MYSENSORDATA );
ee_readDataFromFlash ( & g_fm , & ftmp , G_FLOAT );
/* 将G_FLOAT管理的数据改成g_txt */
ee_writeDataToFlash ( & g_fm , g_txt , strlen ( g_txt ) + 1 , G_FLOAT );
/* 再读取一次数据 */
dataTmp = 0 ;
ee_readDataFromFlash ( & g_fm , & dataTmp , G_MYSENSORDATA );
ee_readDataFromFlash ( & g_fm , & tt , G_FLOAT );
}Flash solo puede convertir 1 en 0, y solo puede convertir 0 en 1 borrando un sector completo (la estructura mínima de almacenamiento de flash). Por lo tanto, si se escribe una dirección escrita, si se escribe nuevamente, inevitablemente causará que el bit que se ha convertido en 0 se convierta en 1, lo que resulta en la invalidación de los datos.
La idea de este programa es escribir los datos que desea reescribir en el área que no se ha escrito más adelante. Los datos escritos antes se invalidarán y los últimos datos escritos se considerarán válidos. Espere hasta que toda el área esté llena, transfiera los datos válidos a otra área y luego borre toda el área actual.
El diagrama de estructura interna de Flash implementado por el programa:

Después de realizar el flash de formato void ee_flashInit() , el diseño de flash formateado se muestra en la figura anterior.
Área de índice total: contiene dos áreas, área de índice y área de reescritura
Área de índice : la estructura de índice utilizada para almacenar cada datos. La posición de dirección de cada estructura de índice es fija. Por ejemplo, la dirección de los datos No. 1 es 0x00, entonces la dirección de los datos No. 2 es 0x08. El usuario puede especificar el tamaño del área de índice. Para la especificación del tamaño, consulte la siguiente fórmula: el número de datos que se pueden almacenar en el área de índice = el número total de bytes en el área de índice/8
/* 数据索引结构 */
typedef struct
{
/* 当前数据状态 */
ee_uint16 dataStatus ;
/* 当前数据大小 */
ee_uint16 dataSize ;
/* 当前数据在数据区的地址(相对于dataStartAddr的偏移地址) */
ee_uint16 dataAddr ;
/* 当前数据被重写的地址(相对于overwriteAddr的偏移地址),默认为0xFFFF */
ee_uint16 dataOverwriteAddr ;
} ee_dataIndex ;Área de reescritura : cuando se reescriben los datos en el área del índice de datos, la estructura del índice de reescritura se guarda en el área actual
Reescribir el área de conteo : asignado automáticamente por el programa, y el usuario no necesita preocuparse. Esta área registra cuántas veces se ha escrito el área de reescritura actual y se utiliza para ubicar la ubicación gratuita del área de reescritura.
Área de datos: guarde el valor real que almacenamos en flash. El tamaño y la dirección de lectura y compensación de escritura de cada valor se gestionan mediante la estructura de índice del área de índice.
Área de intercambio : cuando el área de actividad está llena, todos los índices de datos válidos del área de actividad se transfieren a esta área como área de actividad y, al mismo tiempo, despejan el área de actividad anterior y usanlo como el siguiente área de actividad.
Gestión de estado :
La gestión del estado se utiliza para tratar varios fenómenos anormales de microcontroladores, como el interruptor de energía del microcontrolador al operar flash.