msp430学习笔记-USART

本文引用:http://bbs.ednchina.com/BLOG_ARTICLE_3013784.HTM

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 !=‘\0‘ )                  //不为字符串结束符

{

while(!(IFG2&UTXIFG1));

TXBUF1=*ptr++;                     //发送数据

}

}

void delay(void)

{

uchar i=20;

uint j;

while(i--)

{

j=2000;

while(j--);

}

i

例2:PC机想MSP430发送一个数据,+1在发回PC机

#include "io430.h"

#define uint unsigned int

void delay();

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为XT

}

void main( void )

{

// Stop watchdog timer to prevent time out reset

WDTCTL = WDTPW + WDTHOLD;

InitSys();

//串口设置

P3SEL|=BIT6+BIT7;      //P3.6,7=USART0 TXD,RXD

P3DIR|=BIT6;

ME2 |=URXE1+UTXE1; // 使能发送和接收

UCTL1|=CHAR;       //8位

U1TCTL=SSEL1;      //UCLK=SMCLK

U1BR0 = 0x45;                             // 波特率115200

U1BR1 = 0x00;                             //

UMCTL1 = 0x49;                            // Modulation

UCTL1&=~SWRST;     //usart模块初始化

IE2 |=URXIE1;      //社能接收中断

for(;;)

{

__bis_SR_register(LPM0_bits+GIE);

while(!(IFG2&UTXIFG1));           //USART1发送缓冲器是否准备好

TXBUF1=RXBUF1+1;                 //发送数据

delay();

}

}

#pragma vector=UART1RX_VECTOR

__interrupt void usart0_rx(void)

{

LPM0_EXIT;

}

void delay(void)

{

unsigned i=50000;

while(i!=0)

{i--;}

}

时间: 2024-10-17 10:39:25

msp430学习笔记-USART的相关文章

STM32学习笔记——USART串口(向原子哥和火哥学习)

一.USART简介 通用同步异步收发器(USART)提供了一种灵活的方法与使用工业标准NRZ异步串行数据格式的外部设备之间进行全双工数据交换.USART利用分数波特率发生器提供宽范围的波特率选择. STM32 的串口资源相当丰富的,功能也相当强劲.STM32F103ZET6 最多可提供 5 路串口,有分数波特率发生器,支持同步单向通信和半双工单线通信,支持LIN(局部互连网),智能卡协议和IrDA(红外数据组织)SIR ENDEC规范,以及调制解调器(CTS/RTS)操作.它还允许多处理器通信.

msp430学习笔记-msp430g2553

C语言例程:http://wenku.baidu.com/link?url=49JzNSvt3m0fRuf8SWTEM8yEw1yzqr4lBR-QbX8FddcmjTVYnDhuR97wB60HNf07lJmmXbYH6Z1TtleYAE7b1LH9gfvjEGjX01oXZM7CgRO 电设工作小结之——MSP430G2553学习笔记——1 http://blog.sina.com.cn/s/blog_6cd2030b01017x71.html 电设工作小结之——MSP430G2553学习笔

STM32F103X datasheet学习笔记---USART

1.前言 通用同步异步收发器(USART)提供了一种灵活的方法与使用工业标准NRZ异步串行数据格式的外部设备之间进行全双工数据交换. USART利用分数波特率发生器提供宽范围的波特率选择. 它支持同步单向通信和半双工单线通信,也支持LIN(局部互连网),智能卡协议和IrDA(红外数据组织)SIR ENDEC规范,以及调制解调器(CTS/RTS)操作. 它还允许多处理器通信. 使用多缓冲器配置的DMA方式,可以实现高速数据通信. 2.USART主要特性

msp430学习笔记-IO及低功耗

引用:http://bbs.ednchina.com/BLOG_ARTICLE_3013511.HTM MSP430F149有6个8位的IO口,其中P1,P2口占两个中断向量,共可以接16个中断源.还可以直接利用P口的输入输出寄存器,直接对外进行通信.因为所有的IO口都是和其他外设复用的,因此在用端口前都要用功能选择寄存器选定所用的功能是外设还是P口,还要在方向寄存器中确定是输入还是输出 MSP430F149的端口功能 端口 功能 P1,P2 I/O,中断功能,其他片内外设功能 P3,P4,P5

msp430学习笔记-ADC12

本文引用:http://bbs.ednchina.com/BLOG_ARTICLE_3013748.HTM MSP430单片机的ADC12模块是一个12位精度的A/D转换模块,它具有高速度,通用性等特点.从以下ADC12结构框图中可以看出,ADC12模块是由以下部分组成:输入的16路模拟开关,ADC内部参考电压源,ADC12内核,ADC时钟源部分,采集与保持/触发源部分,ADC数据输出部分,ADC控制寄存器等. ADC12模块的所有寄存器 ADC12CTL0: SHT1x:采样保持时间.定义了寄

msp430学习笔记-实现开方log等计算及FFT算法(待续)

MSP430 FFT算法实现 http://bbs.21ic.com/icview-391532-1-1.html http://blog.sina.com.cn/s/blog_6cd2030b01018fp8.html FFT算法的物理意义 http://blog.csdn.net/hzn407487204/article/details/6249945 FFT算法的完整DSP实现 http://blog.csdn.net/xiahouzuoxin/article/details/979045

msp430学习笔记-时钟及延时函数

引用:http://blog.chinaunix.net/uid-24343357-id-3271380.html MCLK默认时钟源是DCOCLK,SMCLK默认时钟源也是DCOCLK,DCOCLK默认约为1.1MHZ(1126.4KHz),ACLK默认为32768HZ 系统复位后MCLK和SMCLK的频率在0.8MHz~1.5MHz,即819.2KHz~1536KHz.系统启动后,可以调整RSELx(基本时钟系统控制寄存器1BCSCTL1前3位).DCOx(DCO控制器DCOCTL前5位).

MSP430学习笔记(4)ADC12

几个术语: a)        分辨率(LSB):表示输出数字量变化一个相邻数码所需要输入模拟电压的变化量,它定义为转换器的满刻度电压与2的n次幂,其中n为ADC的位数. b)        量化误差:由于有限数字对模拟值进行离散取值(量化)而引起的误差.因此,量化误差理论上为一个单位分辨率.即正负1\2LSB. c)        转换精度:反应实际的ADC模块在量化上与理想的ADC模块进行模数转换的差值. d)        转换时间:指ADC完成一次模/数转换所需要的时间. 2.     

msp430学习笔记-TA

定时器,CCR2,CCR1三者共用一个中断向量 定时器A是一个16位的定时/计数器.它有3个捕获/比较寄存器:能支持多个时序控制.多个捕获/比较功能和多个PWM输出:有广泛的中断功能,中断可由计数器溢出产生,也可以由捕获/比较寄存器产生. TimerA的4种工作模式 1.停止模式 停止模式用于定时器暂停,并不发生复位,所有寄存器现行的内容在停止模式结束后都可用.当定时器暂停后重新计数时,计数器将从暂停时的值开始以暂停前的计数方 向计数.例如,停止模式前,Timer_A工作于增/减计数模式并且处于