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.
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