[资料分享] MSP430 - G2553之串口操作

fish001   2017-9-15 22:48 楼主
#include   

void delay1s(void)   
{  
  int t = 1000;  
  while (t--)  
    __delay_cycles(1000);      
}  

#define UART_TXD 0x02                                  // TXD on P1.1 (Timer0_A.OUT0)  

#define UART_TBIT (1000000 / 9600)                     // 9600 Baud, SMCLK = 1MHz  
                                                       // Globals for transmit UART communication  
unsigned int txData;                                   // UART internal variable for TX  

void TimerA_UART_tx(unsigned char byte);               // Function prototypes  
void TimerA_UART_print(char *string);  

void main(void)  
{  
  WDTCTL = WDTPW + WDTHOLD;                            // Stop watchdog timer  
  DCOCTL = 0x00;                                       // Set DCOCLK to 1MHz  
  BCSCTL1 = CALBC1_1MHZ;  
  DCOCTL = CALDCO_1MHZ;  

  P1OUT = UART_TXD;                                    // Initialize P1.1  
  P1SEL = UART_TXD;                                    // Timer function for TXD pin  
  P1DIR = UART_TXD;                                    // Set TXD pin to output  
                                                       // Timer_A for transmit UART operation  
  TA0CCTL0 = OUT;                                      // Set TXD Idle as Mark = '1'  
  TA0CCTL1 = SCS + CM1 + CAP;                          // Sync, Neg Edge, Capture  
  TA0CTL = TASSEL_2 + MC_2;                            // SMCLK, start in continuous mode  

  P2DIR |= (BIT3 | BIT4);                       //Set P1.0 and P1.6 to outputs  

  _BIS_SR(GIE);                                        // Enable CPU interrupts  

  while (1) {  
    TimerA_UART_print("G2553 TimerA UART\r\n");          // Send test message   
    TimerA_UART_print("READY.\r\n");  
    P2OUT ^= 0x18;  
    delay1s();  
  }  
}  

void TimerA_UART_tx(unsigned char byte)              // Outputs one byte using the Timer_A UART  
{               
  while (TACCTL0 & CCIE);                              // Ensure last char got TX'd  

  TA0CCR0 = TAR;                                       // Current state of TA counter  
  TA0CCR0 += UART_TBIT;                                // One bit time till first bit  
  txData = byte;                                       // Load transmit data, e.g. 'A'=01000001  
  txData |= 0x100;                                     // Add mark stop bit, e.g. 101000001  
  txData <<= 1;                                        // Add space start bit, e.g. 1010000010  
  TA0CCTL0 = OUTMOD0 + CCIE;                           // Set TXD on, enable counter interrupt  
}  

void TimerA_UART_print(char *string) {                 // Prints a string using the Timer_A UART  
  while (*string)  
    TimerA_UART_tx(*string++);  
}  

#pragma vector = TIMER0_A0_VECTOR                      // Timer_A UART - Transmit ISR  

__interrupt void Timer_A0_ISR(void) {  
  static unsigned char txBitCnt = 10;  
  TA0CCR0 += UART_TBIT;                                // Add Offset to CCRx  

  if (txBitCnt == 0) {                                 // All bits TXed?  
    TA0CCTL0 &= ~CCIE;                                 // All bits TXed, disable interrupt  
    txBitCnt = 10;                                     // Re-load bit counter  
  }  
  else {  
    if (txData & 0x01)  
      TA0CCTL0 &= ~OUTMOD2;                            // TX Mark '1'  
    else  
      TA0CCTL0 |= OUTMOD2;                             // TX Space '0'  
  }  
  txData >>= 1;                                        // Shift right 1 bit (low bits TX'ed first)  
  txBitCnt--;  
}  

回复评论

暂无评论,赶紧抢沙发吧
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复