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.

[参考译文] MSP430FR2311:MSP430 FRAM 写入/读取

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/863011/msp430fr2311-msp430-fram-write-read

器件型号:MSP430FR2311

尊敬的 TI 团队:

MSP430FR2311PW20具有 FRAM、对吧?  

查找从 FRAM 读取/写入的任何示例代码。

此致、

Walter

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

    您好、Walter、

    这里是 FR2311器件的一些示例项目、有几个用于 FRAM 写入的示例项目。

    http://dev.ti.com/tirex/explore/node?node=ANl1oYi0.klyjvtEKGoMlA__IOGqZri__LATEST&search=MSP430FR2311

    谢谢、

    是的

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

    谢谢 Yiding、

    什么是仅用于信息数据的 FRAM 存储器? 还是没有区别?

    MSP430FR231x MCU 的存储器映射仅显示范围:

    FFFFh 至 FF80h

    FFFFh 至 F100h

    此致、

    Walter

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

    您好、Yiding、

    写入在运行时被置位并且能够读取值。

    重新启动后、我读取了值、但该值未保留

    #define FRAM_TEST_START 0xFD00  

    unsigned int *pointer;

    unsigned int data;
    void main()
    {
        pointer = (unsigned int *)FRAM_TEST_START; // address to read
        data = *pointer; // data to read
        while(1);
    }

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

    尊敬的 TI 团队:

    计划使用 persistent、但 在启动后仍无法读取:

    http://dev.ti.com/tirex/explore/node?node=ALjQeIC7Hu5Y4ISuzhBZQw__IOGqZri__LATEST&search=MSP430FR2311

    此致、

    Walter

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

    您好、Walter、

    您能否提供有关引导后无法读取这一含义的更多信息?  

    谢谢、

    是的

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

    您好、Yiding、  

    我只是使用简单的 persistent 变量。

    --------------------------

    #pragma PERSISTENT (值)

    无符号长整型值= 0;

    WDTCTL = WDTPW | WDTHOLD;//停止 WDT

    SYSCFG0 = FRWPPW;//编程 FRAM 写入使能

    值++;  

    SYSCFG0 = FRWPPW | PFWP;//编程 FRAM 写保护

    --------------------

     我是否需要 添加此项?

    RTCCTL = 0;

    PMMCTL0_H = PMMPW_H;//打开 PMM 寄存器进行写入
    PMMCTL0_L |= PMMREGOFF;//并设置 PMMREGOFF
    PMMCTL0_H = 0;//锁定 PMM 寄存器

    我希望能够在下电上电后读取保存的值。

    if (值)

     //正确写入。

    否则{

    // 不是正确的 writetn。

    此致、

    Walter

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

    根据定义、它应该像这样工作。

    1
    2.
    #pragma PERSISTENT ( count )
    uint16_t count = 0;

    创建变量"count"并告诉代码生成工具将其放置在"persistent"存储器中;也就是说、变量将放置在 FRAM 中、这是一种永久性存储器类型。 通过这种方式、代码可以像 RAM 中一样读取和写入变量、但即使器件断电、其值也会被保留。

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

    您好、Walter、

    • 正确的做法是、通过设置变量 persistent、它将被放置到 FRAM 中、您可以在 lnk_msp430fr2311.cmd 文件中找到该文件、其中显示:

    组(READ_WRITE_MEMORY)

    .TI.persistent:{}/* for #pragma PERSISTENT */

    >FRAM

    • 要写入 FRAM、您需要启用 FRAM 写入、而您正是通过 FRAM 写入

    SYSCFG0 = FRWPPW;//编程 FRAM 写入使能

    值++;

    SYSCFG0 = FRWPPW | PFWP;//编程 FRAM 写保护

    • 因此、我想首先检查程序是否将变量正确放入 FRAM 中。 是否可以使用调试器检查 persistent 变量地址? 该变量应放置在 FRAM 存储器地址范围内。  FRAM:origin = 0xF100、length = 0xE80

    谢谢、

    是的   

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

     数据已存在、但当我重新引导系统时、在引导后立即读取数据。 数据 ID 返回零。

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

    您好、Walter、

    在重置电源后、您是如何读取该值的? 如果您使用调试器标准设置、它将在您调试器件后重置该值。

    我刚刚在 FR2311 Launchpad 上尝试过、这里是用于测试 持久性变量的简单代码。

    如果 LED 在引导后亮起、则表示变量 Port_event 在复位电源后保留其值。

    #include 
    
    //静态初始化的变量
    #ifdef __TI_Compiler_version__#pragma
    PERSISTENT (Port_EVENT)
    unsigned Long Port_EVENT =0;
    #endif
    
    void initGpio (void);
    
    int main (void)
    {
    WDTCTL = WDTPW | WDTHOLD; //停止 WDT
    
    //配置 GPIO
    initGpio();
    
    if (Port_event == 6)
    {
    P1OUT |= BIT0;
    }
    其他
    {
    P1OUT &=~BIT0;
    }
    
    while (Port_event <= 5)
    {
    SYSCFG0 = FRWPPW; //程序 FRAM 写入使能
    PORT_EVENT_++; //在 FRAM 中记录端口事件
    SYSCFG0 = FRWPPW | PFWP; //程序 FRAM 受写保护(不可写)
    }
    
    while (1)
    {
    __no_operation();
    }
    
    }
    
    void initGpio()
    {
    P1DIR = 0xFF;P2DIR = 0xFF;
    P1REN = 0xFF;P2REN = 0xFF;
    P1OUT = 0x00;P2OUT = 0x00;
    
    //禁用 GPIO 上电默认高阻抗模式
    //激活先前配置的端口设置
    PM5CTL0 &=~LOCKLPM5;
    } 

    谢谢、

    是的

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

    您好、Yiding、

    好的、我们需要停止看门狗吗?

    此致、

    Walter

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

    您好、Walter、

    对于您的程序、如果您不想使用看门狗、则应将其禁用。

    但是、即使启用了看门狗计时器并且有看门狗计时器复位 、它也不应复位持久性变量。

    谢谢、

    是的  

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

    您好、Yiding、

    现在、好了。

    此致、

    Walter