MSP430F4152串口操作
/**********************************************************************/
/*
名称:串口通讯
功能:将接到的数据组后原封不动的发送出去
*/
/**********************************************************************/
#include <msp430x41x2.h>
unsigned char i,ii,n;
unsigned char RX[20]={0};
void UART_init()
{
P6SEL |= BIT5+BIT6; // P6.5,6 = USCI_A0 RXD/TXD
UCA0CTL1 |= UCSSEL_1; // CLK = ACLK
UCA0BR0 = 0x03; // 32k/9600 - 3.41
UCA0BR1 = 0x00; //
UCA0MCTL = 0x06; // Modulation
UCA0CTL1 &= ~UCSWRST; // **Initialize USCI state machine**
IE2 |= UCA0RXIE; // Enable USCI_A0 RX interrupt
IE2 &= ~UCA0TXIE;
}
////////////////////////////////////////////////////////////////////////////////
void Iint_Port1(void)//端口P1_4和P1_5中断
{
P1DIR&=~BIT5; //设置为输入方向P1_4
P1SEL&=~BIT5; //设置为普通I/O口功能
P1IES&=~BIT5; //选择上升沿触发
P1IE|=BIT5; //打开中断允许
P1IFG&=~BIT5; //P2IES的切换可能使P1IFG.4置位,需清除
_EINT();
}
/////////////////////////////////////////////////////////////////////
void main(void)
{
WDTCTL = WDTPW+WDTHOLD; // Stop WDT
FLL_CTL0 |= XCAP14PF; // Configure load caps
Iint_Port1();
UART_init();
_BIS_SR(LPM3_bits + GIE); // Enter LPM0, interrupts enabled
}
////////////////////////////////////////////////////////////////////
#pragma vector=USCIAB0RX_VECTOR
__interrupt void USCIA0RX_ISR (void)
{
RX[i] = UCA0RXBUF;
i++;
if(RX[i-1]==0x68)
{
n=i;
i=0;
}
}
////////////////////////////////////////////////////////////////////////
#pragma vector = PORT1_VECTOR //外部中断中断入口
__interrupt void P1_ISR(void)
{
if(P1IFG&BIT5)
{
P1IFG&=~BIT5; //多源中断,需靠软件清除P1IFG.5
for(ii=0;ii<n;ii++) //发送8个数据
{
UCA0TXBUF=RX[ii];
while(!(IFG2&UCA0TXIFG));
}
}
}