#include #include void setup(void) { // P1.0 (red LED) is output P1DIR |= 1; // Set DCO to 16 MHz BCSCTL1 = CALBC1_16MHZ; DCOCTL = CALDCO_16MHZ; // Clock output to pin P1.4 (for debugging) P1DIR |= 16; P1SEL = 16; // Alternate function (SMCLK) on P1.4 // Select TX,RX functionality for P1.2, P1.1 P1SEL |= 6; P1SEL2 |= 6; // Initialize USCI UCA0CTL1 |= 0x80; // Use SMCLK // Baudrate 9600 (assuming 16MHz clock) UCA0BR0 = 131; // 1667 % 256 UCA0BR1 = 6; // 1667 / 256 // Start UCA0CTL1 &= ~1; // Enable RX interrupt. TX interrupt should only be enabled when transmitting. IE2 = 1; } volatile uint8_t gotByte = 0; volatile char *p; char msg[6] = "Got x\n"; int main(void) { volatile uint32_t x = 0; WDTCTL = WDTPW | WDTHOLD; // stop watchdog timer setup(); __enable_interrupt(); for ( ; ; ) { // Blink LED if (x == 250000) { P1OUT ^= 1; x = 0; } else { x += 1; } // Check RX data indication if (gotByte) { gotByte = 0; // Update the reply string msg[4] = UCA0RXBUF; p = msg; // Enable TX interrupt to start transmission IE2 |= 2; } } return 0; } #pragma vector=USCIAB0TX_VECTOR __interrupt void TX_ISR(void) { if (*p) { // Send next char in string UCA0TXBUF = *p++; } else { // Turn off TX interrupt IE2 &= ~2; } } #pragma vector=USCIAB0RX_VECTOR __interrupt void RX_ISR(void) { gotByte = 1; // Clear the interrupt flag manually, since we didn't read the buffer yet IFG2 &= ~1; }