通用异步串行接口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);
}
用户377235 2014-7-27 15:18
用户284734 2012-7-30 17:02
用户1455130 2009-12-23 23:04