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.

read and write data from internal memory

Other Parts Discussed in Thread: MSP430G2211

hello friends,

i wanted to store and read data from internal memory such as flash or info memory..

in my application i need to store data which does not get removed when i power off the device and also read whenever i want.

i know there are many threads related to this but no one gives a clear idea how to do it.

i am using msp430g2211.

any help would be greatful.

sorry if there is any mistake.

  • Hi,

    Try this example: 

    /* --COPYRIGHT--,BSD_EX
     * Copyright (c) 2012, 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--*/
    //******************************************************************************
    //  MSP430G2xx1 Demo - Flash In-System Programming, Copy SegC to SegD
    //
    //  Description: This program first erases flash seg C, then it increments all
    //  values in seg C, then it erases seg D, then copies seg C to seg D.
    //  Assumed MCLK 771kHz - 1428kHz.
    //  //* Set Breakpoint on NOP in the Mainloop to avoid Stressing Flash *//
    //
    //               MSP430G2xx1
    //            -----------------
    //        /|\|              XIN|-
    //         | |                 |
    //         --|RST          XOUT|-
    //           |                 |
    //
    //  D. Dang
    //  Texas Instruments Inc.
    //  October 2010
    //  Built with CCS Version 4.2.0 and IAR Embedded Workbench Version: 5.10
    //******************************************************************************
    
    #include <msp430.h>
    
    char  value;                                // 8-bit value to write to segment A
    
    // Function prototypes
    void write_SegC (char value);
    void copy_C2D (void);
    
    int main(void)
    {
      WDTCTL = WDTPW + WDTHOLD;                 // Stop watchdog timer
      if (CALBC1_1MHZ==0xFF)					// If calibration constants erased
      {											
        while(1);                               // do not load, trap CPU!!	
      }
      DCOCTL = 0;                               // Select lowest DCOx and MODx settings
      BCSCTL1 = CALBC1_1MHZ;                    // Set DCO to 1MHz
      DCOCTL = CALDCO_1MHZ;
      FCTL2 = FWKEY + FSSEL0 + FN1;             // MCLK/3 for Flash Timing Generator
      value = 0;                                // initialize value
    
      while(1)                                  // Repeat forever
      {
        write_SegC(value++);                    // Write segment C, increment value
        copy_C2D();                             // Copy segment C to D
        _NOP();                                 // SET BREAKPOINT HERE
      }
    }
    
    void write_SegC (char value)
    {
      char *Flash_ptr;                          // Flash pointer
      unsigned int i;
    
      Flash_ptr = (char *) 0x1040;              // Initialize Flash pointer
      FCTL1 = FWKEY + ERASE;                    // Set Erase bit
      FCTL3 = FWKEY;                            // Clear Lock bit
      *Flash_ptr = 0;                           // Dummy write to erase Flash segment
    
      FCTL1 = FWKEY + WRT;                      // Set WRT bit for write operation
    
      for (i=0; i<64; i++)
      {
        *Flash_ptr++ = value;                   // Write value to flash
      }
    
      FCTL1 = FWKEY;                            // Clear WRT bit
      FCTL3 = FWKEY + LOCK;                     // Set LOCK bit
    }
    
    void copy_C2D (void)
    {
      char *Flash_ptrC;                         // Segment C pointer
      char *Flash_ptrD;                         // Segment D pointer
      unsigned int i;
    
      Flash_ptrC = (char *) 0x1040;             // Initialize Flash segment C pointer
      Flash_ptrD = (char *) 0x1000;             // Initialize Flash segment D pointer
      FCTL1 = FWKEY + ERASE;                    // Set Erase bit
      FCTL3 = FWKEY;                            // Clear Lock bit
      *Flash_ptrD = 0;                          // Dummy write to erase Flash segment D
      FCTL1 = FWKEY + WRT;                      // Set WRT bit for write operation
    
      for (i=0; i<64; i++)
      {
        *Flash_ptrD++ = *Flash_ptrC++;          // copy value segment C to segment D
      }
    
      FCTL1 = FWKEY;                            // Clear WRT bit
      FCTL3 = FWKEY + LOCK;                     // Set LOCK bit
    }
    

    You can find all code examples here: http://www.ti.com/lsds/ti/microcontroller/16-bit_msp430/tools_software.page#code

    Regards,

    Luis R

  • how do i verify that the data is written or not???

    i used a function 

    char TEST[64];

    void Read_data()
    {
    char *Flash_ptrA;

    int i;

    Flash_ptrA = (char *)0x1040;
    for (i = 0; i <64; i++)
    {
    TEST[i] = *Flash_ptrA++;
    }
    _NOP();
    }

    But the data never gets stored in TEST..

  • The function is OK. Which tool are you using? 

    Do you see the values of infoC-infoD changing in memory when debugging?

    Regards,

    Luis R

  • yea pointer shows the value in watch window but it doesnt store...

    i am using code composer studio 5.5 and MSP-FET430UIF debugger.

  • Your compiler is very smart. It thinks your code is useless and thus ignored it.

  • how should i fix it ..!!

  • I am melting, I am melting ...

    No, not melting, not evaporating either.

    "volatile". That is the word. Tell the compiler it is "volatile".

  • The compiler is analyzing the program flow. It detects superfluous or redundant actions and eliminates/joins them to save time and space.

    If an action has a side-effect that cannot be detected by analyzing the program flow (like an interrupt 'magically' changing a global variable), you need to tell the compiler that this may happen.

    The volatile keyword tells the compiler that accessing a variable may have undetectable side-effects. This forces the compiler to do no optimization on it (leading to larger and slower code).
    Example: You clear and set a bit in a port register. the compiler will notice that the second action undoes the first and eliminates the first as being superfluous. However, for the short time between the two changes, the port would have changes state, causing an externally visible pulse. Which was the intention. The compiler doesn't know nor does it care.
    For this reason, all hardware registers are declared volatile. So the compile rwon't alter the order or number of accesses, nor doe sit buffer contents in a processor register or do any othe roptimizations.

    However, in some cases, the compiler will know better. If you define a local variable and never pass a reference to it to outside code, the compiler knows for sue that it cannot have side-effects, and will ignore the volatile keyword.

    So empty delay-loops with a local variable will fail to work when optimization kicks in. Volatile or not..

**Attention** This is a public forum