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.

MSP430F5438A RTC Errata Workaround generates CCS V5.5 Warnings

Other Parts Discussed in Thread: MSP430F5438A

Hi,

I'm currently using the Real Time Clock on the MSP430F5438A and am having a few problems since updating to the V5.5 version of CCS.  Unfortunately, this processor has some errata relating to the RTC which requires assembly functions (supplied by TI, pasted in below) to be used when reading from and writing to the RTC. I have attached the rtcASM.s43 which contains these functions.

With the latest version of CCS I am now getting some compiler warnings, which I cant remove, relating to the above module.  Specifically:

Description Resource Path Location Type
[W0005] NOP required after set or rtcASM.s43 /transientMinderV3.0/src line 111 C/C++ Problem
[W0005] NOP required after set or rtcASM.s43 /transientMinderV3.0/src line 73 C/C++ Problem
[W0005] NOP required after set or rtcASM.s43 /transientMinderV3.0/src line 46 C/C++ Problem
[W0005] NOP required after set or rtcASM.s43 /transientMinderV3.0/src line 135 C/C++ Problem
[W0005] NOP required after set or rtcASM.s43 /transientMinderV3.0/src line 161 C/C++ Problem
[W0005] NOP required after set or rtcASM.s43 /transientMinderV3.0/src line 185 C/C++ Problem
[W0005] NOP required after set or rtcASM.s43 /transientMinderV3.0/src line 211 C/C++ Problem

With the exception of these warnings, my project compiles cleanly. As I don't have a detailed understanding of the exact errata issue being resolved by the assembly functions I do not feel confident editing it.  I have tried disabling the warnings in the compiler but can't find the correct place to do so (tried --diag_suppress).

Any advice on either suppressing the warning or modifying the code would be gratefully received.

Many thanks

Ben Smither

;******************************************************************************
;  MSP430FG5438 - Real Time Clock Workaround
;
;  Description: This program demonstrates the RTC Workaround for the RTC
;  Errata deailed in the XMS '5438 Errata under RTC3
;  Assembly functions for the RTC workaround
;  Allows safe access to the RTC registers that potentially have a write issue
;  Code is aligned so that the lower 5 bits of the address of the instruction
;  fetch following the RTC register write are equal
;  Do not change the code in the ASM file (.s43) all nops in there are needed.
;
;  Texas Instruments Inc.
;  October 2008
;  Built with CCE version 3.2.2
;
;*******************************************************************************
; !!!!!! Do not change the code. Every nop has a function !!!!!!
;*******************************************************************************

            .cdecls C,LIST,"msp430f5438Syrinix.h"   ; Include device header file

;-------------------------------------------------------------------------------
            .text                           ; Progam Start
;-------------------------------------------------------------------------------
            .align  32
;-------------------------------------------------------------------------------
            .global SetRTCYEAR
; int SetRTCYEAR(int year)
; year will be set in the RTCYEAR register
; return value is read back from the RTCYEAR register
; Works only in calendar mode (RTCMODE = 1)
; argument year is in R12
; return value is in R12
SetRTCYEAR: nop
            nop
            nop
            nop
            dint
            nop
            nop
            nop
            mov.w   R12,&RTCYEAR            ; Set RTCYEAR to year 		
            nop
            nop
            mov.w   &RTCYEAR,R12            ; Return value
            eint
            .if     $isdefed("__LARGE_CODE_MODEL__") = 0
            ret
            .else
            reta
            .endif
            
            
;-------------------------------------------------------------------------------
			.global	SetRTCMON
; int SetRTCMON(int month)
; month will be set in the RTCMON register
; Workaround requires to write 16 bits into RTCDATE
; return value is read back from the RTCMON register
; argument month is in R12
; return value is in R12
SetRTCMON:  push.w  R5                      ; push R5
            mov.b   &RTCDAY,R5              ; read RTCDAY into R5
            swpb    R12                     ; R12 holds month - swap lower and upper byte
            bis.w   R12,R5                  ; combine read RTCDAY and new RTCMON
            dint
            nop
            mov.w   R5,&RTCDATE             ; write to RTCDATE		
            nop
            nop
            nop
            nop
            eint
            mov.b   &RTCMON,R12             ; Read RTCMON register
            pop.w   R5                      ; pop R5
            .if     $isdefed("__LARGE_CODE_MODEL__") = 0
            ret
            .else
            reta
            .endif
