Utilisez flash pour simuler l'expérience utilisateur de eeprom
void ee_flashInit() : Format Flash, seul le flash formaté peut utiliser les deux fonctions API suivantes.ee_uint8 ee_readDataFromFlash() : lire les donnéesee_uint8 ee_writeDataToFlash(); : Écrire des donnéesvariableLists pour lire et écrire des données dans Flash via ce tableauEntrez d'abord le fichier d'en-tête et remplissez les quatre macros en totalité en fonction des commentaires
SECTOR_SIZE : la taille de la capacité d'un secteur (l'unité de stockage minimale de flash) à l'heure actuelleee_flashWrite : Flash Write Operation Operation Driver Fonction Nomee_flashRead : Flash Lire le nom de la fonction du pilote d'opérationee_flashEraseASector : Flash Effacer un secteur (l'unité de mémoire minimale de Flash) Nom de la fonction du piloteMacros remplissables (aucun remplissage n'affecte le fonctionnement de la fonction)
BLOCk_SECTOR_NUM : Combien de secteurs y a-t-il dans un bloc de flash?Deux macros spéciales:
SECTORS(x) : renvoie la taille totale du secteur xBLOCKS(x) : Renvoie la taille totale x . Pour utiliser cette macro, vous devez remplir à l'avance la macro BLOCk_SECTOR_NUM . Les deux macros ci-dessus sont principalement utilisées pour transférer les paramètres de la fonction ee_flashInit() pour faciliter l'utilisation d'adresses flash.
Exemple:
// 首先在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 );
}Le flash ne peut transformer 1 en 0 et ne peut transformer 0 en 1 en effaçant un secteur entier (la structure de stockage minimale de Flash). Par conséquent, si une adresse écrite est écrite, si elle est écrite à nouveau, elle entraînera inévitablement le bit qui est devenu 0 de devenir 1, entraînant l'invalidation des données.
L'idée de ce programme est d'écrire les données que vous souhaitez réécrire dans la zone qui n'a pas été écrite plus tard. Les données écrites auparavant seront invalidées et les dernières données écrites seront considérées comme valides. Attendez que toute la zone soit pleine, transférez les données valides dans une autre zone, puis effacez toute la zone actuelle.
Le diagramme de structure interne du flash implémenté par le programme:

Après avoir effectué le flash de formatage void ee_flashInit() , la disposition du flash formatée est illustrée dans la figure ci-dessus.
Zone d'index total: contient deux zones, la zone d'index et la zone de réécriture
Zone d'index : La structure d'index utilisée pour stocker chaque données. La position d'adresse de chaque structure d'index est fixe. Par exemple, l'adresse des données n ° 1 est 0x00, alors l'adresse des données n ° 2 est 0x08. L'utilisateur peut spécifier la taille de la zone d'index. Pour la spécification de taille, veuillez vous référer à la formule suivante: Le nombre de données qui peuvent être stockées dans la zone d'index = le nombre total d'octets dans la zone d'index / 8
/* 数据索引结构 */
typedef struct
{
/* 当前数据状态 */
ee_uint16 dataStatus ;
/* 当前数据大小 */
ee_uint16 dataSize ;
/* 当前数据在数据区的地址(相对于dataStartAddr的偏移地址) */
ee_uint16 dataAddr ;
/* 当前数据被重写的地址(相对于overwriteAddr的偏移地址),默认为0xFFFF */
ee_uint16 dataOverwriteAddr ;
} ee_dataIndex ;Zone de réécriture : lorsque les données de la zone d'index de données sont réécrites, la structure de l'indice de réécriture est enregistrée dans la zone actuelle
Réécrivez la zone de comptage : attribué automatiquement par le programme et l'utilisateur n'a pas besoin de s'en soucier. Cette zone enregistre combien de fois la zone de réécriture actuelle a été écrite et est utilisée pour localiser l'emplacement libre de la zone de réécriture.
Zone de données: Enregistrez la valeur réelle que nous stockons dans Flash. L'adresse de décalage de taille et de lecture et d'écriture de chaque valeur est gérée par la structure d'index de la zone d'index.
Zone d'échange : Lorsque la zone d'activité est pleine, tous les indices de données valides de la zone d'activité sont transférés dans cette zone comme zone d'activité et en même temps, effacer la zone d'activité précédente et l'utiliser comme zone d'activité suivante.
Gestion du statut :
La gestion de l'État est utilisée pour traiter divers phénomènes anormaux de microcontrôleurs, tels que la panne de courant du microcontrôleur lors du fonctionnement du flash.