历史上的今天
今天是:2025年02月20日(星期四)
2021年02月20日 | MSP430学习笔记——USART
2021-02-20 来源:eefocus
MSP430F149有两个USART通讯端口,其性能完全一样,每个通讯口可通过RS232和RS485等芯片转换,与之相应的串行接口电路通讯。MSP430F149支持串行异步和同步通讯,每种方式都具有独立的帧格式和独立的控制寄存器。

USART异步通信
MSP430串行异步通信模式通过两个引脚:接收引脚URXD和发送引脚UTXD与外界相连。异步帧格式由一个起始位,7或8个数据位,校验位(奇/偶/无),1个地址位,和1或2个停止位。从最低位开始发送和接收。异步模式下,传送数据以字符为单位。
在异步模式下,USART支持两种多机模式,即线路空闲和地址位多机模式。
(1)线路空闲多机模式:

在这种模式下,数据块被空闲时间分隔。在字符的第一个停止位之后,收到10个以上的1则标识检测到接收线路空闲,如果采用两位停止位,则第二个停止位被认为是空闲周期的第一个标志。空闲周期后的第一个字符是地址字符。当接收到的字符是地址字符时,RXWAKE置位,并送入接收缓存。
(2)地址位多机模式

在这种模式下,字符包含一个附加的位作为地址标志。数据块的第ige字符带有一个置位的地址位,用以表明该字符是一个地址。
波特率的产生:
在异步串行通信中,波特率是哼重要的指标,定义为每秒钟传送二进制数码的位数。波特率反映了异步串行通信的速度。波特率部分由时钟输入选择和分频,波特率发生器,调整器和波特率寄存器等组成。
下面是波特率发生器的框图:

分频因子N由送到分频计数器的时钟(BRCLK)频率和所需的波特率来决定:
N=BRCLK/波特率
分频因子定义如下:
N=UBR+(M7+M6+M5+M4+M3+M2+M1+M0)/8
中断:
USART模块有接收和发送两个独立的中断源。使用两个独立的中断向量,一个用于接收中断时间,一个用于发送中断事件。USART模块的中断控制位在特殊的功能寄存器中。
USART0
特殊功能寄存器 接收中断控制位 发送中断控制位 IFG1 接收中断标志URXIFG0 发送中断标志 UTXIFG0 IE1 接收中断使能URXIE0 发送中断使能UTXIE0 ME1 接收允许URXE0 发送允许UTXE0 MSP430F149有USART0和USART1两个通信硬件模块,因此有两套寄存器。
一次正确的USART模块初始化应该是这样的顺序:
(1)先在控制位SWRST=1(默认)的情况下设置串口
(2)然后设置SWRST=0;
(3)最后如果需要中断,则设置相应的中断使能
例程:MCU不停向PC发送数据,在屏幕上显示0-127对应的ASCII字符。数据格式无奇偶校验,8位数据位,1个停止位,波特率115200.
#include "io430.h"
#define uchar unsigned char
#define uint unsigned int
void InitSys()
{
uint iq0;
//使用XT2振荡器
BCSCTL1&=~XT2OFF; //打开XT2振荡器
do
{
IFG1 &= ~OFIFG;// 清除振荡器失效标志
for (iq0 = 0xFF; iq0 > 0; iq0--);// 延时,等待XT2起振
}
while ((IFG1 & OFIFG) != 0);// 判断XT2是否起振
BCSCTL2 =SELM_2+SELS;//选择MCLK、SMCLK为XT2,四分频
}
void delay(void);
void PutString(uchar *ptr);
void main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
InitSys();
uchar value=0;
//以下是串口设置
P3SEL|=0XC0; //P3.6,7选为USART0收发端
P3DIR|=0x40; //P3.6为输出
ME2|=UTXE1+URXE1; // 使能USART0的接收和发送
UCTL1|=CHAR; //8-bit
UTCTL1|=SSEL1; //UCLK=SMCLK
UBR01=0x45; //设置波特率32/2400=13.65
UBR11=0x00;
UMCTL1=0x049;
UCTL1&=~SWRST; //初始USART0状态机
while(1)
{
while(!(IFG2&UTXIFG1)); //USART1发送缓冲器是否准备好
TXBUF1=value++;
value&=0x7f; //保证value的数值小于128
while(!(IFG2&UTXIFG1));
TXBUF1='n'; //发送换行符
delay();
}
}
void PutString(uchar *ptr) //向PC机发送字符串
{
while(*ptr !='