;-------------------------------------------------------------------------------
			.global	SetRTCDAY
; int SetRTCDAY(int day)
; day will be set in the RTCDAY register
; Workaround requires to write 16 bits into RTCDATE
; return value is read back from the RTCDAY register
; argument day is in R12
; return value is in R12
            nop
            nop
            nop
            nop
            nop
            nop
            nop
            nop
            nop
            nop
            nop
            nop
SetRTCDAY:                                  ; R12 holds day in lower byte
            push.w  R5                      ; push R5
            mov.b   &RTCMON,R5              ; read RTCMON into lower byte of R5
            swpb    R5                      ; month is now in higher byte of R5
            bic.w   #00FFh,R5               ; clear lower byte of R5
            bis.w   R12,R5                  ; combine read RTCDAY and new RTCMON
            dint
            nop
            mov.w   R5,&RTCDATE             ; write to RTCDATE		
            nop
            eint
            mov.b   &RTCDAY,R12             ; Read RTCDAY register
            pop.w   R5                      ; pop R5
            .if     $isdefed("__LARGE_CODE_MODEL__") = 0
            ret
            .else
            reta
            .endif
;-------------------------------------------------------------------------------
            .global	SetRTCDOW
; int SetRTCDOW(int dow)
; dow will be set in the RTCDOW register
; Workaround requires to write 16 bits into RTCTIM1
; return value is read back from the RTCDOW register
; argument dow is in R12
; return value is in R12
SetRTCDOW:  push.w  R5                      ; push R5
            mov.b   &RTCHOUR,R5             ; read RTCHOUR into R5
            swpb    R12                     ; R12 holds dow - swap lower and upper byte
            bis.w   R12, R5                 ; combine read RTCHOUR and new RTCDOW
            dint
            nop
            mov.w   R5,&RTCTIM1             ; write to RTCTIM1		
            nop
            eint
            mov.b   &RTCDOW,R12             ; Read RTCDOW register
            pop.w   R5                      ; pop R5
            .if     $isdefed("__LARGE_CODE_MODEL__") = 0
            ret
            .else
            reta
            .endif
;-------------------------------------------------------------------------------
            .global	SetRTCHOUR
; int SetRTCHOUR(int hour)
; hour will be set in the RTCHOUR register
; Workaround requires to write 16 bits into RTCTIM1
; return value is read back from the RTCHOUR register
; argument hour is in R12
; return value is in R12
SetRTCHOUR:                                 ; R12 holds day in lower byte
            push.w  R5                      ; push R5
            mov.b   &RTCDOW,R5              ; read RTCDOW into lower byte of R5
            swpb    R5                      ; dow is now in higher byte of R5
            bis.w   R12,R5                  ; combine read RTCDOW and new RTCHOUR
            dint
            nop
            nop
            mov.w   R5,&RTCTIM1             ; write to RTCTIM1		
            nop
            eint
            mov.b   &RTCHOUR,R12            ; Read RTCHOUR register
            pop.w   R5                      ; pop R5
            .if     $isdefed("__LARGE_CODE_MODEL__") = 0
            ret
            .else
            reta
            .endif
;-------------------------------------------------------------------------------
            .global	SetRTCMIN
; int SetRTCMIN(int min)
; min will be set in the RTCMIN register
; Workaround requires to write 16 bits into RTCTIM0
; return value is read back from the RTCDOW register
; argument min is in R12
; return value is in R12
SetRTCMIN:  push.w  R5                      ; push R5
            mov.b   &RTCSEC, R5             ; read RTCSEC into R5
            swpb    R12                     ; R12 holds min - swap lower and upper byte
            bis.w   R12,R5                  ; combine read RTCMIN and new RTCSEC
            dint
            nop
            mov.w   R5,&RTCTIM0             ; write to RTCTIM0
            nop
            eint
            mov.b   &RTCMIN,R12             ; Read RTCDOW register
            pop.w   R5                      ; pop R5
            .if     $isdefed("__LARGE_CODE_MODEL__") = 0
            ret
            .else
            reta
            .endif
;-------------------------------------------------------------------------------
            .global	SetRTCSEC
