Используйте flash для моделирования пользовательского опыта eeprom
void ee_flashInit() : Format Flash, только форматированная вспышка может использовать следующие две функции API.ee_uint8 ee_readDataFromFlash() : прочитать данныеee_uint8 ee_writeDataToFlash(); : Написать данныеvariableLists таблицы перечисления.Сначала введите файл заголовка и заполните четыре макроса в полном объеме в соответствии с комментариями
SECTOR_SIZE : размер емкости сектора (минимальная единица хранения вспышки) в настоящее время Flashee_flashWrite : Имя функции управления записи флэш -записиee_flashRead : Имя функции работы с прочтением флэш -чтенияee_flashEraseASector : Flash Erase A Sector (минимальный блок памяти флэш) Имя функции драйвераЗаполнимые макросы (без заполнения не влияет на работу функции)
BLOCk_SECTOR_NUM : Сколько секторов в блоке вспышки?Два специальных макроса:
SECTORS(x) : возвращает общий размер сектора xBLOCKS(x) : возвращает общий размер блока x . Чтобы использовать этот макрос, вам необходимо заранее заполнить заранее Macro BLOCk_SECTOR_NUM . Вышеуказанные два макроса в основном используются для передачи параметров функции ee_flashInit() для облегчения использования адресов флэш -адресов.
Пример:
// 首先在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 может превратить только 1 в 0 и может превратить только 0 в 1, стирая весь сектор (минимальная структура хранения вспышки). Следовательно, если письменный адрес написан, если он написан снова, он неизбежно приведет к тому, что бит станет 0, который станет 1, что приведет к недействительности данных.
Идея этой программы состоит в том, чтобы написать данные, которые вы хотите переписать в область, которая не была написана позже. Данные, написанные ранее, будут признаны недействительными, и последние письменные данные будут рассматриваться как действительные. Подождите, пока вся область не будет заполнена, перенесите допустимые данные в другую область, а затем стереть всю текущую область.
Схема внутренней структуры Flash, реализованную программой:

После выполнения void ee_flashInit() форматирующая вспышка форматирования форматированной флэш -памяти показана на рисунке выше.
Общая площадь индекса: содержит две области: область индекса и зона переписывания
Область индекса : индексная структура, используемая для хранения каждого данных. Положение адреса каждой индексной структуры фиксируется. Например, адрес данных № 1 составляет 0x00, тогда адрес данных № 2 составляет 0x08. Пользователь может указать размер области индекса. Для спецификации размера, пожалуйста, обратитесь к следующей формуле: количество данных, которые можно хранить в области индекса = общее количество байтов в области индекса/8
/* 数据索引结构 */
typedef struct
{
/* 当前数据状态 */
ee_uint16 dataStatus ;
/* 当前数据大小 */
ee_uint16 dataSize ;
/* 当前数据在数据区的地址(相对于dataStartAddr的偏移地址) */
ee_uint16 dataAddr ;
/* 当前数据被重写的地址(相对于overwriteAddr的偏移地址),默认为0xFFFF */
ee_uint16 dataOverwriteAddr ;
} ee_dataIndex ;Область переписывания : когда данные в области индекса данных переписаны, структура индекса перезаписывания сохраняется в текущей области
Переписать область подсчета : автоматически выделена программой, и пользователю не нужно заботиться. Эта область записывает, сколько раз была записана текущая зона переписывания, и используется для поиска свободного расположения зоны переписывания.
Область данных: Сохраните фактическое значение, которое мы храним во флеш. Размер и чтение и списание. Адрес смещения каждого значения управляется индексной структурой области индекса.
Обменная область : Когда область активности заполнена, все достоверные индексы данных в области активности передаются в эту область в качестве области активности и в то же время очищают предыдущую область активности и используют ее в качестве следующей области деятельности.
Управление статусом :
Управление государством используется для борьбы с различными аномальными явлениями микроконтроллеров, такими как отключение питания микроконтроллера при работе.