msp430G2553串口通信_launchpad串口通信

MSP430G2553 单片机中集成了 USCI_A0功能模块,可以直接完成串口通信
一、代码与仿真
TI官方例程中uart代码只有时钟,引脚,串口的初始化,不能直接串口收发,还需要增加发送函数和完善中断函数,我在官方例程的基础上,编写了串口通信程序,并硬件测试通过 。

硬件测试用板(TI的MSP-EXP430G2ET)
注意:图中绿圈跳帽的接法
在水平方向上, 跳线将 TXD 连接到 P1.1, 将RXD 连接到 P1.2 。
在垂直方向上, 跳线将 TXD 连接到 P1.2, 将RXD 连接到 P1.1。
用USCI_A0模块的串口时,RXD和TXD是固定的,板子的跳帽接法固定。
若是软件串口(TimerA定时器和软件结合的串口),则根据RXD和TXD
的设置,来接跳帽。
msp430G2553串口通信_launchpad串口通信_第1张图片

串口测试助手的收发情况
打开板子,电脑端收到
MADE BY PengChengIT.
G2553 UART
READY!!!
通过电脑端向芯片发字符,发啥收啥。测试成功!

msp430G2553串口通信_launchpad串口通信_第2张图片

代码说明
接收:
1、UCA0RXBUF是 USCI_A0模块存放要接收的字的寄存器。
2、接收过程触发中断响应,中断向量:USCIAB0RX_VECTOR;
发送
1、有两个发送函数
①putchar(unsigned char tx_data)直接向函数输入要发送的字节
②putstr(char *s),可以直接向函数输入要发送的一串文字、数字。
char *string1=“MADE BY PengchengIT\n”;
putstr(string1);
2、UCA0TXBUF是 USCI_A0模块存放要发送的字的寄存器。
程序:
收啥发啥,每次收到后P1.0会亮一下。

#include 
void putchar(unsigned char tx_data);
void putstr(char *s);


unsigned char RX_DATA;
char *string1="MADE BY PengchengIT\n";
char string2[]="G2553 UART\n READY!!!\n";

int main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
  if (CALBC1_1MHZ==0xFF)					// If calibration constant erased
  {											
    while(1);                               // do not load, trap CPU!!	
  }
  DCOCTL = 0;                               // Select lowest DCOx and MODx settings
  BCSCTL1 = CALBC1_1MHZ;                    // Set DCO
  DCOCTL = CALDCO_1MHZ;
  P1SEL = BIT1 + BIT2 ;                     // P1.1 = RXD, P1.2=TXD
  P1SEL2 = BIT1 + BIT2 ;                    // P1.1 = RXD, P1.2=TXD
  P1DIR = BIT0;                             //p1.0外接LED为输出状态
  P1OUT &= ~BIT0;
  UCA0CTL1 |= UCSSEL_2;                     // SMCLK
  UCA0BR0 = 104;                            // 1MHz 9600
  UCA0BR1 = 0;                              // 1MHz 9600
  UCA0MCTL = UCBRS0;                        // Modulation UCBRSx = 1
  UCA0CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**
  IE2 |= UCA0RXIE;                     // Enable USCI_A0 RX interrupt
  putstr(string1);
  putstr(string2);
  __bis_SR_register(LPM0_bits+GIE);       // Enter LPM0, interrupts enabled

}

void putchar(unsigned char tx_data) //发送字符函数
{
while (!(IFG2&UCA0TXIFG)); // USCI_A0 TX buffer ready? 等待TX buffer为空
UCA0TXBUF = tx_data;// TX -> RXed character? 发送字符c
}

void putstr(char *s)//发送字符串函数
{
IE2 &= ~UCA0RXIE;//发送时先关闭接收中断,不接收
//如果没有发完,就继续循环发送
while((*s)!='\0')
{
putchar(*s);
s++;
}
IE2 |= UCA0RXIE; //发送完了打开接收中断
}

//  Echo back RXed character, confirm TX buffer is ready first
#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
#pragma vector=USCIAB0RX_VECTOR
__interrupt void USCI0RX_ISR(void)
#elif defined(__GNUC__)
void __attribute__ ((interrupt(USCIAB0RX_VECTOR))) USCI0RX_ISR (void)
#else
#error Compiler not supported!
#endif
{
while (!(IFG2&UCA0TXIFG)); // USCI_A0 TX buffer ready? 等待TX buffer为空
UCA0TXBUF = UCA0RXBUF; // TX -> RXed character? 发送接收到的数据
RX_DATA=UCA0RXBUF;
 if(RX_DATA&0x01)
{
P1OUT |= BIT0;
int i; 

for(i=0;i<400;i++); 

P1OUT &= ~BIT0;
}
else
P1OUT &= ~BIT0;                
}

二、 代码分析
时钟配置可以参考:
https://blog.csdn.net/pengchengIT/article/details/105763199
USCI_A0模块配置:
https://blog.csdn.net/weixin_43830248/article/details/85219710

你可能感兴趣的:(msp430g2553,单片机,串口通信)