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/MSP-EXP430FR5969:分配 FRAM 存储器中的数据时出现问题

Guru**** 2540720 points
Other Parts Discussed in Thread: MSP-EXP430FR5969

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/782424/ccs-msp-exp430fr5969-problems-in-allocating-data-in-fram-memory

器件型号:MSP-EXP430FR5969

工具/软件:Code Composer Studio

我使用 MSP-EXP430FR5969电路板并尝试将数据写入 FRAM 存储器。
我搜索并发现有必要使用#pragma NOINIT 和#pragma LOCATION。 我看到了几种形式、我无法将该数据保存到所需的地址。
下面是我尝试的方法:
#include "driverlib.h"
#pragma NOINIT (BETA)

#pragma LOCATION (BETA、0x8C00)

int beta;

int main (void){

WDT_A_HOLD (WDT_A_base);
beta = 1;
return (0);
} 

这是.txt 文件:

@4400
81 00 24 B1 13 00 00 B1 13 64 00 0C 43 B1 13
4C 00 1C 43 B1 13 5E 00 32 D0 10 00 FD 3F 03 43
@ff80
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
@ffcc
18 44 18 44 18 44 18 44 18 44 18 44 18 44 18 44
18 44 18 44 18 44 18 44 18 44 18 44 18 44 18 44 18 44 18 44 18 44 18 44 18 44
18 44 18 44 18 44 18 44 18 44 18 44 18 44 18 44 18 44 18 44 18 44 44 18 44 44 18 44 44 18 44 44 44 44 44 44 44
18 44 00 44 B2 40 00 A5 A0 05 3F 40 80 04 82 4F
A6 05 3F 40 C0 08 82 4F A4 05 3F 40 FF 82 4F 82 4F
A8 05 3F 40 01 A5 82 4F A0 05 C2 43 A1 05 10 01
CF 0C 3F 50 0C 00 2F 4F 7F F0 7F 00 7F D0 80 00
4F 3F 50 00 5A 3C 50 0C 00 8C 4F 00 00 10 01
3C 40 50 01 B1 13 2C 00 40 18 92 43 00 8C 43
10 01 03 43 FF 3F 03 43 1C 43 10 01
q 

我以不同的方式(#pragma PERSISTENT)完成了它、并且它工作正常。 但是、该变量在程序启动时保存为"固定"。 也就是说、我无法在程序期间保存任何变量。

以下是示例:

#include "driverlib.h"

#pragma PERSISTENT (BETA)

#pragma LOCATION (BETA、0x8C00)

int beta = 10;

int main (void){

WDT_A_HOLD (WDT_A_base);
beta = 1;
return (0);
} 

这是.txt 文件:

@4400
81 00 24 B1 13 00 00 B1 13 64 00 0C 43 B1 13
4C 00 1C 43 B1 13 5E 00 32 D0 10 00 FD 3F 03 43
@8c00
0A 00
@ff80
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
@ffcc
18 44 18 44 18 44 18 44 18 44 18 44 18 44 18 44
18 44 18 44 18 44 18 44 18 44 18 44 18 44 18 44 18 44 18 44 18 44 18 44 18 44
18 44 18 44 18 44 18 44 18 44 18 44 18 44 18 44 18 44 18 44 18 44 44 18 44 44 18 44 44 18 44 44 44 44 44 44 44
18 44 00 44 B2 40 00 A5 A0 05 3F 40 80 04 82 4F
A6 05 3F 40 C0 08 82 4F A4 05 3F 40 FF 82 4F 82 4F
A8 05 3F 40 01 A5 82 4F A0 05 C2 43 A1 05 10 01
CF 0C 3F 50 0C 00 2F 4F 7F F0 7F 00 7F D0 80 00
4F 3F 50 00 5A 3C 50 0C 00 8C 4F 00 00 10 01
3C 40 50 01 B1 13 2C 00 40 18 92 43 00 8C 43
10 01 03 43 FF 3F 03 43 1C 43 10 01
q 

怎么了、我不能使用 NOINIT? 并且、使用 NOINIT、可以在程序期间保存变量吗?

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

    您好!

    [引用用户="user5209019"]#include "driverlib.h"

    #pragma NOINIT (BETA)

    #pragma LOCATION (BETA、0x8C00)

    int beta;

    int main (void){

    WDT_A_HOLD (WDT_A_base);

    Beta = 1;

    返回(0);}[/引号]

    第一个示例正确。  您可以设置一个位置并禁用 MPU 来写入该 FRAM 位置。  您的调试文件夹中有一个.map 文件、您可以搜索该文件、并看到已在0x8C00分配 beta。   

    .TI.bound:beta
    * 0 00008c00 00000002 未初始化
    00008c00 00000002 msp430fr59xx_framwrite.obj (.TI.bound:beta) 

    您在.txt 文件中看不到它的原因是这是因为这是一个 NO_Init 变量、这意味着如果不存在默认值。  因此、您不会在.txt 输出文件中看到它。   

    调试时、您可以在"View"菜单下启用存储器浏览器。  在这里、您可以看到指针 β 和存储器位置正在更新。   

     持久性 pragma 用于加载此位置的预定义值。  这就是您在.txt 文件中看到它的原因。   

    此外、在手动放置不会干扰您的应用程序代码的变量/缓冲区时、我会非常小心。  有一些信息段可用于其中的某些数据、也可以手动调整链接器文件、以便不会与链接器发生冲突。  

    谢谢、

    JD   

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

    感谢您的解释。
    另一个问题:如果我使用#pragma NOINIT、它会被写入 FRAM 存储器吗? 如果是、如果关闭 UC、我是否可以再次访问此值? 如何访问此数据(什么方法)?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    否、如果使用 NOINIT、则在变量被声明时不会向其写入任何内容、因为它"未初始化"。 因此、即使在下电上电后、最后一次写入该位置的内容仍将保留在该位置。

    在这种情况下、您只需像普通那样读取变量、即可看到上次保存的值。

    谢谢、
    JD