代码概述
- 功能简述: 将串口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;
}
}