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/MSP430FR2033: Cannot write to FRAM variable placed with #pragma DATA_SECTION to custom FRAM memory section

Part Number: MSP430FR2033

Tool/software: Code Composer Studio

I'm having trouble writing to a variable placed within a custom section of FRAM. I can read the value (0xFF) at each location, but cannot seem to update the value. It seems like there may be some sort of write protection happening that I am unaware of? I believe the MSP430FR2033 does not have an MPU, so I'm guessing that's not the problem.

In the simple test program below I can inspect the memory location of TestBuffer (located at 0xC400) and the values do not change. I can also see that read_test can read the initial value of TestBuffer[1] which is 0xFF, but the second read still returns 0xFF despite updating the value of TestBuffer[1] = 0x11.

I've also included the custom .cmd linker for reference. Any help would be appreciated.

main.c

#include <msp430.h> 

#pragma DATA_SECTION(TestBuffer, ".log_buffer")
volatile unsigned char TestBuffer[10];

int main(void)
{
    volatile unsigned char read_test = 0;

    WDTCTL = WDTPW | WDTHOLD;	// stop watchdog timer

    read_test = TestBuffer[1];
    TestBuffer[1] = 0x11;
    read_test = TestBuffer[1];
    TestBuffer[0] = 0x22;

	return 0;
}

lnk_msp430fr2033.cmd:

MEMORY
{
    SFR                     : origin = 0x0000, length = 0x0010
    PERIPHERALS_8BIT        : origin = 0x0010, length = 0x00F0
    PERIPHERALS_16BIT       : origin = 0x0100, length = 0x0100
    RAM                     : origin = 0x2000, length = 0x0800
    INFOA                   : origin = 0x1800, length = 0x0200
    LOG_BUFFER				: origin = 0xC400, length = 0x0400
    FRAM                    : origin = 0xC800, length = 0x3780
    JTAGSIGNATURE           : origin = 0xFF80, length = 0x0004, fill = 0xFFFF
    BSLSIGNATURE            : origin = 0xFF84, length = 0x0004, fill = 0xFFFF
    INT00                   : origin = 0xFF88, length = 0x0002
    INT01                   : origin = 0xFF8A, length = 0x0002
    INT02                   : origin = 0xFF8C, length = 0x0002
    INT03                   : origin = 0xFF8E, length = 0x0002
    INT04                   : origin = 0xFF90, length = 0x0002
    INT05                   : origin = 0xFF92, length = 0x0002
    INT06                   : origin = 0xFF94, length = 0x0002
    INT07                   : origin = 0xFF96, length = 0x0002
    INT08                   : origin = 0xFF98, length = 0x0002
    INT09                   : origin = 0xFF9A, length = 0x0002
    INT10                   : origin = 0xFF9C, length = 0x0002
    INT11                   : origin = 0xFF9E, length = 0x0002
    INT12                   : origin = 0xFFA0, length = 0x0002
    INT13                   : origin = 0xFFA2, length = 0x0002
    INT14                   : origin = 0xFFA4, length = 0x0002
    INT15                   : origin = 0xFFA6, length = 0x0002
    INT16                   : origin = 0xFFA8, length = 0x0002
    INT17                   : origin = 0xFFAA, length = 0x0002
    INT18                   : origin = 0xFFAC, length = 0x0002
    INT19                   : origin = 0xFFAE, length = 0x0002
    INT20                   : origin = 0xFFB0, length = 0x0002
    INT21                   : origin = 0xFFB2, length = 0x0002
    INT22                   : origin = 0xFFB4, length = 0x0002
    INT23                   : origin = 0xFFB6, length = 0x0002
    INT24                   : origin = 0xFFB8, length = 0x0002
    INT25                   : origin = 0xFFBA, length = 0x0002
    INT26                   : origin = 0xFFBC, length = 0x0002
    INT27                   : origin = 0xFFBE, length = 0x0002
    INT28                   : origin = 0xFFC0, length = 0x0002
    INT29                   : origin = 0xFFC2, length = 0x0002
    INT30                   : origin = 0xFFC4, length = 0x0002
    INT31                   : origin = 0xFFC6, length = 0x0002
    INT32                   : origin = 0xFFC8, length = 0x0002
    INT33                   : origin = 0xFFCA, length = 0x0002
    INT34                   : origin = 0xFFCC, length = 0x0002
    INT35                   : origin = 0xFFCE, length = 0x0002
    INT36                   : origin = 0xFFD0, length = 0x0002
    INT37                   : origin = 0xFFD2, length = 0x0002
    INT38                   : origin = 0xFFD4, length = 0x0002
    INT39                   : origin = 0xFFD6, length = 0x0002
    INT40                   : origin = 0xFFD8, length = 0x0002
    INT41                   : origin = 0xFFDA, length = 0x0002
    INT42                   : origin = 0xFFDC, length = 0x0002
    INT43                   : origin = 0xFFDE, length = 0x0002
    INT44                   : origin = 0xFFE0, length = 0x0002
    INT45                   : origin = 0xFFE2, length = 0x0002
    INT46                   : origin = 0xFFE4, length = 0x0002
    INT47                   : origin = 0xFFE6, length = 0x0002
    INT48                   : origin = 0xFFE8, length = 0x0002
    INT49                   : origin = 0xFFEA, length = 0x0002
    INT50                   : origin = 0xFFEC, length = 0x0002
    INT51                   : origin = 0xFFEE, length = 0x0002
    INT52                   : origin = 0xFFF0, length = 0x0002
    INT53                   : origin = 0xFFF2, length = 0x0002
    INT54                   : origin = 0xFFF4, length = 0x0002
    INT55                   : origin = 0xFFF6, length = 0x0002
    INT56                   : origin = 0xFFF8, length = 0x0002
    INT57                   : origin = 0xFFFA, length = 0x0002
    INT58                   : origin = 0xFFFC, length = 0x0002
    RESET                   : origin = 0xFFFE, length = 0x0002
}

