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.

[参考译文] MSP430FR2355:FRAM 数据在下电上电后不会持续

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1181958/msp430fr2355-fram-data-is-not-persistent-after-power-cycle

器件型号:MSP430FR2355

您好!

 我正在尝试将时间数据存储在 FRAM 中。 我已经设置了一个结构来存储数据、我认为我正在使用正确的方法来设置 SYSCFG0来保存数据。 但是、在下电上电后数据不会持久。 是我的方法 o

 
 
 #pragma PERSISTENT(time_array)
 
 struct activation_time
{
    unsigned int month;
    unsigned int day;
    unsigned int hour;
    unsigned int minute;
    unsigned int second;
    unsigned int level;
};

struct activation_time time_array[100];
 
 
 main()
 {
 	unsigned int index;
 	SYSCFG0 = FRWPPW | PFWP;
    time_array[index].month=  RX_buffer[0xB];
    time_array[index].day=    RX_buffer[0xA];
    time_array[index].hour=   RX_buffer[0x8];
    time_array[index].minute= RX_buffer[0x7];
    time_array[index].second= RX_buffer[0x6];
    time_array[index].level = adcResult;
    SYSCFG0 = FRWPPW | DFWP | PFWP;             // Program FRAM write protected (not writable)
    
    if ( index <=99) {index++;}
    
  
 }
f 是否保存允许的结构?

提前感谢  

Richard

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

    我意识到我没有在实际代码的代码片段中包含 while 循环的索引。 实际代码包括此类循环。

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

    您是否能够看到(例如使用调试器)数据是实际写入的?

    DFWP 适用于信息 FRAM。 persistent()数据通常放置在程序 FRAM 的开头,由 PFWP 控制。 (您可以在链接器.cmd 文件和/或.map 文件中看到这是如何发生的。)

    请尝试清除 PFWP。 您还可以尝试将结构体放入信息 FRAM 中、方法如下:

    >#pragma DATA_SECTION (TIME_ARRAY、".info")

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

    感谢您回复 Bruce。 我可以看到正在使用调试器写入数据、我有另一个例程、用于在启动时将寄存 器的内容转储到串行端口(未显示以供说明)、我还使用调试器检查了寄存器。 。 PFWP 不会将数据放在程序存储器空间中、而是放在数据空间中?

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

    您的链接器文件是什么样的? 如果链接器文件中的任何位置未定义 PERSISTENT、每次 MCU 复位时、C 运行时都会重新初始化变量。

    还有一件事需要记住。 如果您正在调试器件、每次将代码加载到 MCU 中时、"persistent"变量将重新初始化、除非您从其默认值更改某些调试器设置。

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

    我只是注意到:

    > struct activation_time time_array[100];

    Persistent()变量必须显式初始化。 当我尝试等效的东西时、我得到了一个警告并且变量被放置在 SRAM (.bss)中。 检查.map 文件以查看变量的最终位置。

    请尝试以下类似方法:

    > struct activation_time time_array[100]={0、};

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

    谢谢 Seth、

     链接器文件中存在.TI.persistent。

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

    感谢 Bruce、

     我尝试执行该初始化,奇怪的是,我无法再从结构中写入/或读取合理的值。 不确定我是否理解这一点。  

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

    在 SRAM 中之前(始终可写/短暂)。 现在它位于程序 FRAM 中、因此必须设置 PFWP=0才能对其进行写入。

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

    很不错!!! 非常感谢 Bruce -我将假日卡发送到哪里? 因此、这里的教训是、要使变量持久、必须初始化变量、并将变量存储在程序空间而不是数据空间中。