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.

[参考译文] MSP430FR6043:FRAM

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

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

器件型号:MSP430FR6043
主题中讨论的其他器件:MSPWAREMSP430FR6041MSP430WARE、MSP430FR5043、 MSP430FR5041TEST2

尊敬的社区:

我想在 FRAM 中存储200字节的数据。  两个8字节 数据和一个32字节数据。

我正在使用 driverlib 尝试编写 FRAM 程序。

FRAMCTL_write8 (uint8_t * dataPtr、uint8_t * framPtr、uint16_t numberOfBytes);

FRAMCTL_write32 (uint32_t * dataPtr、uint32_t * framPtr、uint16_t count);

我没有获取有关上述 FRAM 函数的任何示例程序。 我从哪里获得示例代码?

已经使用了00009562字节、我想在剩余的未使用的00000a1e 字节中使用最后200个字节。

为了找出未使用数据的起始地址、我使用了以下公式。

未使用存储器的起始地址:  origin + used = 0x00006000 + 0x00009562 = 0x0000F562。

最后200字节的起始地址 MEMORY = END 地址 + 200byte = 0x0000FF80 - 0xC8 = 0x0000FEB8、以开始将数据存储在 FRAM 的最后200个字节中。

  1. 第一个8字节数据:0x0000FEB8至0x0000FEBF
  2. 第二个8字节数据:0x0000FEC0至0x0000FEC7
  3. 32字节数据:0x0000FEC8至0x0000FEE7

上述存储器计算是否正确?

请建议在哪里可以读取 FRAM 实现的示例代码?

此致、

