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.

FRAM问题请教

Other Parts Discussed in Thread: MSP430FR5994

想请问下各位

看MSP430选型手册FRAM系列MCU中说到“Configurable as program or data memor”,是不是可以将部分FRAM分配给SRAM?如果可以的话怎么实现?

谢谢!

  • 这一句的意思应该是:可配置作为程序或者数据存储器

     

  • chunyu,

      通俗点说就是这个FRAM可以用来配置成存储程序,我们传统的Flash类型,或是配置成用来存储数据变量的RAM。

    这个是FRAM的特性,兼备Flash的掉电不丢失和RAM的快速读写。

    谢谢

  • 您好!

           我做的项目目前遇到的问题是想把FRAM当做EEPROM来使用,我尝试直接给FRAM写数据,掉电后数据还是会丢失,我想问一下,能否有相关的FRAM当做EEPROM来使用?项目非常着急,期待各位的回答,非常感谢!

    另外我想知道FRAM当做EEPROM使用是FR系列的亮点,为什么没有相关的示例呢,很是困惑!

  • 可以作为eeprom的。丢失是不是没存上?存上之后读一次试试

  • 你好, FRAM 读写都有范例代码的。

    掉电保存

    #include <msp430.h>
    
    void FRAMWrite(void);
    
    unsigned char count = 0;
    unsigned long *FRAM_write_ptr;
    unsigned long data;
    
    #define FRAM_TEST_START 0x1800
    
    
    int main(void)
    {
        WDTCTL = WDTPW | WDTHOLD;               // Stop watchdog timer
    
        P1OUT &= ~BIT0;                         // Clear P1.0 output latch for a defined power-on state
        P1DIR |= BIT0;                          // Set P1.0 to output directionOUT
    
        PM5CTL0 &= ~LOCKLPM5;                   // Disable the GPIO power-on default high-impedance mode
                                                // to activate previously configured port settings
        data = 0x11111111;                      // Initialize dummy data
    
        while(1)
        {
            data += 0x00010001;
            FRAM_write_ptr = (unsigned long *)FRAM_TEST_START;
            FRAMWrite();
            count++;
            if (count > 100)
            {
                P1OUT ^= 0x01;                  // Toggle LED to show 512K bytes
                count = 0;                      // ..have been written
                data = 0x11111111;
            }
        }
    }
    
    void FRAMWrite (void)
    {
        unsigned int i=0;
    
        SYSCFG0 &= ~DFWP;
        for (i = 0; i < 128; i++)
        {
            *FRAM_write_ptr++ = data;
        }
        SYSCFG0 |= DFWP;
    }
  • 您好:

            感谢您的提示,这个代码之前我测试不行,昨天测试就可以了,

    我想请教一下,我需要存放变量的地址是需要自己在FRAM中划分出一块专门来存放变量,还是说我随便都可以定义一个起始地址开始存放,如果这样可以的话,烧写代码或者代码运行的过程中,这些地址的内容会不会被误操作,期待您的回复,谢谢!

  • 您说的配置,能说的具体一点吗,我应该怎么设置就是传统的FLASH,怎么做是SRAM,又怎么做是EEPROM?这个感觉太模糊了,

    还是说FRAM本身就具备这三种特性,只是看我自己使用他的什么特性?期待您的解释,谢谢!

  • 用户数据一般存放在数据区,这样就可以避免程序代码被改掉。

    有一些FRAM的产品是带MPU的,建议看一下数据手册和用户手册。

  • 是不是还要添加其他头文件,SYSCFG0 和 DFWP 提示未定义

  • m 说:

    是不是还要添加其他�文件,SYSCFG0 和 DFWP 提示未定义

    你用的哪颗芯片,可以参考该芯片的范例代码。

  • MSP4330FR5994,不过我没有加 SYSCFG0 &= ~DFWP 数据也能写进去,不知道为什么

  • m 说:

    MSP4330FR5994,不过我没有加 SYSCFG0 &= ~DFWP 数据也能写进去,不知道为什么

    //******************************************************************************
    //   MSP430FR5x9x Demo - Long word writes to FRAM
    //
    //   Description: Use long word write to write to 512 byte blocks of FRAM.
    //   Toggle LED after every 100 writes.
    //   NOTE: Running this example for extended periods will impact the FRAM
    //   endurance. MPU is also enabled by default in CCS.
    //   MCLK = SMCLK = default DCO
    //
    //           MSP430FR5994
    //         ---------------
    //     /|\|               |
    //      | |               |
    //      --|RST            |
    //        |               |
    //        |               |
    //        |          P1.0 |---> LED
    //
    //   William Goh
    //   Texas Instruments Inc.
    //   October 2015
    //   Built with IAR Embedded Workbench V6.30 & Code Composer Studio V6.1
    //******************************************************************************
    #include <msp430.h>
    
    #define WRITE_SIZE      128
    
    void FRAMWrite(void);
    
    unsigned char count = 0;
    unsigned long data;
    
    #if defined(__TI_COMPILER_VERSION__)
    #pragma PERSISTENT(FRAM_write)
    unsigned long FRAM_write[WRITE_SIZE] = {0};
    #elif defined(__IAR_SYSTEMS_ICC__)
    __persistent unsigned long FRAM_write[WRITE_SIZE] = {0};
    #else
    #error Compiler not supported!
    #endif
    
    int main(void)
    {
        WDTCTL = WDTPW | WDTHOLD;               // Stop WDT
    
        // Configure GPIO
        P1OUT &= ~BIT0;                         // Clear P1.0 output latch for a defined power-on state
        P1DIR |= BIT0;                          // Set P1.0 to output direction
    
        // Disable the GPIO power-on default high-impedance mode to activate
        // previously configured port settings
        PM5CTL0 &= ~LOCKLPM5;
    
        // Initialize dummy data
        data = 0x00010001;
    
        while(1)
        {
            data += 0x00010001;
            FRAMWrite();
            count++;
            if (count > 100)
            {
                P1OUT ^= 0x01;                  // Toggle LED to show 512K bytes
                count = 0;                      // ..have been written
                data = 0x00010001;
            }
        }
    }
    
    void FRAMWrite(void)
    {
        unsigned int i = 0;
    
        for (i = 0; i < 128; i++)
        {
            FRAM_write[i] = data;
        }
    }
  • #pragma PERSISTENT(FRAM_write)
    unsigned long FRAM_write[WRITE_SIZE] = {0};
    WRITE_SIZE=8192 时,提示:

     program will not fit into available memory. placement with alignment fails for section "RW_IPE" size 0x107fe lnk_msp430fr5994.cmd /OBEM_MSP430FR5994 line 147 C/C++ Problem

    应该如何处理,修改 .com文件吗?