/****************************************************************************/
/* Specify the sections allocation into memory                              */
/****************************************************************************/

SECTIONS
{
    GROUP(ALL_FRAM)
    {
       GROUP(READ_WRITE_MEMORY)
       {
          .TI.persistent : {}                /* For #pragma persistent            */
       }

       GROUP(READ_ONLY_MEMORY)
       {
          .cinit      : {}                   /* Initialization tables             */
          .pinit      : {}                   /* C++ constructor tables            */
          .binit      : {}                   /* Boot-time Initialization tables   */
          .init_array : {}                   /* C++ constructor tables            */
          .mspabi.exidx : {}                 /* C++ constructor tables            */
          .mspabi.extab : {}                 /* C++ constructor tables            */
          .const      : {}                   /* Constant data                     */
       }

       GROUP(EXECUTABLE_MEMORY)
       {
          .text       : {}                   /* Code                              */
       }
    } > FRAM

#ifdef __TI_COMPILER_VERSION__
  #if __TI_COMPILER_VERSION__ >= 15009000
    #ifndef __LARGE_DATA_MODEL__
    .TI.ramfunc : {} load=FRAM, run=RAM, table(BINIT)
    #else
    .TI.ramfunc : {} load=FRAM | FRAM2, run=RAM, table(BINIT)
    #endif
  #endif
#endif

    .jtagsignature : {} > JTAGSIGNATURE   /* JTAG Signature                    */
    .bslsignature  : {} > BSLSIGNATURE    /* BSL Signature                     */

    .bss        : {} > RAM                /* Global & static vars              */
    .data       : {} > RAM                /* Global & static vars              */
    .TI.noinit  : {} > RAM                /* For #pragma noinit                */
    .cio        : {} > RAM                /* C I/O buffer                      */
    .sysmem     : {} > RAM                /* Dynamic memory allocation area    */
    .stack      : {} > RAM (HIGH)         /* Software system stack             */

    .infoA (NOLOAD) : {} > INFOA              /* MSP430 INFO FRAM  Memory segments */

    .log_buffer : {} > LOG_BUFFER

    /* MSP430 Interrupt vectors          */
    .int00       : {}               > INT00
    .int01       : {}               > INT01
    .int02       : {}               > INT02
    .int03       : {}               > INT03
    .int04       : {}               > INT04
    .int05       : {}               > INT05
    .int06       : {}               > INT06
    .int07       : {}               > INT07
    .int08       : {}               > INT08
    .int09       : {}               > INT09
    .int10       : {}               > INT10
    .int11       : {}               > INT11
    .int12       : {}               > INT12
    .int13       : {}               > INT13
    .int14       : {}               > INT14
    .int15       : {}               > INT15
    .int16       : {}               > INT16
    .int17       : {}               > INT17
    .int18       : {}               > INT18
    .int19       : {}               > INT19
    .int20       : {}               > INT20
    .int21       : {}               > INT21
    .int22       : {}               > INT22
    .int23       : {}               > INT23
    .int24       : {}               > INT24
    .int25       : {}               > INT25
    .int26       : {}               > INT26
    .int27       : {}               > INT27
    .int28       : {}               > INT28
    .int29       : {}               > INT29
    .int30       : {}               > INT30
    .int31       : {}               > INT31
    .int32       : {}               > INT32
    .int33       : {}               > INT33
    .int34       : {}               > INT34
    .int35       : {}               > INT35
    .int36       : {}               > INT36
    .int37       : {}               > INT37
    .int38       : {}               > INT38
    .int39       : {}               > INT39
    .int40       : {}               > INT40
    .int41       : {}               > INT41
    .int42       : {}               > INT42
    .int43       : {}               > INT43
    .int44       : {}               > INT44
    .int45       : {}               > INT45
    PORT2        : { * ( .int46 ) } > INT46 type = VECT_INIT
    PORT1        : { * ( .int47 ) } > INT47 type = VECT_INIT
    ADC          : { * ( .int48 ) } > INT48 type = VECT_INIT
    USCI_B0      : { * ( .int49 ) } > INT49 type = VECT_INIT
    USCI_A0      : { * ( .int50 ) } > INT50 type = VECT_INIT
    WDT          : { * ( .int51 ) } > INT51 type = VECT_INIT
    RTC          : { * ( .int52 ) } > INT52 type = VECT_INIT
    TIMER1_A1    : { * ( .int53 ) } > INT53 type = VECT_INIT
    TIMER1_A0    : { * ( .int54 ) } > INT54 type = VECT_INIT
    TIMER0_A1    : { * ( .int55 ) } > INT55 type = VECT_INIT
    TIMER0_A0    : { * ( .int56 ) } > INT56 type = VECT_INIT
    UNMI         : { * ( .int57 ) } > INT57 type = VECT_INIT
    SYSNMI       : { * ( .int58 ) } > INT58 type = VECT_INIT
    .reset       : {}               > RESET  /* MSP430 Reset vector         */
}

/****************************************************************************/
/* Include peripherals memory map                                           */
/****************************************************************************/

-l msp430fr2033.cmd

**Attention** This is a public forum