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.

[参考译文] MSP430FR6989:FRAM

Guru**** 2524460 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/911028/msp430fr6989-fram

器件型号:MSP430FR6989

我对 FRAM 读/写的使用感到困惑。 我读取代码演示和程序、只需如下所示定义一个数组:

#pragma PERSISTENT (FRAM_WRITE)
unsigned long FRAM_WRITE[WRITE_SIZE]={0};

数据将像这样写入 FRAM?  我如何知道它已写入 FRAM 而不是 RAM 或其他位置?  

如果我想读取触发复位后存在的数据该怎么办? 您能向我推荐更多手册或演示吗?

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

    您好!  

    上面列出的命令仅用于 FRAM_WRITE 阵列初始化。 如果要写入数据、请参阅 MSP430FR6x8x 代码示例中的 msp430fr69xx_framwrite.c。  

    有关如何确认数据是否写入 FRAM 的信息,您可以使用 View->Memory Browser 来检查 FRAM_WRITE 数组数据,并查看其是否位于 FRAM 存储器空间中。  

    为了读取 FRAM_WRITE[]中存在的数据,可以直接定义一个变量,将 FRAM_WRITE 数据分配给该变量。 例如、  

    • unsigned long FRAM_Read;  
    • MAIN ()
    • (笑声)
    • FRAM_READ = FRAM_WRITE[0];  
    • FRAM_READ = FRAM_WRITE[1];  
    • (笑声)

    谢谢、  

    Lixin  

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

    非常感谢您的回复、Chen!!

    实际上、我已经阅读了 damo msp430fr69xx_frewurite 和  MSP430FR6x8x 代码示例、我感到困惑的是、在程序 C 中没有 FRAM 的起始位置定义、而是在程序汇编语言中。 这是否意味着不需要使用 C 语言来定义起始位置  、它会每次直接将数据写入 FRAM、而不是 RAM 或其他地方?  

    此致

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

    您好!  

    当您在 CCS 或 IAR IDE 工具中选择 MSP430FRxx 器件时、编译器将自动从内部源文件定义 FRAM 起始地址和空间、RAM 地址和空间、寄存器地址和空间。 用户无需考虑这一点。 成功编译代码后、您可以在.map 文件中找到 FRAM 地址。 用户代码、RAM、堆栈、变量地址由 IDE 工具自动分配。  

    谢谢、  

    Lixin  

     

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

    这是 CCS 中的一个示例.map 文件、供您参考。 您也可以使用 View -> Expressions 查看您在代码中定义的变量。  

    谢谢、  

    Lixin  

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

    您好!  

    你还有其他问题吗?  

    如果我的回答帮助您解决问题、您能否帮助单击"这有助于我解决问题"按钮?  

    谢谢、  

    Lixin  

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

    你好,陈,你的答案很清楚,非常感谢!

    但是,如果我想在复位或上电后获取 FRAM 中已经存在的一些数据,该怎么办? 例如、我检测一些温度数据并将其保存到 FRAM 中、恐怕器件会意外断电。 因此、我想在开始时读取 FRAM 中的数据。 PRagram 如何实现此函数、它的工作方式是否如下:

    (笑声)

    unsigned long * fram_address = 0x80;

    无符号长整型数据;

    数据=* fram 地址;

    (笑声)

    还有其他更好的方法吗?

    很抱歉、多次给您带来麻烦、我真诚地期待您的回复。

     

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

    您好!  

    要读取保存到 FRAM 中的 FRAM 变量、就像读取在 RAM 中定义的正常变量一样。 我在上一帖子中展示了该示例。  

    有两种 FRAM 写入方法。 在以下代码示例中、我展示了对 FRAM 的写入和对 FRAM 的读取。  

    1.使用 persistent 内在函数。 编译器将为变量分配 FRAM 地址(请参阅文档 slau132)

    //静态初始化变量

    #ifdef __TI_Compiler_version__
    #pragma PERSISTENT (Port_EVENT)
    unsigned long data_FRAM = 0;
    #Elif __IAR_systems_ICC__
    __persistent unsigned long Port_event = 0;
    其他
    //将以下变量移植到所使用的特定编译器的等效持久功能
    unsigned long Port_event = 0;
    #endif

    unsigned long read_FRAM、read_FRAM2;

    int main (空)

    WDTCTL = WDTPW | WDTHOLD;//停止 WDT

    P1OUT &=~BIT0;//清除 P1.0输出锁存器以实现定义的加电状态
    P1DIR |= BIT0;//将 P1.0设置为输出方向 OUT

    PM5CTL0 &=~LOCKLPM5;//禁用 GPIO 上电默认高阻抗模式

     

    Read_FRAM = DATA_FRAM;     //将数据从 DATA_FRAM 读取到 READ_FRAM

    (笑声)

    //触发 DATA_FRAM 写入的一些事件。 这里只是一个示例

    DATA_FRAM = 0x989;

    2.直接分配 FRAM 地址。 有关 FRAM 信息存储器和代码存储器地址空间、请查看数据表中的存储器映射。

    #define WRITE_SIZE   128

    unsigned long * FRAM_WRITE_ptr;
    无符号长整型数据;

    #define FRAM_TEST_START 0x1900

    void FRAMWrite (void);


    int main (空)

    WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器

    P1OUT &=~BIT0;//清除 P1.0输出锁存器以实现定义的加电状态
    P1DIR |= BIT0;//将 P1.0设置为输出方向 OUT

    PM5CTL0 &=~LOCKLPM5;//禁用 GPIO 上电默认高阻抗模式

    READ_FRAM = FRAM_WRITE_PTR[0];  //读取 FRAM 数据进行检查

    FRAM_WRITE_PTR =(unsigned long *) FRAM_TEST_START;  //分配 FRAM 写入起始地址

    数据+= 0x00010001;

    FRAMWrite(); //为 WRITE_SIZE 写入 FRAM     

    (笑声)

    空 FRAMWrite (空)

    unsigned int i=0;

    对于(i=0;i< write_size;i++)

    *FRAM_WRITE_PTR++=数据;

    谢谢、  

    Lixin  

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

    这完全解决了我的问题! 非常感谢、Li!