NRF528xx 芯片外设常用函数与事件速查(八)-----FS/FDS
对于操作片內Flash,可用的方式有下表所示的3种:
1.通這芯片外設NVMC操作Flash
2.通过FS程序模快和FDS程序模块,
其中,NVMC的方式只能在裸机下使用,FS和FDS可 以在裸机和使能了SoftDevice的底用中使用。
Flash一共256个页面,每个页面4k byte,一共1MB大小
Flash 地址范围是:0x0000 0000~0x0010 0000
一、FS(Flash Storage)
-
ret_code_t nrf_fstorage_init(nrf_fstorage_t * p_fs,//FS的实例
--------------nrf_fstorage_api_t * p_api,//实现FLASH存储的API集,使用SoftDevice和不使用SoftDevice的API集不一样
--------------void * p_param);//给API集里的特定api传递参数
作用:初始化FS模块
示例://定义名称为my_fs的FS实例:定义回调函数和FS空间
-------NRF_FSTORAGE_DEF(nrf_fstorage_t my_fs) =//这里要写数据类型
------{
---------//FS事件回调函数
---------.evt_handler = fstorage_evt_handler,
---------//填入页数62的flash地址=4 * 1024 * 62
---------.start_addr = 0x3e000,
---------.end_addr = 0x3ffff,
------};
------void fstorage_evt_handler(nrf_fstorage_evt_t * p_evt){...}
------//设置API集实现
------nrf_fstorage_api_t * p_fs_api = &nrf_fstorage_nvmc;//没有使用SoftDevice
------//nrf_fstorage_api_t * p_fs_api = &nrf_fstorage_sd;//使用SoftDevice
------//初始化FS
------nrf_fstorage_init(&my_fs, p_fs_api, NULL); -
ret_code_t nrf_fstorage_erase(nrf_fstorage_t const * p_fs,//FS的实例
---------------------------------uint32_t page_addr,//页的起始地址
---------------------------------uint32_t len,//要擦除多少页
---------------------------------void * p_param);//给FS事件回调函数的参数,NULL
作用:擦除数据
示例:nrf_fstorage_erase(&my_fs, 0x3e000, 1,NULL); -
ret_code_t nrf_fstorage_write(nrf_fstorage_t const * p_fs,//FS的实例
---------------------------------uint32_t dest,//页的起始地址
---------------------------------void const * p_src,//写数组地址
---------------------------------uint32_t len,//数组长度
---------------------------------void * p_param);//给API集里的特定api传递参数,NULL
作用:写入数据
示例:nrf_fstorage_write(&my_fs, 0x3e000, &m_write_data, 256, NULL); -
ret_code_t nrf_fstorage_read(nrf_fstorage_t const * p_fs,//FS的实例
--------------------------------uint32_t addr,//页的起始地址
--------------------------------void * p_dest,//读数组地址
--------------------------------uint32_t len);//读多少数据
作用:读出数据
示例:nrf_fstorage_read(&my_fs, 0x3e000, &m_read_data,256); -
bool nrf_fstorage_is_busy(nrf_fstorage_t const * p_fs);
作用:检测FS模块是否繁忙
EVENT
NRF_FSTORAGE_EVT_WRITE_RESULT------------------//FS写完成事件
NRF_FSTORAGE_EVT_READ_RESULT-------------------//FS读完成事件
NRF_FSTORAGE_EVT_ERASE_RESULT------------------//FS擦除完成事件
二、FDS(Flash Data Storage)
FDS实现的是一令简单的文件系統,它极大地減少了数据损坏的风险,同時降低了开发人员和芯片FLASH的直接交互.
支持同步读和异步写
FDS通过文件ID 和 记录key来实现记录数据功能。文件由多条数据记录组成,记录由key作为索引,
并且相同的key索引可以记录多条数据。可以通过文件ID和记录key来查找记录数据
例如:File 1包含3条记录:0x2356 = "sdfsgf", 0x2525 = "ddew",0x2525 = "ssw"
记录key的范围是Ox0001一OxBFFF
Ox0000保留給系統使用,
OxCOOO--OxFFFF保留給配对管理器使用,应用程序只有在不使用配对管理器的時候才能使用這部分记录key
文件ID的范围是Ox0000--OxBFFF
OxFFFF保留給系統使用,
OxCOOO--OxFFFE保留給配对管理器使用,应用程序只有在不使用配对管理器的時候才能使用這部分文件ID
-
ret_code_t fds_register(fds_cb_t cb);
作用:初始化FDS之前要先注册FDS回调函数
示例:(void)fds_register(fds_evt_handler);
--------static void fds_evt_handler(fds_evt_t const * p_evt) -
ret_code_t fds_init(void);
作用:初始化FDS -
//定义并初始化记录描述符结构体变量
---fds_record_desc_t desc = {0};
作用:该结构体用来存储你对记录的操作
-
//定义并初始化记录查找令牌结构体变量
----fds_find_token_t tok = {0};
作用:存储记录的查找进度,所在的页面以及地址 -
ret_code_t fds_record_find(uint16_t file_id,//文件ID
--------------------------uint16_t record_key,//记录key
--------------------------fds_record_desc_t * const p_desc,//记录描述符
--------------------------fds_find_token_t * const p_token)//记录进度符
作用:根据文件ID,记录key查找 记录的数据,并保存查找进度与操作
示例:fds_record_find(0x1000, 0x1002, &desc, &tok); -
ret_code_t fds_record_update(fds_record_desc_t * const p_desc,//记录描述符
--------------------------------fds_record_tconst * const p_record)//记录对应的结构体数据
作用:根据文件ID,记录key更新 记录的数据
示例://定义记录变量
static fds_record_t const record =
{
.file_id = 0x1000,
.key = 0x1002,
.data.p_data = &data,
//记录的长度必须以4字节(字)为单位
.data.length_words = (sizeof(data) + 3) / sizeof(uint32_t),
};
fds_record_update(&desc, &record); -
ret_code_t fds_record_write(fds_record_desc_t * const p_desc,//记录描述符
-------------------------------fds_record_t const * const p_record)//记录对应的结构体数据
作用:根据文件ID,记录key写入 记录的数据
示例:fds_record_write(&desc, &record); -
ret_code_t fds_record_open(fds_record_desc_t * const p_desc,//记录描述符
---------------------------------**fds_flash_record_t *** const p_flash_rec)//记录数据结构体
typedef struct
{
fds_header_t const * p_header; //!< Location of the record header in flash.
void const * p_data; //!< Location of the record data in flash.
} fds_flash_record_t;
作用:打开记录,获取记录数据
示例:fds_flash_record_t temp = {0};
rc = fds_record_open(&desc, &temp); -
ret_code_t fds_record_close(fds_record_desc_t * const p_desc)
作用:关闭记录
示例:fds_record_close(&desc); -
ret_code_t fds_record_delete(fds_record_desc_t * const p_desc)
作用:删除记录
示例:fds_record_delete(&desc); -
ret_code_t fds_stat(fds_stat_t * p_stat);
作用:获取文件系统统计信息
示例://定义一个FDS文件系统统计信息结构体,用于保存获取的统计信息
fds_stat_t stat = {0};
fds_stat(&stat); -
ret_code_t fds_gc(void);
作用:回收FDS碎片
示例:fds_gc(); -
ret_code_t fds_record_find_in_file(uint16_t file_id,//文件ID
-----------------------------fds_record_desc_t * p_desc,//记录描述符
-----------------------------fds_find_token_t * p_token);//记录进度符
作用:根据文件ID查找 记录的数据,并保存查找进度与操作
示例:fds_record_find_in_file(0x1000, &desc, &tok); -
ret_code_t fds_record_find_by_key(uint16_t record_key,//记录key
--------------------------------fds_record_desc_t * p_desc,//记录描述符
--------------------------------fds_find_token_t * p_token);//记录进度符
作用:根据记录key查找 记录的数据,并保存查找进度与操作
示例:fds_record_find_by_key(0x1002, &desc, &tok);
EVENT
FDS_EVT_INIT,------------//FDS初始化完成事件
FDS_EVT_WRITE,-----------//FDS写操作完成事件
FDS_EVT_UPDATE,----------//FDS更新操作完成事件
FDS_EVT_DEL_RECORD,------//FDS删除文件完成事件
FDS_EVT_DEL_FILE,--------//FDS删除记录完成事件
FDS_EVT_GC---------------//FDS碎片整理完成事件