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.

[参考译文] MSP430FR2476:发生 PUC 事件时的信息存储器区域写入

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1271938/msp430fr2476-information-memory-region-write-on-puc-event

器件型号:MSP430FR2476

您好!

我目前看到在 PUC 事件后、在写入 msp430fr2476控制器的"信息存储器"区域时出现问题。

我正在尝试通过存储 "SYSRSTIV"看到的值来存储复位原因、控制器在写入信息存储器区域时似乎崩溃。
在 PUC 事件发生时、我是否应该执行特殊操作?

相同的方法/例程/代码在 POR/BOR 事件被触发时起作用、例如"PMMSWPOR"、"PMMSWBOR"或"欠压"

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

    1.12.1.1 FRAM 写保护
    用户可通过 FRAM 写保护防止对用户代码和数据执行意外写操作。 为
    主代码 FRAM 和信息 FRAM 受 PFWP 和 DFWP 位保护。
    分别在 SYSCFG0寄存器中。 PUC 复位之后、这两个位默认为1、FRAM 写操作均为
    被禁用。 必须先清零相应位、然后才能对用户代码执行写操作。 请参阅第1.16.2节以了解
    寄存器详细信息。

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

    //Get previous write protection setting
    uint8 u8_State = SYSCFG0_L;
    uint8 u8_wp = DFWP | PFWP;
    
    SYSCFG0 = FRWPPW | (u8_State & ~(u8_wp));
    
    __disable_interrupt();
    
    ///< Write Data
    for(uint16 i = 0; i < u16_Length; i++)
    {
        pu8_InfoMemoryPointer[i] = pu8_Data[i];
    }
    
    __enable_interrupt();
    
    //Restore previous write protection setting
    SYSCFG0 = FRWPPW | u8_State;


    我对 FRAM 的所有访问如上所述。 我每次都在任何内容写入 FRAM 之前获取访问权限。

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

    您好!

    有一个写入信息存储器的示例代码。 您是否在电路板上尝试过它?

    https://dev.ti.com/tirex/explore/node?node=A__AM6QYnBUHQT2ROMUPiKp5g__msp430ware__IOGqZri__LATEST

    此致、

    现金豪

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

    在我的上述代码片段(回复 David)中、您可以看到我正在执行该操作。

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

    我记得尝试写入受写保护的 FRAM 不会生成复位、而是被忽略。 "崩溃"的症状是什么?

    此外,你是从 main ()还是从_system_pre_init ()调用这个代码吗?

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

    我是从 main()调用代码。

    据我所知、系统在写入 FRAM 时忽略/失败。
    我正在使用 CRC 字段编写结构。

    通过在问题发生后查看调试器中的信息内存区域、
    复位原因的原因被写入 FRAM、即被写入16字节。
    但是、同样的代码在更新 结构的 CRC 字段时失败、这会对应用产生其他影响。

    基本上是对 FRAM 进行了部分写入、我不知道为什么会这样。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    基本上 FRAM 是部分写入的,我不知道为什么会这样做。

    如果没有实际的代码来查看、就不可能知道、但 CRC 似乎不是随数据一起写入的、而是对 FRAM 写入代码的不同调用。 这带来了其他可能性。

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

    //Calculate new crc-sum
    mp_storageDrv->Read(static_cast<uint32>(u16_StorageLoc), &buffer[0], u16_StructLengthNV);
    memcpy(&buffer[u16_offset], pv_data, u16_size);
    // recompute crc based on the new value
    u16_crc = crc16_Compute(CRC_INITIAL_VALUE, &buffer[sizeof(ST_Header::u16_crc_sum)], u16_StructLengthNV - sizeof(ST_Header::u16_crc_sum));
    
    // Write new data to eeprom
    en_error = EC_ResWriteConstrainConflict;
    if ((mp_storageDrv->Write(static_cast<uint32>(u16_StorageLoc) + u16_offset, pv_data, u16_size) == u16_size) &&
        (mp_storageDrv->Write(static_cast<uint32>(u16_StorageLoc), &u16_crc, sizeof(u16_crc)) == sizeof(u16_crc))) 
    {
        en_error = EC_NoError;
    }


    我从 FRAM 读取当前的内容。
    Re 计算 CRC
    然后写入、
    -结构的新值
    -更新结构的 CRC 到 FRAM

    这里没有什么花哨的东西。
    此处的 Write 调用执行上述已粘贴的代码片段。

    正如我说过的、这段代码会一直执行并且一直有效、除了任何 PUC 事件。

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

    你们给我准备了什么更新吗?
    您是否尝试在终端再现?

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

    您好!

    很抱歉回复延迟。 我想这个问题已经解决了。  

    回到这个问题、在 UG 第1.9.3章中。 "对受保护的 FRAM 执行任何写入访问都会导致无效的写入操作、但不会生成中断或复位"。 如果仍然遇到 PUC 事件、不应该是由于写入 FRAM 而引起的。 它应该是导致 PUC 事件的其他事件。  

    而将 CRC 写入 FRAM 在功能上不起作用、您是否曾尝试过 首先测试示例代码?  

    有一个写入信息存储器的示例代码。 您是否在电路板上尝试过它?

    https://dev.ti.com/tirex/explore/node?node=A__AM6QYnBUHQT2ROMUPiKp5g__msp430ware__IOGqZri__LATEST

    [/报价]

    此致、

    现金豪

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

    看来你们不想理解我所指出的问题、也不想帮助我。
    我对自己的解释非常好、并且还为您提供了我正在使用的代码片段。

    由于这一点,我只能说  ,本论坛是有意地选择不回答我的问题,并对手头的问题作出合理的解释。

    给予我相同的标准响应对我或您没有帮助。
    不感谢你的评分

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

    您提供的信息不完整、然后当我们无法猜到问题是什么时、您会感到烦恼。

    我特别喜欢这样的方式:如果您没有提供可能出现问题的完整代码示例、则询问是否有人重新创建了该示例。

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

    我很生气、因为我回答了您的所有问题、而您给我提供了标准回答、认为我不知道如何使用微控制器、并且我没有 编写代码的经验。

    简单的实验来在您的终端上执行、
    在 msp430fr2476硬件上执行 PUC 事件、并验证您可以在启动时多次写入 FRAM。

    我已经多次解释自己。
    我再输入一下、进行娱乐。


    //Calculate new crc-sum
    mp_storageDrv->Read(static_cast<uint32>(u16_StorageLoc), &buffer[0], u16_StructLengthNV);
    memcpy(&buffer[u16_offset], pv_data, u16_size);
    // recompute crc based on the new value
    u16_crc = crc16_Compute(CRC_INITIAL_VALUE, &buffer[sizeof(ST_Header::u16_crc_sum)], u16_StructLengthNV - sizeof(ST_Header::u16_crc_sum));
    
    // Write new data to eeprom
    en_error = EC_ResWriteConstrainConflict;
    if ((mp_storageDrv->Write(static_cast<uint32>(u16_StorageLoc) + u16_offset, pv_data, u16_size) == u16_size) &&
        (mp_storageDrv->Write(static_cast<uint32>(u16_StorageLoc), &u16_crc, sizeof(u16_crc)) == sizeof(u16_crc))) 
    {
        en_error = EC_NoError;
    }



    mp_storageDrv->Write
     

    这是我在编写例程中拥有的代码。

     
    //Get previous write protection setting
    uint8 u8_State = SYSCFG0_L;
    uint8 u8_wp = DFWP | PFWP;
    
    SYSCFG0 = FRWPPW | (u8_State & ~(u8_wp));
    
    __disable_interrupt();
    
    ///< Write Data
    for(uint16 i = 0; i < u16_Length; i++)
    {
        pu8_InfoMemoryPointer[i] = pu8_Data[i];
    }
    
    __enable_interrupt();
    
    //Restore previous write protection setting
    SYSCFG0 = FRWPPW | u8_State;


    您可以看到、  

    (mp_storageDrv->Write(static_cast<uint32>(u16_StorageLoc) + u16_offset, pv_data, u16_size)


     第一次写调用是写入值、例如、重置原因

    创建新问题、  
    mp_storageDrv->Write(static_cast<uint32>(u16_StorageLoc), &u16_crc, sizeof(u16_crc))


    更新 CRC。


    更新该值和 CRC 的调用使用相同的 if 语句。
    这里没什么特别的。

    相同的代码和相同的流程适用于 POR/BOR 事件。
    这对您有用吗?


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

    我已经告诉过您很多次、代码 Ihad 是写入信息存储器的。  
    上面粘贴的代码片段可以正常工作。

    是的、我知道如何写入信息存储器。

    请勿使用您的标准回答来支持我。

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

    可以编译完整的示例并按原样运行。 您提供的都是片段。

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

    基本上

    -你要我在 IAR IDE 中创建一个新的工作区
    -实施代码导致我的问题
    -然后把它给你,以便你可以测试它,并给我反馈。

    我看、就是这么完美。

    为什么你没有提前告诉我,我不会花费我的精力和时间解释它的话,假设你会做同样的事情,而不是我给你。

    我想这就是你会 认真对待我的问题的方式。

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

    进一步调试后、我已经意识到我的问题的根本原因。
    msp430fr2476的用户指南和数据表未包含有关 PUC 事件后系统状态的清晰信息。

    来查看用户指南中的系统复位和初始化
     1.2.1节 系统复位后器件初始条件只描述 BOR 后的情况。

    我 在代码中启用了计时器中断、看起来计时器配置未在 PUC 事件发生时复位。
    在启动时清除计时器配置可以解决我的问题。