Tank

MSP430单片机UART

0
阅读(3157)

通用异步串行接口UART

一、MSP430F149单片机的串行接口为USART,可以支持两种通用串行总线模式:一种为UART(异步模式)和SPI同步模式。可以使用UxCTL中的SYNC位来进行选择。SYNC = 1时为SPI模式,SYNC = 0时为UART模式。

二、串口操作的基本步骤如下:

① 置位SWRST来复位串口(串口复位主要通过两个操作来实现:上电复位或置位SWRST位为1);

② 初始化所有的USART寄存器;

③ 使能USART模块,发送(UTXE0)和接收(URXE0);

④ 清零SWRST位;

⑤ 如果需要,则使能中断(URXIE0--接收中断使能)

三、异步通信模式

当两个器件异步通信时,使用空闲模式。当多个器件异步通信时,通用异步串口支持空闲模式和地址模式。

四、UART的波特率

波特率 = BRCLK/N=BRCLK/[UBR+(M7+M6+M5+M4+M3+M2+M1+M0)/8]

其中UBR为16位数据值(整数部分),UxBR1和UxBR0组成。Mx为UxMTCL寄存器中的数值,负责对小数部分的微调。

常用的波特率初值的计算如下表所示:

 

 

300

600

1200

2400

4800

9600

19200

38400

76800

115200

UxBR0

0x2a

0x15

0x0a

0x0d

0x82

0x41

0xa0

0xd0

0x68

0x45

UxBR1

0x68

0x34

0x1a

0x05

0x06

0x03

0x01

0x00

0x00

0x00

UxMCTL

0x00

0x00

0x00

0x00

0x00

0x00

0xc0

0x40

0x40

0x4a

五、串口操作的参考代码

         在PC上使用串口调试助手发送数据,MSP430F149在接收到数据后立即将接收到的数据通过串口发送到PC机,实现串口的自收发。

1) 系统时钟的初始化

void CLK_Init()

{

    unsigned char i;

BCSCTL1 &= ~XT2OFF;//打开XT振荡器

BCSCTL2 |= SELM1 + SELS;//MCLK为8MHZ,SMCLK为1MHZ

do

{

IFG1 &= ~OFIFG;//清除震荡错误标志

for(i = 0;i < 100;i++);//延时等待

_NOP();

}

while((IFG1 & OFIFG) != 0);//如果标志为1,则循环等待

IFG1 &= ~OFIFG;//清除震荡错误标志

}

2) UART的初始化

void Init_Uart()

{

    U0CTL |= SWRST;//串口复位

    U0CTL |= CHAR;//数据为8位

    U0TCTL |= SSEL1;//选择SMCLK为系统时钟

    U0BR0 = 0X41;//波特率选择为9600bps

    U0BR1 = 0X03;//

    UMCTL0 = 0x00;//

    ME1 |= UTXE0 + URXE0;//使能接受和发送

    U0CTL &= ~SWRST;//清除串口复位信号

    IE1 |= URXIE0;//允许接受中断

    P3SEL |= BIT4;//设置P3.4,P3.5为I/O口

    P3SEL |= BIT5;//

    P3DIR |= BIT4;//将P3.4设置为输出(TXD)

}

3) 发送数据

void Send_Data(uchar data)

{

    while((IFG1 & UTXIFG0) == 0);//判断发送是否完成

    U0TXBUF = data;//将数据写入TXBUF中

}

4) 接收中断服务程序,将接收到的数据回发PC

#pragma vector = UART0RX_VECTOR

__interrupt void UART0_RX_ISR(void)

{

    uchar data = 0;

    data = U0RXBUF;

    Send_Data(data);

}

5) 主程序

void main(void)

{

    WDTCTL = WDTPW + WDTHOLD;//关闭看门狗定时器

    CLK_Init();//初始化时钟

    Init_Uart();//初始化串口

    _EINT();//打开全局中断

    while(1);

}