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.

Msp430G2544 DCO generation

Other Parts Discussed in Thread: MSP430G2544

Hi,

Accidentally I have executed mass erase command from bsl, hence i lost DCO calibration.

My device is now running around 10 time faster before executing command.

I've searched for DCO data generation code for msp430g2544 on-line, but found nothing.

Is there any doc on how to do DCO calibration?

Appreciating your time.

Regards,
Akash Gajjar

  • There is an F2xx sample code for DCO calibration. But you will need to have the external 32768 Hz crystal installed and working.
    What kind of target board is your MSP430G2544 on?
  • If you are using a G2 LunchPad, there is provision to use the external 32768 Hz crystal and the crystal is provided by TI. It may still be difficult to solder that on. And it may be even more difficult to get it to work reliably.

    There is an alternative. You could use the "Application UART" (aka "back channel UART") as reference. At 9600, if you use the PC to send the character "U" repeatedly, the duration the "low" periods are 104.17 usec. This is slow enough and accurate enough to be used to calibrate your DCO.

    Using Timer Capturing to determine the DCO calibration is not difficult to do. Any Good Samaritan volunteer?
  • I found this code for your reference.

    Your target hardware must include working 32768 Hz crystal.

    ;*******************************************************************************
    ;   Code for application report - "DCO Library"
    ;*******************************************************************************
    ; THIS PROGRAM IS PROVIDED "AS IS". TI MAKES NO WARRANTIES OR
    ; REPRESENTATIONS, EITHER EXPRESS, IMPLIED OR STATUTORY,
    ; INCLUDING ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
    ; FOR A PARTICULAR PURPOSE, LACK OF VIRUSES, ACCURACY OR
    ; COMPLETENESS OF RESPONSES, RESULTS AND LACK OF NEGLIGENCE.
    ; TI DISCLAIMS ANY WARRANTY OF TITLE, QUIET ENJOYMENT, QUIET
    ; POSSESSION, AND NON-INFRINGEMENT OF ANY THIRD PARTY
    ; INTELLECTUAL PROPERTY RIGHTS WITH REGARD TO THE PROGRAM OR
    ; YOUR USE OF THE PROGRAM.
    ;
    ; IN NO EVENT SHALL TI BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
    ; CONSEQUENTIAL OR INDIRECT DAMAGES, HOWEVER CAUSED, ON ANY
    ; THEORY OF LIABILITY AND WHETHER OR NOT TI HAS BEEN ADVISED
    ; OF THE POSSIBILITY OF SUCH DAMAGES, ARISING IN ANY WAY OUT
    ; OF THIS AGREEMENT, THE PROGRAM, OR YOUR USE OF THE PROGRAM.
    ; EXCLUDED DAMAGES INCLUDE, BUT ARE NOT LIMITED TO, COST OF
    ; REMOVAL OR REINSTALLATION, COMPUTER TIME, LABOR COSTS, LOSS
    ; OF GOODWILL, LOSS OF PROFITS, LOSS OF SAVINGS, OR LOSS OF
    ; USE OR INTERRUPTION OF BUSINESS. IN NO EVENT WILL TI'S
    ; AGGREGATE LIABILITY UNDER THIS AGREEMENT OR ARISING OUT OF
    ; YOUR USE OF THE PROGRAM EXCEED FIVE HUNDRED DOLLARS
    ; (U.S.$500).
    ;
    ; Unless otherwise stated, the Program written and copyrighted
    ; by Texas Instruments is distributed as "freeware".  You may,
    ; only under TI's copyright in the Program, use and modify the
    ; Program without any charge or restriction.  You may
    ; distribute to third parties, provided that you transfer a
    ; copy of this license to the third party and the third party
    ; agrees to these terms by its first use of the Program. You
    ; must reproduce the copyright notice and any other legend of
    ; ownership on each copy or partial copy, of the Program.
    ;
    ; You acknowledge and agree that the Program contains
    ; copyrighted material, trade secrets and other TI proprietary
    ; information and is protected by copyright laws,
    ; international copyright treaties, and trade secret laws, as
    ; well as other intellectual property laws.  To protect TI's
    ; rights in the Program, you agree not to decompile, reverse
    ; engineer, disassemble or otherwise translate any object code
    ; versions of the Program to a human-readable form.  You agree
    ; that in no event will you alter, remove or destroy any
    ; copyright notice included in the Program.  TI reserves all
    ; rights not specifically granted under this license. Except
    ; as specifically provided herein, nothing in this agreement
    ; shall be construed as conferring by implication, estoppel,
    ; or otherwise, upon you, any license or other right under any
    ; TI patents, copyrights or trade secrets.
    ;
    ; You may not use the Program in non-TI devices.
    ;
    ;*******************************************************************************
    ;   DCO Library
    ;
    ;   Description; Allows the DCO to be calibrated to a multiple of ACLK
    ;
    ;
    ;   Memory Usage:               <184 bytes
    ;
    ;   L. Westlund
    ;   Version    1.0
    ;   Texas Instruments, Inc
    ;   October 2006
    ;   Built with IAR Embedded Workbench Version: 3.40A
    ;*******************************************************************************
    #include <msp430x11x1.h>
    
                MODULE  DCO_Library
                ;Functions
                PUBLIC  TI_SetDCO
                RSEG    CODE                    ; Code is relocatable
                EVEN
    
    #ifndef TACCTL2_                            ; For Timer_A2 devices
      #define TACCTL2 TACCTL0
      #define TACCR2 TACCR0
    #endif
    
    ;-------------------------------------------------------------------------------
    TI_SetDCO;     Subroutine: Sets DCO to selected frequency based on Delta.
    ;           R14 and R15 are used, ACLK = 32768/8 Timer_A clocked by DCOCLK
    ;           R13 used to hold old BCSCTL1 value
    ;           R12 is the parameter specifying the delta value, MCLK = delta * 4096
    ;           returns in R12:
    ;           0 - DCO Set Correctly
    ;           1 - DCO running at slowest setting
    ;           2 - DCO running at fastest setting
    ;           0xff - Timeout Occured while setting DCO
    ;-------------------------------------------------------------------------------
                push.w  r11                     ; save loop counter
                push.w  r10
                push.w  &TACTL
                push.w  &TACCTL2
                mov.w   #10000, r11             ; max number of times to loop
                clr.w   r15                     ;		
                mov.b   &BCSCTL1, r13           ; Copy BC settings to preserve
                #ifndef __MSP430_HAS_BC2__
                and.w   #0xF8,    r13           ; Mask out bits which will change (0-2) 1xx
                #else
                and.w   #0xF0,    r13           ; Mask out bits which will change (0-3) 2xx
                #endif
    SetupBC     bis.b   #XT2OFF+DIVA_3,&BCSCTL1 ; ACLK=LFXT1CLK/8, XT2OFF to make a known state			
    SetupCC2    mov.w   #CM_1+CCIS_1+CAP,&TACCTL2 ; CAP, ACLK
                mov.w   #TASSEL_2+MC_2+TACLR, &TACTL; SMCLK, cont-mode, clear
    firstTest   bit.w   #CCIFG,&TACCTL2         ; Test capture flag, skip first short ACLK to avoid error
                jz      firstTest               ;
                bic.w   #CCIFG,&TACCTL2         ; Clear capture flag
    TestDCO     dec.w   r11
                jz      ExitTimeOutError        ;
    TestDCO2    bit.w   #CCIFG,&TACCTL2         ; Test capture flag
                jz      TestDCO2                ;
                bic.w   #CCIFG,&TACCTL2         ; Clear capture flag
                                                ;
    AdjDCO      mov.w   &TACCR2,r14             ; R14 = captured SMCLK
                sub.w   r15,r14                 ; R14 = capture difference
                mov.w   &TACCR2,r15             ; R15 = captured SMCLK
                mov.w   r14, r10                ; r10 = capture difference
                sub.w   r12, r10                ; r10 = difference between desired and actual
                jz      ExitNoError             ; if r12 = r10, DCO set exactly
                cmp.w   #0xFFFF, r10            ; DCO can be off by 1 for a tolerance
                jeq     ExitNoError
                cmp.w   r12,   r14              ; Delta = SMCLK/(32768/8)
                jlo     IncDCO                  ;
    DecDCO      dec.b   &DCOCTL                 ; Slow DCO with DCO and MOD
                jc      TestDCO                 ; Slower?
                #ifndef __MSP430_HAS_BC2__
                bit.b   #0x7, &BCSCTL1          ; Can RSEL.x be decremented? 1xx
                #else
                bit.b   #0xF, &BCSCTL1          ; Can RSEL.x be decremented? 2xx
                #endif
                jz      ExitSlowestSetting      ; jmp>DCO at slowest setting
                dec.b   &BCSCTL1                ; Decrement RSEL.x
                jmp     TestDCO                 ;
    IncDCO
                #ifndef __MSP430_HAS_BC2__
                inc.b   &DCOCTL                 ; Speed DCO with DCO and MOD
                jnc     TestDCO                 ; Faster?
                cmp.b   #XT2OFF+DIVA_3+0x7, &BCSCTL1 ; Can RSEL.x be increased? 1xx
                jeq     ExitFastestSetting      ; jmp> DCO at fastest setting
                inc.b   &BCSCTL1                ; Increment RSEL.x
                jmp     TestDCO                 ;
                #else
                inc.b   &DCOCTL                 ; Speed DCO with DCO and MOD
                jnc     TestFor16MHz
                cmp.b   #XT2OFF+DIVA_3+0xF, &BCSCTL1 ; Can RSEL.x be increased? 2xx
                jeq     ExitFastestSetting      ; jmp> DCO at fastest setting
                inc.b   &BCSCTL1                ; Increment RSEL.x
                jmp     TestDCO                 ;
                ;-------Compare to built in values
    TestFor16MHz
                cmp.b   &CALDCO_16MHZ, &DCOCTL  ; compare current DCO to built in DCO constants
                jne     TestDCO                 ; if they are not equal, leave
                mov.b   &CALBC1_16MHZ, r14      ; move cal values into R14 for manipulation
                bis.b   #XT2OFF+DIVA_3, r14     ; make sure BCSCTL1 cal has same state
                cmp.b   r14, &BCSCTL1           ; if they are the same
                jeq     ExitFastestSetting2xx   ; leave all values in place and exit
                jmp     TestDCO
                ;-------Compare to built in values
                #endif
    ExitSlowestSetting
                clr.b   &DCOCTL
                mov.w   #0x01, r12
                jmp     SetDCO_Exit
    ExitFastestSetting
                mov.b   #0xFF, &DCOCTL          ; since the DCO previously rolled over
    ExitFastestSetting2xx
                mov.w   #0x02, r12
                jmp     SetDCO_Exit
    ExitTimeOutError
                mov.w   #0xff, r12
                jmp     SetDCO_Exit
    ExitNoError clr.w   r12
    SetDCO_Exit clr.w   &TACCTL2                ; Stop CCR2
                #ifndef __MSP430_HAS_BC2__
                bic.b   #0xF8,    &BCSCTL1      ; Mask out bits which will change (0-2) 1xx
                #else
                bic.b   #0xF0,    &BCSCTL1      ; Mask out bits which will change (0-3) 2xx
                #endif
                bis.b   r13, &BCSCTL1           ; copy in old non-DCO BC settings
                pop.w   &TACTL
                pop.w   &TACCTL2
                pop.w   r10
                pop.w   r11
                ret                             ; Return from subroutine
                                                ;
                END

**Attention** This is a public forum