通用全双工异步串口实验demo

UART模块学习记录

代码概述

  • 功能简述: 将串口2接收到的数据,以0x0D,0x0A结尾,返回给PC
  • 硬件说明: UART2引脚为P43、P44,接到TTL-USB芯片,插入USB线与PC通信

代码注释

通用全双工/半双工收发器(USARTx)模块包括波特率发生器(BRG)数据发送数据接收这三部分,每个部分都有相应的寄存器设置,主要包括波特率控制寄存器 BRCTLx,发送状态和控制寄存器 TSCTLx 和接收状态和控制寄存器 RSCTLx。

在波特率发生器这部分,通过设置 SYNCx、 HBRGx 和 BxRG16 位来进行选择设置{EUBRGHx: EUBRGLx}寄存器的值来配置波特率。

在数据发送部分,包括全双工异步发送和半双工同步发送,通过发送状态和控制寄存器TSCTLx 来控制实现相应的功能。

在数据接收部分,包括全双工异步接收和半双工同步接收,通过接收状态和控制寄存器RSCTLx 来控制实现相应的功能。

串口初始化函数:

void UART2_Init(void)
{
    APFCTL12=0x03;	//特殊引脚功能复用
	//TX2、RX2引脚
	ANS43=0;
	ANS44=0;

	/***Usart相关寄存器初始化****/

	//USARTx波特率控制寄存器BRCTLx	P274
	//自动波特率定时器没有溢出  接收空闲  传送非反相数据  使用8位计数器  不考虑唤醒使能
	BRCTL2=0x40|USART_SourceClk_HFCLK;	
	//{EUBRGHx: EUBRGLx}寄存器的值来配置波特率
	// 波特率公式=SCLK/(m*y+1),其中SCLK系统时钟,如这里8M,m为倍频数,见手册,y为8位或16位波特率计数值
	// SYNC=0(全双工异步模式),BRG16=0(使用8位波特率发生器),HBRG=0(低速),Baud=8000000/(64*(12+1))=9615
	EUBRGH2=0x00;	
	EUBRGL2=0x19; 	
	
	//发送状态和控制寄存器 TSCTLx
	TSCTL2=0x22;  	// 8位 发送,使能发送,全双工异步模式SYNC=0,低速模式HBRG=0,发送移位空,不发送同步间隔符
	
	//接收状态和控制寄存器 RSCTLx
	RSCTL2=0x90;  	// 串口使能(配置引脚为串行口引脚),8位接收,接收使能,无帧错误,溢出错误,不考虑地址识别和第9位

	TX2IF=0;
	TX2IE=0;
	RC2IF=0;
	RC2IE=1;//接收中断
}

中断函数:

void int_fun0() __interrupt (0)
{
	volatile uint8 revBuf; // 避免优化下未读取RXSDR2

	if(RC2IE && RC2IF){
		if(FRER2){			//FRERx: 帧错误位			1 = 帧错误(可通过读 RXSDRx寄存器刷新该位,并接收下一个有效字节)	 0 = 无帧错误
			revBuf=	RXSDR2; //要清除 RCxIF中断,需要读取RXSDRx中的值;通过读 RXSDRx寄存器刷新FRERx位,并接收下一个有效字节
		}else if(OVFER2){	//溢出错误位				1 = 溢出错误(可通过清 0 CRXENx 位来清 0 该位)			0 = 无溢出错误
			CRXEN2=0;		//CRXENx: 连续接收使能位		1 = 使能接收器 		0 = 禁止接收器
			revBuf=	RXSDR2; //读清零RC2IF
			CRXEN2=1;		//接收使能
		}else{
			UART2_BUF[Rev_count]=RXSDR2;
			if(UART2_BUF[Rev_count] == 0x0D){
				Rev_StopFlag=1;
			}else{
				if(Rev_StopFlag){
					if(UART2_BUF[Rev_count] == 0x0A)
						Rev_Flag=1;
					else Rev_StopFlag=0;
				}else{
					Rev_StopFlag=0;
				}
			}
			Rev_count++;
		}
	}
}

main函数:

UART2_Init();//串口初始化

//总中断开启
AIE=1;
PUIE=1;

while(1)
{
	if(Rev_Flag == 1)
	{
		Rev_Flag=0;
		for(i=0;i<Rev_count;i++)
		{
			UART2_SendBuf(UART2_BUF[i]);
		}
		Rev_count=0;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值