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)

  1. 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);

  2. 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);

  3. 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);

  4. 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);

  5. 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

  1. 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)

  2. ret_code_t fds_init(void);
    作用:初始化FDS

  3. //定义并初始化记录描述符结构体变量
    ---fds_record_desc_t desc = {0};
    作用:该结构体用来存储你对记录的操作

  4. //定义并初始化记录查找令牌结构体变量
    ----fds_find_token_t tok = {0};
    作用:存储记录的查找进度,所在的页面以及地址

  5. 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);

  6. 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);

  7. 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);

  8. 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);

  9. ret_code_t fds_record_close(fds_record_desc_t * const p_desc)
    作用:关闭记录
    示例:fds_record_close(&desc);

  10. ret_code_t fds_record_delete(fds_record_desc_t * const p_desc)
    作用:删除记录
    示例:fds_record_delete(&desc);

  11. ret_code_t fds_stat(fds_stat_t * p_stat);
    作用:获取文件系统统计信息
    示例://定义一个FDS文件系统统计信息结构体,用于保存获取的统计信息
    fds_stat_t stat = {0};
    fds_stat(&stat);

  12. ret_code_t fds_gc(void);
    作用:回收FDS碎片
    示例:fds_gc();

  13. 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);

  14. 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碎片整理完成事件

posted @ 2025-05-24 21:23  感兴趣就学  阅读(80)  评论(0)    收藏  举报