简介

NVM就是用来存储设备参数的一个功能,把程序运行过程中的一些需要断电保存的数据,存储到flash里面,例如存储音量、亮度、设备号等等。

本SDK里面用到的一个NVM组件,是由系统组件osal_snv.c 调用 flash文件系统fs.c构建的,存储位置为FS区(#define NVM_BASE_ADDR 0x1103C000 ):
image.png

使用说明

1.添加源文件:

image.png

2.修改osal_snv.c(屏蔽一些代码)

  1. #include <stdint.h>
  2. #include "osal.h"
  3. #include "flash.h"
  4. #include "error.h"
  5. #include "osal_snv.h"
  6. #include "log.h"
  7. #include "fs.h"
  8. //#define USE_FS 1
  9. //#ifndef USE_FS
  10. // #define USE_FS 1
  11. //#endif
  12. //#ifdef USE_FS
  13. // #include "fs.h"
  14. //#endif
  15. //#if (USE_FS == 0)
  16. #define NVM_BASE_ADDR 0x1103C000 //16K bytes
  17. //uint8 osal_snv_init( void )
  18. //{
  19. // return PPlus_ERR_FATAL;
  20. //}
  21. //uint8 osal_snv_read( osalSnvId_t id, osalSnvLen_t len, void* pBuf)
  22. //{
  23. // (void)(id);
  24. // (void)(len);
  25. // (void)(pBuf);
  26. // return PPlus_ERR_FATAL;
  27. //}
  28. //uint8 osal_snv_write( osalSnvId_t id, osalSnvLen_t len, void* pBuf)
  29. //{
  30. // (void)(id);
  31. // (void)(len);
  32. // (void)(pBuf);
  33. // return PPlus_ERR_FATAL;
  34. //}
  35. //uint8 osal_snv_compact( uint8 threshold )
  36. //{
  37. // return SUCCESS;
  38. //}
  39. //#else
  40. uint8 osal_snv_init( void )
  41. {
  42. // if(!hal_fs_initialized())
  43. // return NV_OPER_FAILED;
  44. int ret;
  45. if(hal_fs_initialized() == FALSE)
  46. {
  47. ret = hal_fs_init(NVM_BASE_ADDR,2);
  48. if(PPlus_SUCCESS != ret)
  49. {
  50. NV_OPER_FAILED;
  51. }
  52. }
  53. return SUCCESS;
  54. }
  55. uint8 osal_snv_read( osalSnvId_t id, osalSnvLen_t len, void* pBuf)
  56. {
  57. int ret;
  58. LOG("osal_snv_read:%x\n",id);
  59. ret = hal_fs_item_read((uint16_t)id,(uint8_t*) pBuf, (uint16_t)len,NULL);
  60. if(ret != PPlus_SUCCESS)
  61. {
  62. LOG("rd_ret:%d\n",ret);
  63. return NV_OPER_FAILED;
  64. }
  65. LOG_DUMP_BYTE(pBuf, len);
  66. return SUCCESS;
  67. }
  68. uint8 osal_snv_write( osalSnvId_t id, osalSnvLen_t len, void* pBuf)
  69. {
  70. int ret = PPlus_SUCCESS;
  71. LOG("osal_snv_write:%x,%d\n",id,len);
  72. LOG_DUMP_BYTE(pBuf, len);
  73. if(hal_fs_get_free_size() < len+32)
  74. {
  75. if(hal_fs_get_garbage_size(NULL) > len+32)
  76. {
  77. hal_fs_garbage_collect();
  78. }
  79. else
  80. {
  81. return NV_OPER_FAILED;
  82. }
  83. }
  84. ret = hal_fs_item_write((uint16_t) id, (uint8_t*) pBuf, (uint16_t) len);
  85. if(ret !=0)
  86. {
  87. LOG("wr_ret:%d\n",ret);
  88. return NV_OPER_FAILED;
  89. }
  90. //LOG("Success\n");
  91. return SUCCESS;
  92. }
  93. uint8 osal_snv_compact( uint8 threshold )
  94. {
  95. return 0;
  96. }
  97. //#endif

3.指定代码链接空间(不指定会出现空间不足的故障) :

在“Options for Target ‘Target 1’ -> Linker -> Edit”里面的添加“fs.o(+RO)”和“osal_snv.o(+RO)”
image.png

4.例子:

初始化nvm,并读取参数

  1. osal_snv_init();
  2. osal_snv_read(123, 2, &derver_num);//参数1:位置,参数2:长度,参数3:源

参数被修改后,进行写入保存

  1. osal_snv_write(123, 2, &derver_num);