搜索
bottom↓
回复: 19

开源使用MCU内部flash保存参数的软件库

  [复制链接]

出0入8汤圆

发表于 2020-8-3 15:04:36 | 显示全部楼层 |阅读模式
本帖最后由 lindabell 于 2020-8-3 15:04 编辑
  1. rts_fv - 参数存储模块
  2. 使用soc片内flash来保存参数。
  3. 支持设置参数默认值,在出现异常情况下可恢复为默认值。
  4. 支持扇区内滚动保存,减少擦除flash操作。
  5. 源文件
  6. rts_cfg.h
  7. rts_fv.h
  8. rts_fv.c
  9. rts_fv移植
  10. 1. 在rts_cfg.h打开宏USE_RTS_FV来使能rts_fv模块,如下:

  11. //rts fv cfg
  12. #define USE_RTS_FV
  13. 2. soc flash接口移植

  14. //soc flash 擦除函数
  15. void erase(void)
  16. {
  17.     //todo
  18. }
  19. //soc flash读函数
  20. uint32_t read(uint32_t addr,void *data,uint32_t datasize)
  21. {
  22.     //todo
  23. }
  24. //soc flash写函数
  25. uint32_t write(uint32_t addr,void *data,uint32_t datasize)
  26. {
  27.     //todo
  28. }
  29. 3. 完成默认参数设置函数

  30. void data_set_default(void *data,uint32_t datasize)
  31. {
  32.     //todo
  33. }
  34. ** 4. rts_fv_layout_t 定义**

  35. rts_fv_layout_t fv_layout=
  36. {
  37.         .name="rts_fv",
  38.         .addr=RTS_FV_PAGE_NUBER*4096,
  39.         .size=4096,
  40.         .index=0,
  41.         .erase=erase,
  42.         .read=read,
  43.         .write=write,
  44.         .data_set_default=data_set_default
  45. };
  46. 5. 用户需要保存参数的结构体定义

  47. typedef struct
  48. {
  49.     uint8_t user_data;
  50.     //todo more
  51. }fv_t;
  52. 6. 使用

  53. void main(void)
  54. {
  55.     rts_fv_init(&fv_layout,&fv,sizeof(fv));
  56.     rts_fv_read(&fv_layout,&fv,sizeof(fv))
  57.     rts_fv_write(&fv_layout,&fv,sizeof(fv));
  58.     while(1)
  59.     {
  60.     }
  61. }

  62. NRF52832移植示例
  63. #include "nrf_soc.h"
  64. #include "nrf52.h"
  65. #include "rts_fv.h"

  66. //flash layout
  67. //nrf52832 512kB
  68. //协议栈:                                        地址:0x00000~0x25FFF                  大小:152KB            扇区:0~37
  69. //APP:                      地址:0x26000~0x7CFFF                大小:348KB            扇区:38~124
  70. //rts fv:                   地址:0x7D000~0x7DFFF                大小:4KB            扇区:125
  71. //MBR parameter storage:        地址: 0x7E000~0x7EFFF                大小:4KB                扇区:126
  72. //Bootloader settings:                地址: 0x7F000~0x7FFFF                大小:4KB                扇区:127

  73. #define RTS_FV_PAGE_NUBER      125


  74. void erase(void)
  75. {
  76.     uint32_t retval=NRF_SUCCESS;

  77.     do{
  78.         retval=sd_flash_page_erase(RTS_FV_PAGE_NUBER);
  79.     }while(retval!=NRF_SUCCESS);
  80. }
  81. uint32_t read(uint32_t addr,void *data,uint32_t datasize)
  82. {
  83.     uint32_t i;
  84.     uint8_t *pu8;
  85.     uint8_t *psrc;

  86.     pu8=(uint8_t *)data;
  87.     psrc=(uint8_t *)addr;


  88.     for(i=0;i<datasize;i++)
  89.     {
  90.         *pu8=*psrc;
  91.         pu8++;
  92.         psrc++;
  93.     }

  94.     return datasize;
  95. }
  96. #define FLASH_WRITE_SIZE_MAX        (1024)
  97. uint32_t write(uint32_t addr,void *data,uint32_t datasize)
  98. {
  99.     uint32_t retval=NRF_SUCCESS;
  100.     uint32_t num=0;
  101.     uint32_t remnant=0;
  102.     uint32_t i=0;

  103.     num=(datasize/4)/FLASH_WRITE_SIZE_MAX;
  104.     remnant=(datasize/4)%FLASH_WRITE_SIZE_MAX;

  105.     for(i=0;i<num;i++)
  106.     {
  107.         do{
  108.             retval=sd_flash_write((uint32_t*)(addr+i*FLASH_WRITE_SIZE_MAX),(uint32_t *)((uint32_t)data                        +i*FLASH_WRITE_SIZE_MAX),FLASH_WRITE_SIZE_MAX);
  109.         }while(retval!=NRF_SUCCESS);
  110.     }

  111.     if(remnant)
  112.     {
  113.         do{
  114.             retval=sd_flash_write((uint32_t *)(addr+num*FLASH_WRITE_SIZE_MAX),(uint32_t *)((uint32_t)data+num*FLASH_WRITE_SIZE_MAX),remnant);
  115.         }while(retval!=NRF_SUCCESS);
  116.     }

  117.     return datasize;
  118. }

  119. typedef struct
  120. {
  121.     float k;
  122.     bool is_net_use_wifi;
  123.     uint8_t volume_level;
  124. }fv_t;

  125. void data_set_default(void *data,uint32_t datasize)
  126. {
  127.     fv_t *pfv=(fv_t*)data;

  128.     pfv->k=0.00235722732445531679170884575745;
  129.     pfv->is_net_use_wifi=false;
  130.     pfv->volume_level=4;
  131. }


  132. rts_fv_layout_t fv_layout=
  133. {
  134.         .name="rts_fv",
  135.         .addr=RTS_FV_PAGE_NUBER*4096,
  136.         .size=4096,
  137.         .index=0,
  138.         .erase=erase,
  139.         .read=read,
  140.         .write=write,
  141.         .data_set_default=data_set_default
  142. };

  143. void main(void)
  144. {
  145.     rts_fv_init(&fv_layout,&fv,sizeof(fv));
  146.     rts_fv_read(&fv_layout,&fv,sizeof(fv));
  147.     printf("fv.volume_level=%d\r\n",fv.volume_level);
  148.    
  149.     fv.volume_level=99;
  150.     rts_fv_write(&fv_layout,&fv,sizeof(fv));
  151.    
  152.     fv.volume_level=0;
  153.     rts_fv_read(&fv_layout,&fv,sizeof(fv));
  154.     printf("fv.volume_level=%d\r\n",fv.volume_level);
  155.    
  156.     while(1)
  157.     {
  158.         //todo
  159.     }
  160. }
