Verwenden Sie flash , um die Benutzererfahrung von eeprom zu simulieren
void ee_flashInit() : Formatblitz, nur der formatierte Blitz kann die folgenden zwei API -Funktionen verwenden.ee_uint8 ee_readDataFromFlash() : Daten lesenee_uint8 ee_writeDataToFlash(); : Schreiben Sie DatenvariableLists beibehalten, um Daten durch diese Tabelle in Flash zu lesen und zu schreibenGeben Sie zuerst die Header -Datei ein und füllen Sie die vier Makros gemäß den Kommentaren vollständig aus
SECTOR_SIZE : Die Kapazitätsgröße eines Sektors (die minimale Speichereinheit von Flash) derzeit Blitzee_flashWrite : Flash -Schreibbetriebs -Treiber -Funktionsnameee_flashRead : FLASH -LESER -OPTER -Treiber -Funktionsnameee_flashEraseASector : Flash -Löschen eines Sektors (die minimale Speichereinheit von Flash) TreiberfunktionsnameFüllbare Makros (keine Füllung hat keinen Einfluss auf den Funktionsbetrieb)
BLOCk_SECTOR_NUM : Wie viele Sektoren gibt es in einem Blitzblock?Zwei spezielle Makros:
SECTORS(x) : Gibt die Gesamtgröße x -Sektors zurückBLOCKS(x) : Gibt die Gesamtgröße x -Blocks zurück. Um dieses Makro zu verwenden, müssen Sie das makro BLOCk_SECTOR_NUM im Voraus ausfüllen. Die beiden oben genannten Makros werden hauptsächlich verwendet, um Parameter der Funktion ee_flashInit() zu übertragen, um die Verwendung von Flash -Adressen zu erleichtern.
Beispiel:
// 首先在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 kann nur 1 in 0 verwandeln und nur durch Löschen eines gesamten Sektors (die minimale Speicherstruktur von Blitz) in 1 verwandeln. Wenn also eine schriftliche Adresse geschrieben wird, wenn sie erneut geschrieben ist, wird sie zwangsläufig dazu führen, dass das Bit zu 0 wird, was zu einer Daten inviziert wird.
Die Idee dieses Programms besteht darin, die Daten zu schreiben, die Sie neu geschrieben haben, in den Bereich, der später nicht geschrieben wurde. Die zuvor geschriebenen Daten werden ungültig und die neuesten schriftlichen Daten werden als gültig angesehen. Warten Sie, bis der gesamte Bereich voll ist, die gültigen Daten in einen anderen Bereich übertragen und dann den gesamten aktuellen Bereich löschen.
Das vom Programm implementierte interne Strukturdiagramm von Flash:

Nach der Ausführung von void ee_flashInit() Formatierungsblitz ist das formatierte Blitzlayout in der obigen Abbildung dargestellt.
Gesamtindexbereich: Enthält zwei Bereiche, Indexbereich und Umschreiben Sie die Fläche
Indexbereich : Die zum Speichern jeder Daten verwendete Indexstruktur. Die Adressposition jeder Indexstruktur ist festgelegt. Beispielsweise beträgt die Adresse der Daten Nr. 1 0x00, dann die Adresse der Daten Nr. 2 0x08. Der Benutzer kann die Größe des Indexbereichs angeben. Für die Größenspezifikation finden Sie in der folgenden Formel: Die Anzahl der Daten, die im Indexbereich gespeichert werden können = die Gesamtzahl der Bytes im Indexbereich/8
/* 数据索引结构 */
typedef struct
{
/* 当前数据状态 */
ee_uint16 dataStatus ;
/* 当前数据大小 */
ee_uint16 dataSize ;
/* 当前数据在数据区的地址(相对于dataStartAddr的偏移地址) */
ee_uint16 dataAddr ;
/* 当前数据被重写的地址(相对于overwriteAddr的偏移地址),默认为0xFFFF */
ee_uint16 dataOverwriteAddr ;
} ee_dataIndex ;Umschreiben Sie den Bereich neu : Wenn die Daten im Datenindexbereich umgeschrieben werden
Umschreiben Sie den Zählbereich um : vom Programm automatisch zugewiesen, und der Benutzer muss sich nicht darum kümmern. In diesem Bereich wird aufgezeichnet, wie oft der aktuelle Umschreibungsbereich geschrieben wurde und verwendet wird, um den kostenlosen Standort des Umschreibebereichs zu finden.
Datenbereich: Speichern Sie den tatsächlichen Wert, den wir in Flash speichern. Die Größe und das Lesen und Schreiben von Offset -Adresse jedes Wertes werden von der Indexstruktur des Indexbereichs verwaltet.
Austauschbereich : Wenn der Aktivitätsbereich voll ist, werden alle gültigen Datenindizes des Aktivitätsbereichs als Aktivitätsbereich in diesen Bereich übertragen und gleichzeitig den vorherigen Aktivitätsbereich löschen und als nächstes Aktivitätsbereich verwenden.
Statusverwaltung :
Das Staatsmanagement wird verwendet, um verschiedene abnormale Phänomene von Mikrocontrollern wie den Stromausfall des Mikrocontrollers beim Betrieb von Blitz zu behandeln.