Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdint.h>
- #include <msp430.h>
- 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;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement