Table of Contents

Testing the MSP430 Crystal

The launchpad comes with a 32.768KHz crystal, which is awesome. The launchpad doesn't come with this crystal soldered to the board, though, which is slightly less awesome. If you're interested in any projects that require precise timing (serial, a clock, whatever) you're going to want a crystal. If you want to work on the launchpad directly, using the included crystal is a good idea because 1) it's free and already included, 2) it's not hard to install. There are guides all over the internet/youtube on how to solder the crystal. I've done it twice myself, and this is what I have to say on the matter: take your time, don't use a soldering iron that's too hot, use as little solder as possible, and tape the thing in place so it doesn't get away from you.

Once you've got it installed, you are going to want to test it so you can confirm that it works correctly before you jump into some crazy projects. Here's some code we've found that lets you do just that.

CCS Version

This is from TI's demo code examples. It blinks the LED on the launchpad, or toggles P1.0 if you have your MSP on another board. We've tested this code on both MSP430G2231s and 2553s.

main.c
//******************************************************************************
// MSP430F20xx Demo - LFXT1 Oscillator Fault Detection
//
// Description: System runs normally in LPM3 with WDT timer clocked by
// 32kHz ACLK with a 1x4 second interrupt. P1.0 is normally pulsed every
// second inside WDT interrupt. If an LFXT1 oscillator fault occurs,
// NMI is requested forcing exit from LPM3. P1.0 is toggled rapidly by software
// as long as LFXT1 oscillator fault is present. Assumed only LFXT1 as NMI
// source - code does not check for other NMI sources.
// ACLK = LFXT1 = 32768, MCLK = SMCLK = Default DCO
//
// //*External watch crystal on XIN XOUT is required for ACLK*//
//
// M. Buccini / L. Westlund
// Texas Instruments Inc.
// September 2005
// Built with CCE Version: 3.2.0 and IAR Embedded Workbench Version: 3.40A
//******************************************************************************
#include <msp430x20x3.h>
volatile unsigned int i;
void main(void)
    {
        WDTCTL = WDT_ADLY_1000; // WDT 1s interval timer
        IE1 |= WDTIE; // Enable WDT interrupt
        P1DIR = 0xFF; // All P1.x outputs
        P1OUT = 0; // All P1.x reset
        P2DIR = 0xFF; // All P2.x outputs
        P2OUT = 0; // All P2.x reset
        BCSCTL3 = XCAP_3; //12.5pF cap- setting for 32768Hz crystal
        // An immedate Osc Fault will occur next
        IE1 |= OFIE; // Enable Osc Fault
    while(1)
        {
            P1OUT ^= 0x01; // Toggle P1.0 using exclusive-OR
            _BIS_SR(LPM3_bits + GIE); // Enter LPM3 w/interrupt
        }
    }
    #pragma vector=WDT_VECTOR
        __interrupt void watchdog_timer (void)
    {
        _BIC_SR_IRQ(LPM3_bits); // Clear LPM3 bits from 0(SR)
    }
    #pragma vector=NMI_VECTOR
    __interrupt void nmi_ (void)
    {
    do
    {
        IFG1 &= ~OFIFG; // Clear OSCFault flag
        for (i = 0xFFF; i > 0; i--); // Time for flag to set
        P1OUT ^= 0x01; // Toggle P1.0 using exclusive-OR
    }
    while (IFG1 & OFIFG); // OSCFault flag still set?
    IE1 |= OFIE; // Enable Osc Fault
}

MSPGCC Version

This is the same as the above code, except it builds in MSPGCC. NOTE: I have not gotten this code to work! I'm just putting it here for reference, also as a reminder to fix it - though I am not familiar with mspgcc, so if someone else can figure it out, contact me.

main.c
//******************************************************************************
// MSP430F20xx Demo - LFXT1 Oscillator Fault Detection
//
// Description: System runs normally in LPM3 with WDT timer clocked by
// 32kHz ACLK with a 1x4 second interrupt. P1.0 is normally pulsed every
// second inside WDT interrupt. If an LFXT1 oscillator fault occurs,
// NMI is requested forcing exit from LPM3. P1.0 is toggled rapidly by software
// as long as LFXT1 oscillator fault is present. Assumed only LFXT1 as NMI
// source - code does not check for other NMI sources.
// ACLK = LFXT1 = 32768, MCLK = SMCLK = Default DCO
//
// //*External watch crystal on XIN XOUT is required for ACLK*//
//
// M. Buccini / L. Westlund
// Texas Instruments Inc.
// September 2005
// Built with CCE Version: 3.2.0 and IAR Embedded Workbench Version: 3.40A
// modified by justin solarski to work with MSPGCC 4.0
//******************************************************************************
#include <msp430.h>
#include <signal.h> // must be included for interrupt handler
volatile unsigned int i;
void main(void)
{
WDTCTL = WDT_ADLY_1000; // WDT 1s interval timer
IE1 |= WDTIE; // Enable WDT interrupt
P1DIR = 0xFF; // All P1.x outputs
P1OUT = 0; // All P1.x reset
P2DIR = 0xFF; // All P2.x outputs
P2OUT = 0; // All P2.x reset
BCSCTL3 = XCAP_3; //12.5pF cap- setting for 32768Hz crystal
// An immedate Osc Fault will occur next
IE1 |= OFIE; // Enable Osc Fault
_enable_interrupt(); // enable interrupts added for mspgcc
while(1)
{
P1OUT ^= 0x01; // Toggle P1.0 using exclusive-OR
_BIS_SR(LPM3_bits + GIE); // Enter LPM3 w/interrupt
}
}
//#pragma vector=WDT_VECTOR removed for mspgcc
interrupt(WDT_VECTOR) watchdog_timer (void) //__interrupt void watchdog_timer (void) removed for mspgcc
{
_BIC_SR_IRQ(LPM3_bits); // Clear LPM3 bits from 0(SR)
}
//#pragma vector=NMI_VECTOR removed for mspgcc
interrupt(NMI_VECTOR) nmi_ (void) //__interrupt void nmi_ (void) removed for mspgcc
{
do
{
IFG1 &= ~OFIFG; // Clear OSCFault flag
for (i = 0xFFF; i > 0; i--); // Time for flag to set
P1OUT ^= 0x01; // Toggle P1.0 using exclusive-OR
}
while (IFG1 & OFIFG); // OSCFault flag still set?
IE1 |= OFIE; // Enable Osc Fault
}

And here's a makefile you can use with the above code. Remember to change the mmcu flag to reflect the MCU you're using.

makefile
CC=msp430-gcc
CFLAGS=-Os -Wall -g -mmcu=msp430g2553
OBJS=main.o
 
 
all: $(OBJS)
	$(CC) $(CFLAGS) -o main.elf $(OBJS)
 
%.o: %.c
	$(CC) $(CFLAGS) -c $<
 
clean:
	rm -fr main.elf $(OBJS)