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.

[参考译文] MSP430FR5989:在 FRAM 中保存阵列并在电源故障后进行检索

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/857063/msp430fr5989-saving-array-in-fram-and-retrieve-it-after-the-power-failure

器件型号:MSP430FR5989
主题中讨论的其他器件:CC1101

大家好、

如果电源关闭 并通过 CC1101无线电发送、我将尝试通过将虚拟 ARRY 保存到 FRAM 来将测试 wrtng 保存到 FRAM。  我使用了 TI 示例代码。

uint8_t __attribute__((persistent)) FRAM_buffer1[2]={0};

int main (void)
{
for (;;)
{
......
FRAM_buffer1[0]= 21; /*写入 FRAM */
FRAM_buffer1[1]= 10; /*写入 FRAM */........


通过无线电发送 FRAM 中的内容 } 返回0;}

我在编译文件时收到以下警告(我正在编译 GNU 编译器):

变量'FRAM_buffer1'被声明为永久性变量并应显式初始化[-Wattributes]

 uint8_t __attribute__((persistent)) FRAM_buffer1[61]={0};

并且没有重新计算21和10个值。  我收到了一个垃圾值。  

我犯了什么错误?  

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

    您好!

    您是否在属性->常规-> MPU 中设置了 MPU 模块?

    如果启用存储器保护、则需要将一些 FRAM 除以其他位置、以启用 FRAM 写入。

    此致

    Johnson  

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

    感谢 Johnson 的回复。

    我不使用 Code Composer Studio。 MPU 模块默认启用吗? 因为 我没有在我的代码中启用它。  

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

    如果我将数组大小增加到16字节、我得到  数组前4个元素的值是正确的、其余的是无用的。  我是否需要考虑任何因素 、例如 FRAM 地址?

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

    您好!

    对于 FR5989、MPU 模块默认启用存储器保护、您能告诉我您的开发软件吗? IAR?

    FRAM 存储器的保护可被分成几个段、这可以保护一个特定的地址段。

    因此、您描述的问题可能是由不合理的 MPU 设置引起的。

    您可以 在调试模式下查看 FRAM_buffer1数组变量的地址、并将其与 MPU 模块的存储器保护设置进行比较、以便更轻松地找到根本原因。

    此致

    Johnson

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

    我正在使用 MSP430 GCC 工具链。 我在查看链接器脚本并知道"HIFRAM"的起始位置后尝试指定阵列地址。  因此、我发现"HIFRAM"开始于 0x00010000。  此外、我不配置 MPU。  

    以下是新代码:

    uint8_t * FRAM_WRITE_ptr;
    
    int main (void)
    {
    设置计时器、每5秒从 lmp3唤醒一次 
    FRAM_WRITE_PTR =(uint8_t *) FRAM_TEST_START;//将 FRAM 指针的起始地址设置为0x00010000 for (;) { 转到 lmp3直到计时器中断触发 对于(i=0;i<16;i++) { FRAM_WRITE_PTR[i]= 100; } 通过无线电 发送 FRAM_WRITE_PTR 数组}

    我正在接收 所有16个元素的垃圾值。  

    我真的在这个问题上停留了两周。  我们非常感谢您的任何帮助。  

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

    您好,

    此代码作为您的参考,测试通过我们的 lanuchpad (在 CCS 软件中进行开发):

    该代码通过清零 MPUENA 位来禁用 MPU 模块。

    #include 
    
    #define FRAM_TEST_START 0x00010000
    unsigned char * FRAM_WRITE_PTR;
    char I;
    
    int main (void)
    {
    
    WDTCTL = WDTPW | WDTHOLD; //停止 WDT
    PM5CTL0 &&~LOCKLPM5;
    
    MPUCTL0 = MPUPW;
    FRAM_WRITE_PTR =(unsigned char *) FRAM_TEST_START;//将 FRAM 指针的起始地址设置为0x00010000
    while (1)
    {
    for (i=0;i<16;i++)
    {
    FRAM_WRITE_PTR[i]= 100;
    }
    }
    
    

    附加一些测试数据(结果和 MPUENA 值):

    此致

    Johnson

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

    使用"persistent"写入 FRAM 适用于我。 它变成对讲机正在发送损坏 的数据包!