工具/软件:Code Composer Studio
大家好、我正在使用 MSP430框架示例中的一些示例代码和函数
该封装的其中一个功能允许我安全地从 fram 中保存和加载(即双缓冲等)
单个变量很好、但当我尝试使用数组时、每次我执行复位或断电时、似乎都会清除存储器位置
我单独测试了存储(提交)和读取(恢复)函数、它们似乎适用于数组
我认为问题是初始化函数 NVS_DATA_INIT
这是 NVS_DATA_INIT 的代码
NVS_DATA_Handle NVS_DATA_INIT (uint8_t *存储、uint16_t 大小) { uint8_t *数据1; uint8_t *数据2; uint16_t crc; uint16_t init_crc1; uint16_t init_crc2; NVS_DATA_STATUS init_status; NVS_DATA_HEADER *标头; //初始化局部变量 init_status = NVS_DATA_init; init_crc1 = 0; INIT_CRC2 = 0; //计算到 NVS 容器内标头和数据存储的指针 标头=(NVS_DATA_HEADER *)存储; Data1 =(uint8_t *)头文件+ sizeof (NVS_DATA_HEADER); Data2 = data1 + size; //检查当前容器的状态 if ((header->token =NVS_DATA_token)&&(header->size == size)){ switch (header->status){ //存储1包含最新数据 案例 NVS_DATA_1: //获取存储1的 CRC 并检查它是否匹配 CRC = NVS_CRC (data1、header->size); if (crc == header->crc1){ //匹配校验和,返回 NVS 数据句柄 返回(NVS_DATA_Handle)标头; } 否则{ //获取存储2的 CRC 并检查它是否匹配 CRC = NVS_CRC (data2、header->size); if (CRC =header->CRC2){ init_status = NVS_DATA_2; INIT_CRC2 = CRC; } } 中断; //存储2包含最新数据 案例 NVS_DATA_2: //获取存储1的 CRC 并检查它是否匹配 CRC = NVS_CRC (data2、header->size); if (CRC =header->CRC2){ //匹配校验和,返回 NVS 数据句柄 返回(NVS_DATA_Handle)标头; } 否则{ //获取存储1的 CRC 并检查它是否匹配 CRC = NVS_CRC (data1、header->size); if (crc == header->crc1){ init_status = NVS_DATA_1; init_crc1 = crc; } } 中断; 默认值: //尝试根据有效的 CRC 签名恢复状态 //由于最后的状态未知,因此恢复任何有效的状态 // CRC 优于丢失所有信息 CRC = NVS_CRC (data1、header->size); if (crc == header->crc1){ init_status = NVS_DATA_1; init_crc1 = crc; } CRC = NVS_CRC (data2、header->size); if (CRC =header->CRC2){ init_status = NVS_DATA_2; INIT_CRC2 = CRC; } 中断; } } //解锁 FRAM uint16_t framState = NVS_unlockFRAM (); //初始化 NVS 数据标头 header->token = NVS_DATA_TOKEN; header->status = init_status; header->size = size; header->crc1 = init_crc1; header->CRC2 = INIT_CRC2; //锁定 FRAM NVS_lockFRAM (帧状态); //返回 NVS 数据句柄 返回(NVS_DATA_Handle)标头; }

