使用示例
## 使用示例
```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
```