萨尔沃特

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

    您好、Sarwath、

    有关直接向 FRAM 写入的示例代码、请参阅  指向 MSPWare SDK 中 FRAM 写入示例的链接。  

    如果您已经下载了 MSPWare、则还可以在以下文件路径中找到此示例:

    C:\ti\msp430ware_3_80_14_01\examples\devices\MSP430FR5xx_6xx\MSP430FR6043_MSP430FR6041_MSP430FR5043_MSP430FR5041_MSP430FR5041_MSP430FR\C Code_Examples

    如需更多信息、您应该查看 此 E2E 帖子

    对于第二个问题、我自己进行了计算、得到的结果与您相同。 看起来是正确的。

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

    尊敬的 Dylan Obrien:

    我介绍了用于从 FRAM 进行写入和读取的示例代码。 我怀疑如何指向一个 不同的 FRAM 地址 进行定义。  

    #define write_size   128

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

    此致、

    萨尔沃特

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

    Sarwath,

    请参阅 此页面、 其中介绍了 LOCATION pragma。 我相信这将允许您指定位置。 尝试将该指令放置在"#pragma persistent (FRAM_WRITE)"行下方。 我自己没有这样做,但看过去的帖子,我认为这应该是可行的。

    如果这对您有用、或者您需要其他建议、请告诉我。

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

    是的、我可以使用 LOCATION pragma 来访问所需的 FRAM 存储器部分。 但我不确定我是否写的数据正确在该部分 . 您能检查我的代码读写函数吗?

    #include <msp430.h>
    #include <stdint.h>
    #define WRITE_SIZE      8
    
    void FRAMWrite(void);
    void FRAMRead(void);
    
    unsigned char count = 0;
    unsigned long data;
    
    
    #pragma PERSISTENT(FRAM_write)
    #pragma LOCATION(FRAM_write,0x0000FEB8)
    uint8_t FRAM_write[WRITE_SIZE] = {0};
    
    unsigned int *pointer;
    unsigned int readData;
    int main(void)
    {
        WDTCTL = WDTPW | WDTHOLD;               // Stop WDT
    
    
        // Disable the GPIO power-on default high-impedance mode to activate
        // previously configured port settings
        PM5CTL0 &= ~LOCKLPM5;
    
        //clear password
        FRCTL0|=NWAITS_0|FRCTLPW;
    
        //enable power
        GCCTL0|=FRPWR;
    
        // Initialize dummy data
        data = 0x00010001;
    
        while(1)
        {
            data += 0x00010001;
            //FRAMWrite();
            FRAMRead();
            count++;
        }
    }
    
    void FRAMWrite(void)
    {
        unsigned int i = 0;
    
        for (i = 0; i < 8; i++)
        {
            FRAM_write[i] = data;
        }
    }
    
    void FRAMRead()
    {
        pointer=(unsigned int *)FRAM_write;
        readData = *pointer;
    }
    

    此致、

    萨尔沃特

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

    MPUCTL0 = MPUPW;

    //清除密码
    FRCTL0= N.WAITS_0|FRCTLPW;

    //启用电源
    GCCTL0= PWR;

    我通过添加  MPUCTL0 = MPUPW 删除了写保护。

    现在、我可以在 FRAM_Write 位置看到一些数据。 但这是不正确的。

    我不想使用 for 循环来写入数据。

    空 FRAMWrite (空)
    {

      FRAM_WRITE =(uint8_t *) 0xA;

    是否可以编写与上述函数类似的内容?

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

    Sarwath,

    我建议您在器件上运行这些代码并读取存储器、以查看其是否按照您的要求运行。  当您检查变量的值时、应该刷新存储器浏览器。 您还可以导出器件的存储器并以这种方式读取它。  

    当您尝试第一个示例代码(该示例未指定存储数据的地址)时、您是否能够看到放置在存储器中的正确值? 当您尝试新代码时、是否仍能在内存中看到它?  

    请尝试自行执行、如果无法解决、则返回此线程。

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

    现在我将数据更改为10 (0xA)。 我无法理解 ReadData 2570。

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

    Sarwath,

    根据您的 表达式窗口、看起来您的值已正确保存、对吧?

    您的内存浏览器视图让我感到困惑。 它显示的值与表达式窗口中的值不同。 这些牵引装置是否同时显示相同的内容? 您是否刷新了这两个窗口? 您是否正确利用了指针?

    似乎您的值已正确放置在内存中、因此我认为这提示您需要更改指针的使用。

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

    是的。我可以在表达式窗口中看到 FRAM_WRITE 数据。 为什么将值2570保存在存储器浏览器的 FRAM 位置? 我不明白指针的用法。 您指的是哪个指针?

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

    表达式窗口指示将正确的信息保存在正确的位置。 您的内存浏览器显示不同的信息保存在同一个位置。 我问你是否刷新这些窗口,并在同一时间拍摄屏幕截图. 我所指的指针是您在 FRAMread ()函数中使用的指针。 您的 Expressions 窗口显示了正确的值、这一事实使我认为您已正确写入 FRAM。

    什么存储在存储器的地址2570中? FRAM_WRITE[]是否仅存储指向正确数据的指针?  

    我无法运行您在设备上发布的代码、因此我在这里帮助您进行调试的能力有限。

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

    我正在 FRAM 中写入0xA。 在"Memory Browser"中显示正确的值。

    现在我可以写入数据。 但我想存储一个 bool 值、一个浮点值和一个19位数字。 我想将数据直接存储在 FRAM 地址上、例如0xFFA=1、0X1FFA=11.79797和0X2FFF=12563846238261816192、而不是 for 循环。 是否可以这样编写?

    我不想将 fram 地址声明为数组。 可以建议我采用另一种方法吗?

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

    我链接到您的第一篇文章介绍了如何在不使用数组的情况下存储这些值。 您可以简单地声明 FRAM 的多个区域、如该链接所示、并为其多次分配值。

    这些都是可能的、只需考虑要保存的值的大小。 bool 与您已声明的 FRAM_WRITE 索引的大小相同、因此这是相同的。 浮点值是4个字节、因此您需要分配该存储器容量并进行相应的写入。 19位数字需要保存10个字节。 您必须将其分成多个部分并将其保存为原样。

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

    现在、我声明了两个指针和两个 FRAM 存储器地址。

    uint8_t * fRAM_write1_ptr;
    浮点* FRAM_write2_ptr;
    uint8_t data1;  //发送 bool 数据
    float data2;    //发送 float 数据
    #define FRAM_TEST1_START 0xFEB8
    #define FRAM_TEST2_START 0xFEC0

    我能够将这两个值存储在 FRAM 中的确切位置。

    现在、我将数据存储在 FRAM 中。 我创建了新项目以从相同的存储器位置读取数据。 但是、我没有从这两个位置获得存储的值。

    我将在下面附加读取程序、

    #include <msp430.h>
    #include <stdint.h>
    
    #define FRAM_TEST1_START 0xFEB8
    #define FRAM_TEST2_START 0xFEC0
    
    uint8_t *FRAM_ptr1_read;
    float *FRAM_ptr2_read;
    
    uint8_t data1;
    float data2;
    
    int main(void) {
    
        WDTCTL = WDTPW | WDTHOLD;               // Stop watchdog timer
    
        MPUCTL0 = MPUPW;
        //clear password
        FRCTL0=NWAITS_0|FRCTLPW;
    
        //enable power
        GCCTL0=FRPWR;
    
        PM5CTL0 &= ~LOCKLPM5;
    
        FRAM_ptr1_read=(uint8_t *)FRAM_TEST1_START;
        FRAM_ptr2_read=(float *)FRAM_TEST2_START;
    
        data1=*FRAM_ptr1_read;
        data2=*FRAM_ptr2_read;
        return (0);
    }
    

    我为什么不能从 FRAM 获得存储的值。

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

    如果你使用了缺省调试设置、你很可能在开始一个新会话时擦除了存储器的内容。 您可以转到调试配置、选择目标配置文件、转到目标、MSP430闪存设置并选择仅替换写入的存储器位置、从而停止调试器擦除存储器。 在"Program/Memory Load"选项中、还应确保"Reset the target on a connect"和"Reset the target on a program load or restart"均未选中。 然后、当你连接时、你应该能够读取这些值、只要你的新程序不会覆盖它们。