|
本帖最后由 lindabell 于 2020-8-3 15:04 编辑
- rts_fv - 参数存储模块
- 使用soc片内flash来保存参数。
- 支持设置参数默认值,在出现异常情况下可恢复为默认值。
- 支持扇区内滚动保存,减少擦除flash操作。
- 源文件
- rts_cfg.h
- rts_fv.h
- rts_fv.c
- rts_fv移植
- 1. 在rts_cfg.h打开宏USE_RTS_FV来使能rts_fv模块,如下:
- //rts fv cfg
- #define USE_RTS_FV
- 2. soc flash接口移植
- //soc flash 擦除函数
- void erase(void)
- {
- //todo
- }
- //soc flash读函数
- uint32_t read(uint32_t addr,void *data,uint32_t datasize)
- {
- //todo
- }
- //soc flash写函数
- uint32_t write(uint32_t addr,void *data,uint32_t datasize)
- {
- //todo
- }
- 3. 完成默认参数设置函数
- void data_set_default(void *data,uint32_t datasize)
- {
- //todo
- }
- ** 4. rts_fv_layout_t 定义**
- rts_fv_layout_t fv_layout=
- {
- .name="rts_fv",
- .addr=RTS_FV_PAGE_NUBER*4096,
- .size=4096,
- .index=0,
- .erase=erase,
- .read=read,
- .write=write,
- .data_set_default=data_set_default
- };
- 5. 用户需要保存参数的结构体定义
- typedef struct
- {
- uint8_t user_data;
- //todo more
- }fv_t;
- 6. 使用
- void main(void)
- {
- rts_fv_init(&fv_layout,&fv,sizeof(fv));
- rts_fv_read(&fv_layout,&fv,sizeof(fv))
- rts_fv_write(&fv_layout,&fv,sizeof(fv));
- while(1)
- {
- }
- }
- NRF52832移植示例
- #include "nrf_soc.h"
- #include "nrf52.h"
- #include "rts_fv.h"
- //flash layout
- //nrf52832 512kB
- //协议栈: 地址:0x00000~0x25FFF 大小:152KB 扇区:0~37
- //APP: 地址:0x26000~0x7CFFF 大小:348KB 扇区:38~124
- //rts fv: 地址:0x7D000~0x7DFFF 大小:4KB 扇区:125
- //MBR parameter storage: 地址: 0x7E000~0x7EFFF 大小:4KB 扇区:126
- //Bootloader settings: 地址: 0x7F000~0x7FFFF 大小:4KB 扇区:127
- #define RTS_FV_PAGE_NUBER 125
- void erase(void)
- {
- uint32_t retval=NRF_SUCCESS;
- do{
- retval=sd_flash_page_erase(RTS_FV_PAGE_NUBER);
- }while(retval!=NRF_SUCCESS);
- }
- uint32_t read(uint32_t addr,void *data,uint32_t datasize)
- {
- uint32_t i;
- uint8_t *pu8;
- uint8_t *psrc;
- pu8=(uint8_t *)data;
- psrc=(uint8_t *)addr;
- for(i=0;i<datasize;i++)
- {
- *pu8=*psrc;
- pu8++;
- psrc++;
- }
- return datasize;
- }
- #define FLASH_WRITE_SIZE_MAX (1024)
- uint32_t write(uint32_t addr,void *data,uint32_t datasize)
- {
- uint32_t retval=NRF_SUCCESS;
- uint32_t num=0;
- uint32_t remnant=0;
- uint32_t i=0;
- num=(datasize/4)/FLASH_WRITE_SIZE_MAX;
- remnant=(datasize/4)%FLASH_WRITE_SIZE_MAX;
- for(i=0;i<num;i++)
- {
- do{
- 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);
- }while(retval!=NRF_SUCCESS);
- }
- if(remnant)
- {
- do{
- retval=sd_flash_write((uint32_t *)(addr+num*FLASH_WRITE_SIZE_MAX),(uint32_t *)((uint32_t)data+num*FLASH_WRITE_SIZE_MAX),remnant);
- }while(retval!=NRF_SUCCESS);
- }
- return datasize;
- }
- typedef struct
- {
- float k;
- bool is_net_use_wifi;
- uint8_t volume_level;
- }fv_t;
- void data_set_default(void *data,uint32_t datasize)
- {
- fv_t *pfv=(fv_t*)data;
- pfv->k=0.00235722732445531679170884575745;
- pfv->is_net_use_wifi=false;
- pfv->volume_level=4;
- }
- rts_fv_layout_t fv_layout=
- {
- .name="rts_fv",
- .addr=RTS_FV_PAGE_NUBER*4096,
- .size=4096,
- .index=0,
- .erase=erase,
- .read=read,
- .write=write,
- .data_set_default=data_set_default
- };
- void main(void)
- {
- rts_fv_init(&fv_layout,&fv,sizeof(fv));
- rts_fv_read(&fv_layout,&fv,sizeof(fv));
- printf("fv.volume_level=%d\r\n",fv.volume_level);
-
- fv.volume_level=99;
- rts_fv_write(&fv_layout,&fv,sizeof(fv));
-
- fv.volume_level=0;
- rts_fv_read(&fv_layout,&fv,sizeof(fv));
- printf("fv.volume_level=%d\r\n",fv.volume_level);
-
- while(1)
- {
- //todo
- }
- }
复制代码
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
阿莫论坛20周年了!感谢大家的支持与爱护!!
月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!
|