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.

Compiler/MSP430G2553: CCS/ infoB

Part Number: MSP430G2553

Tool/software: TI C/C++ Compiler

Hi all,

I am trying to write to infoB of MSP430G2553 using,

#pragma DATA_SECTION(var_a, ".infoB")

const int var_a = 980;

But if I replace the infoB with infoC then I am able to write to infoC but not to infoB, is there any way possible to write to infoB as I have utilized the entire infoC and infoD. Can't use the infoA because of clock calibration data.

Thanks

Nitish

  • Hi Nithsh,

    Please refer to code example blew. 

    /* --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--*/
    //******************************************************************************
    //  MSP430G2xx3 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 *//
    //
    //               MSP430G2xx3
    //            -----------------
    //        /|\|              XIN|-
    //         | |                 |
    //         --|RST          XOUT|-
    //           |                 |
    //
    //  D. Dang
    //  Texas Instruments Inc.
    //  December 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 constant 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
        __no_operation();                       // 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
    }
    

    Regards,

    Ling

  • Thank you for your response but I dont want to waste time on startup to delete the memory or make use of any pointer. I know the #pragma DATA_SECTION works but I am not able to write using that to infoB, I have already used it for accessing infoC and infoD but when I add something for infoB, it stops working. I want to put these variables in an header files to allow the changes easy for different models.

    Nitish 

  • Hi Nitish,

    Try to use

    #pragma DATA_SECTION(var_a, ".infoB")
    
    volatile const int var_a = 980;

    Regards,

    Ling

  • It didn't work. Is there any limit on how many sections of memory we can write on to using #pragma DATA_SECTION ?

    Nitish

  • Hi Nitish,

    Would you please describe how it "didn't work" look like?

    Ling
  • Hi Ling,

    Sorry for the late reply.

    Here is my problem:
    I inherited an old code (written in ccs v5) and have started making changes on that one in ccs v8. In the old code, the variables are stored in infoC and infoD. When I try to store something in infoB using #prama DATA_SECTION in the same way it has been done for other memory sections the data doesn't get stored. So I created a memory block to move some of my data from infoD to that section and then when I tried then I can't write to the infoD. Also something peculiar I noticed is that when write to separate memory section starting at 0xF800, the ADC stops working and the micro-controller needs a reboot.

    I checked the memory map and it is written correctly. I am new to this stuff, is there a possibility that some linker might be used which I have to edit and is there any restriction within the Flash as well on where I can write except infoA.

    Nitish
  • Nitish,

    I just run a quick test on my PC, and no issue was found. Would you please try the code below?

    #include <msp430.h>
    
    #pragma DATA_SECTION(TESTB, ".infoB")
    const unsigned char TESTB[10] = {1,2,3,4,5,6,7,8,9,0};
    
    #pragma DATA_SECTION(TESTC, ".infoC")
    const unsigned char TESTC[10] = {0,1,2,3,4,5,6,7,8,9};
    
    #pragma DATA_SECTION(TESTD, ".infoD")
    const unsigned char TESTD[10] = {9,0,1,2,3,4,5,6,7,8};
    
    void main(void)
    {
      WDTCTL = WDTPW + WDTHOLD;  // disable watchdog
      P1DIR |= TESTB[0];          // set P1.x as output
      P1DIR |= TESTC[1];
      P1DIR |= TESTD[2];
    
      while(1)
      {
          __delay_cycles(100000);
      }
    }
    

    Ling

  • The above code worked but when I try to put the same in my project, it is still not letting me define any variable in infoB.

    Nitish

  • So, I have solved my problem by increasing the size of infoC and reducing the size of infoB. Still i don't know why am I not able to write to infoB and infoC at the same time in the header files.

    Nitish
  • Hi Nitish,

    Good to know you have the workaround.
    The other thing you can try is use IAR.

    Regards,
    Ling

**Attention** This is a public forum