This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CCS/MSP430FR5994:使用 NVS 函数读取和写入 FRAM

Guru**** 2595805 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/689795/ccs-msp430fr5994-using-nvs-functions-to-read-and-write-to-fram

器件型号:MSP430FR5994

工具/软件: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)标头;
} 

可以在此处找到 API 参考  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,

    NVS 库要求应用程序在初始化存储容器之前分配存储。 存储器可以位于 FRAM 或信息存储器中、并且可以使用包含的预处理器宏计算长度。 您是否根据所使用的阵列大小分配存储空间?

    下面的代码片段演示了如何为 CCS 和 IAR 在 FRAM 中正确分配存储器。

    #if defined (__TI_Compiler_version__)

    pragma PERSISTENT (nvsStorage)

    #elif defined (__IAR_systems_icc__)__persistent

    #endif

    uint8_t nvsStorage[NVS_log_storage_size (size、entries)]={0};

    此致、

    如果我的帖子有助于解决您的问题、请单击  验证答案    按钮 

    冬季、

    搜索 E2E! 您的问题可能已经得到解答!  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢、
    这解决了我的问题
    只需快速跟进一下使用信息内存和 FRAM 之间的区别是什么?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    SRAM 用于存储数据、SRAM 是唯一的选项。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我不确定 SRAM 是唯一的选项

    如果您使用的是 persistent、则不使用 fram
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    静态 RAM