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)