eeprom en flash
introduire
Ce code implémente la fonction EEPROM de simulation flash simple. Vous pouvez appeler l'interface EEPROM au niveau supérieur en implémentant simplement l'interface de fonctionnement flash sous-jacente. Convient pour des projets avec moins de stockage de données EEPROM
principe
L'espace flash fourni à l'EEPROM est divisé en deux partitions, chaque partition peut contenir plusieurs pages d'effacement, qui sont effacées uniformément pendant l'effacement. Quelle partition est actuellement utilisée est déterminée par le début used_mark. Les données réelles et l'adresse virtuelle EEPROM forment une unité de programmation. Lors de l'écriture, les nouvelles données sont écrites en séquence et lors de la lecture, la dernière valeur est la valeur valide. Lorsqu'une partition est pleine, les données sont copiées dans une autre partition.
Instructions de transplantation
- Copier eeprom_in_flash.c et eeprom_in_flash.h au projet
- Implémentez l'interface d'appel sous-jacente de EE_ERASEPART, EE_PROGRAMWORD et EE_READWORD. Vous pouvez vous référer à l'exemple eeprom_port
- Modifier la définition de macro dans eeprom_in_flash.h, configurer la taille de l'adresse flash et d'autres paramètres connexes
- Eeprom_num_max: le nombre maximum de données EEPROM, l'unité est le nombre de données 16 bits. La plage facultative est limitée par la taille minimale de partition et doit être inférieure à (eeprom_part_size_min / 4-1)
- Eeprom_part0_size / eeprom_part1_size: la taille de deux partitions, qui peuvent être de tailles différentes. Chaque partition peut contenir plusieurs pages effacées, qui est un multiple entier de la page minimale effacée.
- Eeprom_start_address: utilisé pour simuler l'adresse de démarrage flash d'Eeprom
Instructions pour une utilisation
//参数:eeprom初始化值,NULL则无初始值
int EEPROM_Init ( void * default_data );
int EEPROM_Format ( void * default_data );
//参数Address:eeprom的地址,一个地址保存16bit数据,范围0 - (EEPROM_NUM_MAX-1)
//参数length:读写buf的长度,为16bit数据的个数
uint16_t EEPROM_Read ( uint16_t Address );
int EEPROM_Write ( uint16_t Address , uint16_t Data );
int EEPROM_Read_Buf ( uint16_t Address , uint16_t * buf , uint16_t length );
int EEPROM_Write_Buf ( uint16_t Address , uint16_t * buf , uint16_t length );
//参数addr:eeprom存储空间的地址,单位byte,与上面eeprom的参数呈2倍关系,地址空间不可重复,必须2字节对齐,范围0 - (EEPROM_NUM_MAX-1)*2
//参数length:读写buf的长度,单位字节长度,必须2字节对齐
int Config_Read_Buf ( uint16_t addr , void * buf , uint16_t length );
int Config_Write_Buf ( uint16_t addr , void * buf , uint16_t length );
Limitations d'utilisation
- L'unité de programmation minimale est de 32 bits ou moins
- Il y a au moins deux pages effaçables à utiliser
- La quantité maximale d'EEPROM stockée est inférieure à un quart de l'espace flash disponible
- La valeur claire après effacement est de 0xff
Caractéristiques
- Part des ressources très faible, adaptée aux petits projets de microcontrôleur
- Prise en charge de l'équilibre de l'usure de programmation effaçant Flash
- Prend en charge une panne de courant sûre à tout moment , avec une grande fiabilité
- Toutes les données sont tamponnées en mémoire, et la vitesse de lecture et d'écriture est rapide
- Le programme de mise à jour n'affecte pas le contenu stocké. Il peut être mis à jour progressivement ou vous pouvez choisir de ne pas utiliser d'anciennes données.
- Prend en charge l'interface d'impression logarithmique pour un débogage facile
- Prend en charge le microcontrôleur 8 bits
- La vérification de l'exactitude des données n'est pas prise en charge
Choses à noter
- Lors de l'appel de l'interface de lecture et d'écriture EEPROM, faites attention à la plage d'adresse et de longueur et ne couvrez pas différentes plages d'adresses de données.
- Interface de programmation d'adresse flash ee_programword. Si 32 bits écrit aux opérations atomiques, vous devez d'abord écrire 16 bits plus bas, puis écrire 16 bits plus haut et 16 bits plus haut.