复制代码


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2020-8-3 15:20:30 | 显示全部楼层
先收藏,今晚再细看

出0入0汤圆

发表于 2020-8-3 16:48:36 | 显示全部楼层
先收藏,今晚再细看

出0入0汤圆

发表于 2020-8-3 16:56:34 | 显示全部楼层
先收藏,今晚再细看

出0入0汤圆

发表于 2020-8-3 17:09:46 来自手机 | 显示全部楼层
先收藏,等书到用时方恨少的时候看

出0入0汤圆

发表于 2020-8-3 20:41:06 | 显示全部楼层
这个和stm32里面的有啥区别?

出0入0汤圆

发表于 2020-8-3 20:41:11 | 显示全部楼层
是不是代码里隐藏了网址,我就不看了!

出0入8汤圆

 楼主| 发表于 2020-8-3 21:03:13 | 显示全部楼层
tear604922959 发表于 2020-8-3 20:41
这个和stm32里面的有啥区别?

只是做成一个库而已,跟使用什么MCU没有多大关系

出0入0汤圆

发表于 2020-8-3 21:11:57 | 显示全部楼层
谢谢 收藏了

出0入10汤圆

发表于 2020-8-3 21:48:04 | 显示全部楼层
谢谢  建议在数据后加个crc

出0入0汤圆

发表于 2020-8-3 21:49:28 | 显示全部楼层
谢谢 收藏了

出0入8汤圆

 楼主| 发表于 2020-8-3 21:49:47 | 显示全部楼层
jaywen 发表于 2020-8-3 21:48
谢谢  建议在数据后加个crc

肯定有crc啊,贴出来的是移植和使用示例;源代码在压缩包里

出0入0汤圆

发表于 2020-8-3 21:52:37 | 显示全部楼层
学习一下

出0入0汤圆

发表于 2020-8-3 22:28:32 | 显示全部楼层
先收藏,今晚再细看

出0入0汤圆

发表于 2020-8-3 22:35:43 来自手机 | 显示全部楼层
很不错的资料,收藏留存,学习一下。

出0入0汤圆

发表于 2020-8-3 22:37:56 | 显示全部楼层
谢谢,好东西先收藏

出0入10汤圆

发表于 2020-8-3 23:30:39 | 显示全部楼层
lindabell 发表于 2020-8-3 21:49
肯定有crc啊,贴出来的是移植和使用示例;源代码在压缩包里

果然是我想多了。。。。。我去看看看你的压缩包程序

出0入0汤圆

发表于 2020-8-4 00:00:06 来自手机 | 显示全部楼层
好东西,收蔵

出0入0汤圆

发表于 2020-8-4 10:26:12 | 显示全部楼层
我也要收藏一把。

出0入21汤圆

发表于 2020-8-4 11:07:25 | 显示全部楼层
一直想这样搞,不过到最后还是按常规的处理了,crc很重要
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-26 05:21

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表