原创 MSP430单片机UART学习

2011-6-7 11:50 6754 4 6 分类: MCU/ 嵌入式

通用异步串行接口UART<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

一、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上使用串口调试助手向UART发送数据,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);

}

PARTNER CONTENT

文章评论2条评论)

登录后参与讨论

用户377235 2014-7-27 15:18

这程序是发送什么字符就收到什么字符么?为什么我收到的字符和发送的字符不一样。

用户284734 2012-7-30 17:02

正在学430,谢谢分享

用户1455130 2009-12-23 23:04

很好
相关推荐阅读
用户391645 2011-10-06 20:21
Quartus II调用ModelSim AE进行仿真
1、软件准备:Quartus II,使用的是9.0的版本    ModelSim AE使用的是与9.0配套的6.4a版本    使用AE版本的modelsim可以免去altera仿真库的设置之类的...
用户391645 2011-09-27 08:59
CAN总线学习记录一
1、CAN总线的传输: CAN总线上某个节点,发送报文在总线上,这时报文以广播的方式在总线上传输,如果当中有两个节点,它们拥有与报文标示符一样的接受代码,经过验收滤波后,报文就会存入RXFIFO中...
用户391645 2011-09-19 20:46
LabVIEW中把接收到的ASCII码转换为对应的数字
在做串口接收试验中,需要将从串口接收的数据转显示在waveform char中,在接收到数据后需要对数据进行转换一下。使用LabVIEW做成一个子VI的形式。框图如下:   其中string要设...
用户391645 2011-06-08 15:35
MSP430F149的定时器Timer_A操作与使用
一、Timer_A的主要特点:<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> ? ...
用户391645 2010-12-10 10:41
博客开通~~~~
           开通了自己的博客,以后准备把学习的过程记录下来。以方便以后自己总结时查看。呵呵~~ ...
EE直播间
更多
我要评论
2
4
关闭 站长推荐上一条 /3 下一条