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/MSP430FR2433: How to write to and read from FRAM?

Part Number: MSP430FR2433
Other Parts Discussed in Thread: MSP430WARE,

Tool/software: Code Composer Studio

Hello,

I'm relatively new to the MSP world or microcontrollers. Just wondering if there exists any code or tutorials specifically about how to write and read to the FRAM? I'm using code composer 8 and need something to guide me along.

Thanks,

Sara

  • Hi Sarah,

    There are basic FRAM write examples in our MSP430Ware software package.

    You can download the examples at the link above, or get them from the resource explorer in Code Composer Studio v8 since you're using that (go to View->Resource Explorer).

    Writing to FRAM is very easy on the MSP430FR2433 as the memory protection mechanisms are very basic.  The code example below (taken from MSP430Ware) shows how to write a block of data:

    /* --COPYRIGHT--,BSD_EX
     * Copyright (c) 2014, Texas Instruments Incorporated
     * All rights reserved.
     *
     * Redistribution and use in source and binary forms, with or without
     * modification, are permitted provided that the following conditions
     * are met:
     *
     * *  Redistributions of source code must retain the above copyright
     *    notice, this list of conditions and the following disclaimer.
     *
     * *  Redistributions in binary form must reproduce the above copyright
     *    notice, this list of conditions and the following disclaimer in the
     *    documentation and/or other materials provided with the distribution.
     *
     * *  Neither the name of Texas Instruments Incorporated nor the names of
     *    its contributors may be used to endorse or promote products derived
     *    from this software without specific prior written permission.
     *
     * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
     * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
     * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
     * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
     * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
     * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
     * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
     * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     *
     *******************************************************************************
     *
     *                       MSP430 CODE EXAMPLE DISCLAIMER
     *
     * MSP430 code examples are self-contained low-level programs that typically
     * demonstrate a single peripheral function or device feature in a highly
     * concise manner. For this the code may rely on the device's power-on default
     * register values and settings such as the clock configuration and care must
     * be taken when combining code from several examples to avoid potential side
     * effects. Also see www.ti.com/grace for a GUI- and www.ti.com/msp430ware
     * for an API functional library-approach to peripheral configuration.
     *
     * --/COPYRIGHT--*/
    //******************************************************************************
    //   MSP430FR243x 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.
    //   ACLK = REFO, MCLK = SMCLK = default DCODIV = ~1MHz
    //
    //   It is recommended to disable interrupt while code is writing to main FRAM,
    //   because it is dangerous for running the interrupt services routine with 
    //   PFWP disabled.
    //   This code examples is using DFWP which wouldn't have dangerous. But it is 
    //   recommended to disable interrupt if user is using PFWP.
    //
    //           MSP430FR2433
    //         ---------------
    //     /|\|               |
    //      | |               |
    //      --|RST            |
    //        |               |
    //        |          P1.0 |---> LED
    //
    //   Ling Zhu
    //   Texas Instruments Inc.
    //   Feb 2015
    //   Built with IAR Embedded Workbench v6.20 & Code Composer Studio v6.0.1
    //******************************************************************************
    #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 512 bytes
                count = 0;                      // have been written
                data = 0x11111111;
            }
        }
    }
    
    void FRAMWrite (void)
    {
        unsigned int i=0;
    
        SYSCFG0 = FRWPPW | PFWP;
        for (i = 0; i < 128; i++)
        {
            *FRAM_write_ptr++ = data;
        }
        SYSCFG0 = FRWPPW | PFWP | DFWP;
    }

    Let me know if you have further questions.

    Regards,
    Walter

  • Hi Walter,

    Thanks for the prompt reply and the link to a wealth of information!

    I have a question relating to the SYSCFG0 lines in the FRAMWrite function you provided. Doesn't the first line set the PFWP bit and thus prevent it from being written? Does that mean that the data FRAM will thus be written? Don't you have to enable the DFWP first? The second SYSCFG0 line looks like it disables writing to both data and program FRAM. Correct? That makes sense to me since at that point the write is complete.

    Thanks,

    Sara
  • user5057798 said:

    I have a question relating to the SYSCFG0 lines in the FRAMWrite function you provided. Doesn't the first line set the PFWP bit and thus prevent it from being written? Does that mean that the data FRAM will thus be written? Don't you have to enable the DFWP first?

    This device has two FRAM areas, program and data, with separately controlled write protection.  The program area is much larger, and is typically where your program code will go.  The data area is smaller and as meant to be an area to store user data.  You don't have to use it that way- you can store data in program space and code in data space, but you'll need to be careful in those cases that you don't unintentionally overwrite executable code with your data.  This is why two regions are given- to allow you to enable write access to a data area without risking the possibility of overwriting the executable code in the program area.  Of course, your usage depends on how much data you plan to store.  We also have other devices (like the MSP430FR5xx devices) which have a more complex memory protection module where you can partition the FRAM into three segments, each with separate read/write/execute permissions.

    The code example above only writes to the data section, and not to the program section. The line of code below is a word write to the full SYSCFG0 register.  It writes the password and the program section protect bit.  Note that the data section bit is left absent, meaning it is unprotected.

    SYSCFG0 = FRWPPW | PFWP;

    After the writes to the data section are complete, the data section is protected along with the program section via the line below.

    SYSCFG0 = FRWPPW | PFWP | DFWP;

    If you want to write to the program area and the data area, you would do this:

    SYSCFG0 = FRWPPW;

    That would clear both FRAM protection bits.  After the write, you'd want to re-enable the protection in the same way as before.

    user5057798 said:
    The second SYSCFG0 line looks like it disables writing to both data and program FRAM. Correct? That makes sense to me since at that point the write is complete.

    Correct.

    Regards,
    Walter

  • Thanks Walter! I appreciate your help!

    Do you have any examples for reading from the FRAM? I looked through MSPware and didn't see anything.

    Sara
  • Sarah,

    An easy way to handle this would be to take the reverse of the code example above.  More simply put, you can set up a pointer variable (in whatever size you like- byte (8 bits), word (16 bits)) and assign it the address you would like to read.

    Example:

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

**Attention** This is a public forum