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.

[参考译文] MSP430I2040:在保留 tlv 数据的同时将数据写入信息闪存的正确方法是什么?

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1183610/msp430i2040-what-is-the-proper-way-to-write-data-into-information-flash-while-retaining-tlv-data

器件型号:MSP430I2040

您好!

我正在尝试将一些用户生成的设置保存到信息闪存中(该段从0x1000开始)、因为某些特定于器件的 TLV 数据也存在于该段的末尾(从0x13C0开始)、我们需要先读取该部分数据、然后将其保存回。

以下是我的代码:

    uint8_t tlv[64];
    uint8_t *Flash_ptr;
    // Read TLV calibration data before erasing information memory
	memcpy((void *)&tlv[0], (void*)TLV_START, sizeof(tlv));
    // Save settings struct into flash or other persistent medium
    Flash_ptr = (uint8_t *)SETTINGS_ADDR;
    // Erase information memory
    WDTCTL = WDTPW | WDTHOLD;
    FCTL2 = FWKEY | FSSEL_1 | FN1 | FN3 | FN5;  // MCLK/42 for Flash Timing Generator
    while (FCTL3 & BUSY);                       // Make sure flash controller is not busy
    FCTL3 = FWKEY;                              // Clear Lock bit
    if(FCTL3 & LOCKSEG) {                       // If Info Seg is still locked
        FCTL3 = FWKEY | LOCKSEG;                // Clear LOCKSEG bit
    }
    FCTL1 = FWKEY | ERASE;                      // Set Erase bit
    *Flash_ptr = 0;                             // Dummy write to erase info segment
    while (FCTL3 & BUSY);                       // Make sure flash controller is not busy
    FCTL3 = FWKEY;
    if(FCTL3 & LOCKSEG) {                       // If Info Seg is still locked
        FCTL3 = FWKEY | LOCKSEG;                // Clear LOCKSEG bit
    }
    FCTL1 = FWKEY | WRT;
    memcpy((void *)SETTINGS_ADDR, &settings, sizeof(Settings));
    // Save TLV calibration data back into flash
    memcpy((void *)TLV_START, &tlv[0], sizeof(tlv));
    FCTL1 = FWKEY;                              // Clear WRT bit
    FCTL3 = FWKEY | LOCKSEG;                    // Set LOCK bit

使用此代码、一旦运行此块代码、TLV 数据将始终被擦除、同时成功保存设置。 但是、如果我注释掉该行以保存设置、则可以成功保存回 TLV 数据。

我的编译器版本为:TI v20.2.7 LTS。 几年前、非常相似的代码能够按预期运行。

我应该错过什么? 请提供建议、谢谢。  

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

    如果我交换两个 memcpy 函数的顺序、如下所示:

    // Save TLV calibration data back into flash
    // If TLV data is copied first, then both can be saved into flash
    memcpy((void *)TLV_START, &tlv[0], sizeof(tlv));
    memcpy((void *)SETTINGS_ADDR, &settings, sizeof(Settings));

    我不知道这里有什么坑洼吗?

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

    我看不到任何问题。  

    由于您已将 TLV 复制到 RAM、因此如果您先编写代码或先编写 TLV、则不会变得更成熟。

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

    我认为顺序无关紧要。 但事实是、至少在我的情况下、它会实现。 我花了几个小时在那一天的时间里徘徊,今天又重新抄录了它。

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

    什么是更成熟的? 您无法写入自己的数据? 您能否帮助检查闪存幻灯片上的响应?

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

    问题是一些字节未被写入闪存。 在原始代码中,调用 SaveSettings()函数后,所有 TLV 数据都会丢失,尽管它应该已经被写回信息闪存中。 在修订版本中、只有部分设置结构数据实际保存到闪存中。 根据一天中的时间或 PCB 等、有时会保存所有112个字节、有时仅保存前32 ~ 33个字节、有时会保存90+个字节。

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

    不同的 MCU 似乎有不同的结果? 结果是否都可以重新创建?

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

    问题一直跟踪到代码本身之外、但我们使用的固件下载软件。 该软件会立即复位 MCU 或在下载固件后关闭电源。 由于此用于将默认设置保存到闪存的代码块是在首次系统引导时调用的、因此有时设置结构或 TLV 数据的最后几个字节无法写入。  

    在我们的旧版本代码中、设置结构要小得多、在软件下载工具复位 MCU 之前、所有字节都可以写入闪存中、因此这不是问题。