; int SetRTCSEC(int sec)
; sec will be set in the RTCSEC register
; Workaround requires to write 16 bits into RTCTIM0
; return value is read back from the RTCSEC register
; argument sec is in R12
; return value is in R12
SetRTCSEC:                                  ; R12 holds day in lower byte
            push.w  R5                      ; push R5
            mov.b   &RTCMIN, R5             ; read RTCMIN into lower byte of R5
            swpb    R5                      ; min is now in higher byte of R5
            bis.w   R12, R5                 ; combine read RTCMIN and new RTCSEC
            dint
            nop
            nop
            mov.w   R5,&RTCTIM0             ; write to RTCTIM0		
            nop
            eint
            mov.b   &RTCSEC, R12            ; Read RTCSEC register
            pop.w   R5                      ; pop R5
            .if     $isdefed("__LARGE_CODE_MODEL__") = 0
            ret
            .else
            reta
            .endif
;-------------------------------------------------------------------------------	

            .global GetRTCTIM0
; Read the RTC registers RTCTIM0
; return the values 
GetRTCTIM0:
            mov.w   &RTCTIM0,R12
            .if     $isdefed("__LARGE_CODE_MODEL__") = 0
            ret
            .else
            reta
            .endif

            .global GetRTCTIM1
; Read the RTC register RTCTIM1
; return the values 
GetRTCTIM1:
            mov.w   &RTCTIM1,R12
            .if     $isdefed("__LARGE_CODE_MODEL__") = 0
            ret
            .else
            reta
            .endif

            .global GetRTCDATE
; Read the RTC register RTCDATE
; return the values 
GetRTCDATE:
            mov.w   &RTCDATE,R12
            .if     $isdefed("__LARGE_CODE_MODEL__") = 0
            ret
            .else
            reta
            .endif

            .global GetRTCYEAR
; Read the RTC registers RTCYEAR
; return the values 
GetRTCYEAR:
            mov.w   &RTCYEAR, R12
            .if     $isdefed("__LARGE_CODE_MODEL__") = 0
            ret
            .else
            reta
            .endif

            .global GetRTCMON
; Read the RTC register RTCMON
; return the values 
GetRTCMON:
            mov.b   &RTCMON, R12
            .if     $isdefed("__LARGE_CODE_MODEL__") = 0
            ret
            .else
            reta
            .endif

            .global GetRTCDOW
; Read the RTC register RTCDOW
; return the values 
GetRTCDOW:
            mov.b   &RTCDOW, R12
            .if     $isdefed("__LARGE_CODE_MODEL__") = 0
            ret
            .else
            reta
            .endif

            .global GetRTCDAY
; Read the RTC register RTCDOW
; return the values 
GetRTCDAY:
            mov.b   &RTCDAY, R12
            .if     $isdefed("__LARGE_CODE_MODEL__") = 0
            ret
            .else
            reta
            .endif

            .global GetRTCHOUR
; Read the RTC register RTCDOW
; return the values 
GetRTCHOUR:
            mov.b   &RTCHOUR, R12
            .if     $isdefed("__LARGE_CODE_MODEL__") = 0
            ret
            .else
            reta
            .endif

            .global GetRTCMIN
; Read the RTC register RTCDOW
; return the values 
GetRTCMIN:
            mov.b   &RTCMIN, R12
            .if     $isdefed("__LARGE_CODE_MODEL__") = 0
            ret
            .else
            reta
            .endif

            .global GetRTCSEC
; Read the RTC register RTCDOW
; return the values 
GetRTCSEC:
            mov.b   &RTCSEC, R12
            .if     $isdefed("__LARGE_CODE_MODEL__") = 0
            ret
            .else
            reta
            .endif
  • Did you get anywhere with this issue?

  • It is correct, that after a DINT, a NOP (or at least a non-critical operation) should be placed, as the next instruction after the DINT can still be interrupted (pipelining problem). But on an EINT, this is not required. It won’t hurt if a pending interrupt will be executed after the instruction following the EINT – unless for some reason the code expects any pending interrupt already handled right after the EINT.

    However, the warning reports a C/C++ problem – and this is assembly code. Also, the warning seems to be crippled (there seems something missing between “or” and “rtcASM.s43”)

    Of course you can add the NOP to keep the assembler quiet.

**Attention** This is a public forum