使用示例

## 使用示例 ```language /** * @file user_flash_demo.c * @ingroup peripheral * @brief 用户使用flash的实例,本实例描述的是运行过程中不写flash,仅在深睡、软重启等处才执行一次写flash操作。 * @par * 如果客户运行过程中不会频繁写flash,直接调用xy_flash.h中的接口即可; * @par * 如果客户运行过程中频繁写小字节到flash中,为了运行效率和避免坏块风险,建议参考此处demo来实现一次性写入flash的动作。 * * @attention 由于flash擦写次数为10万次,所以客户在使用flash时务必关注使用频率,原则上小于1小时的擦写动作必须考虑磨损算法,否则有坏块风险 * @par * 考虑到异常断电情况,无法保证flash内容的有效性,进而客户在使用flash时,在每个扇区的头部添加魔术数字,在尾部添加checksum,以保证完整性 */ #include "softap_api.h" #if DEMO_TEST #define USER_NV_DEMO_BASE (USER_FLASH_BASE+USER_FLASH_LEN_MAX-FLASH_PAGE_LENGTH) #define USER_NV_DEMO_LEN 0x400 /** * @brief 为了防止异常掉电造成的内容损坏,必须在每个扇区头部和尾部添加魔术数字和checksum */ #define USER_MAGIC_NUM 0X5A5A5A5A #define CHECKSUM_OFFSET (FLASH_PAGE_LENGTH-16) /** * @brief user RAM memory */ unsigned char *g_user_nv_demo = NULL; /** * @brief 在深睡或软重启时,由芯翼的后台调用该接口,保存用户数据到指定flash空间。 * @par * 具体调用点请参看sys_hook_func.c中的各个HOOK函数,包括user_flash_hook_by_fastoff/user_flash_hook_by_RB/user_hook_flash_save,需用户自行添加 * * @attention 为了防止异常断电造成的内容损坏,必须添加魔术数字和checksum */ void save_user_nv_demo() { char *buff_temp = xy_malloc(FLASH_PAGE_LENGTH); *((int *)g_user_nv_demo) = USER_MAGIC_NUM; memcpy(buff_temp,g_user_nv_demo,USER_NV_DEMO_LEN); *((unsigned int*)(buff_temp+CHECKSUM_OFFSET)) = xy_chksum(buff_temp,USER_NV_DEMO_LEN); xy_Flash_Write(USER_FLASH_BASE,buff_temp,FLASH_PAGE_LENGTH); xy_free(buff_temp); } /** * @brief 系统初始化时,从flash中读取用户内容到RAM中。可由user_hook_flash_restore接口调用,需用户自行添加 * * @attention 为了防止异常断电造成的内容损坏,必须添加魔术数字和checksum */ void read_user_nv_demo() { g_user_nv_demo = xy_malloc(USER_NV_DEMO_LEN); //user private data area,flash context maybe NULL,and user can add flag self xy_Flash_Read(USER_FLASH_BASE,g_user_nv_demo,USER_NV_DEMO_LEN); if(*((int *)g_user_nv_demo)!=USER_MAGIC_NUM || \ *((unsigned int*)(USER_NV_DEMO_BASE+CHECKSUM_OFFSET)) != xy_chksum(g_user_nv_demo,USER_NV_DEMO_LEN)) { memset(g_user_nv_demo,0,USER_NV_DEMO_LEN); xy_Flash_Erase(USER_NV_DEMO_BASE,FLASH_PAGE_LENGTH); xy_printf("read user flash context Fail!!!"); } else xy_printf("read user flash context succ!!!"); } #endif ```