flash 사용하여 eeprom 의 사용자 경험을 시뮬레이션하십시오
void ee_flashInit() : 형식 플래시, 형식화 된 플래시 만 다음 두 API 함수를 사용할 수 있습니다.ee_uint8 ee_readDataFromFlash() : 데이터 읽기ee_uint8 ee_writeDataToFlash(); : 데이터 작성variableLists 만 유지하면됩니다.먼저 헤더 파일을 입력하고 주석에 따라 4 개의 매크로를 전체적으로 채 웁니다.
SECTOR_SIZE : 현재 플래시의 부문의 용량 크기 (플래시의 최소 저장 장치)ee_flashWrite : 플래시 쓰기 작동 드라이버 기능 이름ee_flashRead : 플래시 읽기 작동 드라이버 기능 이름ee_flashEraseASector : 플래시 지우기 섹터 (플래시의 최소 메모리 단위) 드라이버 기능 이름충전 가능한 매크로 (충전 없음 기능 작동에는 영향을 미치지 않음)
BLOCk_SECTOR_NUM : 플래시 블록에 몇 개의 섹터가 있습니까?두 개의 특별한 매크로 :
SECTORS(x) : x 섹터의 총 크기를 반환합니다.BLOCKS(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으로 바꿀 수 있으며 전체 섹터 (Flash의 최소 저장 구조)를 지우면 0 만 1으로 바꿀 수 있습니다. 따라서 서면 주소가 작성되면 다시 작성되면 필연적으로 0이되어 1이되어 데이터가 무효화됩니다.
이 프로그램의 아이디어는 나중에 작성되지 않은 영역에 다시 작성하려는 데이터를 작성하는 것입니다. 이전에 작성된 데이터는 무효화되며 최신 서면 데이터는 유효한 것으로 간주됩니다. 전체 영역이 가득 찼을 때까지 기다렸다가 유효한 데이터를 다른 지역으로 전송 한 다음 모든 현재 영역을 지우십시오.
프로그램에서 구현 한 플래시의 내부 구조 다이어그램 :

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 ;영역 재 작성 : 데이터 인덱스 영역의 데이터가 다시 작성되면 현재 영역에 다시 쓰기 인덱스 구조가 저장됩니다.
카운팅 영역을 다시 작성 : 프로그램에 자동으로 할당되면 사용자는 관리 할 필요가 없습니다. 이 영역은 현재 재 작성 영역이 몇 번이나 작성되었으며, 재 작성 영역의 무료 위치를 찾는 데 사용됩니다.
데이터 영역 : 플래시로 저장하는 실제 값을 저장하십시오. 각 값의 크기 및 읽기 및 쓰기 오프셋 주소는 인덱스 영역의 인덱스 구조에 의해 관리됩니다.
교환 영역 : 활동 영역이 가득 차면 활동 영역의 모든 유효한 데이터 인덱스는이 영역으로 활동 영역으로 전송되며 동시에 이전 활동 영역을 지우고 다음 활동 영역으로 사용하십시오.
상태 관리 :
상태 관리는 플래시를 작동 할 때 마이크로 컨트롤러의 정전과 같은 마이크로 컨트롤러의 다양한 비정상 현상을 처리하는 데 사용됩니다.