# tinyFlash

一种轻量级的flash数据存储方案

## 设计原理

本方案采用两个扇区轮流使用的方法存储数据，每个扇区4096字节，扇区状态如下表：

|扇区编号|使用状态|数据分布|
|--------|----|---|
|扇区一 |使用中|0xAA ·······················································|
|扇区二 |未使用|0xFF ·······················································|

使用中的扇区数据分布如下表：

|扇区头部|K1|V1|K2|V2|.....|Kn|Vn|
|--------|----|---|----|----|----|-----|-----|
|32字节  |3字节|n字节|3字节|n字节|.....|3字节|n字节|

每个K-V数据存储形式如下表：

|第一字节|第二字节|第三字节|n个字节|
|--------|----|---|----|
|Key  |~Key|Len|Len个字节数据内容|

第一个字节存放的是数据的Key，取值范围是 0x01 - 0xFE

第二个字节的数据为Key取反，如果第二个字节的数据为0x00，表示该处存储的数据已被废弃

第三个自己表示数据长度，取值范围是0x01 - 0xFF

之后的字节是数据的内容，最长不得超过0xFF

## API介绍

-------------------------------------------------------------------------------
    bool tinyFlash_Init(unsigned long start_addr, unsigned long len);

函数功能：初始化tinyFlash

参数 start_addr：tinyFlash区域在Flash芯片上的起始地址

参数 len： tinyFlash区域总长度，单位字节

-------------------------------------------------------------------------------
    int tinyFlash_Read(unsigned char KEY, unsigned char * buf, unsigned char * len);

函数功能：从tinyFlash中读取Key中存储的数据内容，数据长度，或者删除数据

参数 KEY：要读取的Key

参数 buf：Key中存储的数据内容的传出指针，如果该指针为NULL，则只传输数据长度

参数 len: 传入的是最大能接受的数据长度，传输的是读取到的实际数据长度，如果为NULL则为删除该KEY

------------------------------------------------------------------------------
    int tinyFlash_Write(unsigned char KEY, unsigned char * buf, unsigned char len);

函数功能： 向tinyFlash中存储一个数据

参数 KEY： 要存储的数据的Key值

参数 buf： 要存储的数据内容

参数 len:  要存储的数据长度

------------------------------------------------------------------------------
    void tinyFlash_Format(void);

函数功能：格式化tinyFlash数据区域，擦除全部tinyFlash扇区

--------------------------------------------------------------------------------

## 接下来的工作
- 多扇区支持
- 数据加密
- 优化查找及存储速度
- 意外掉电防护