Step1: 设置TXD、RXD pin的输入输出属性,根据各芯片定义设置
例:P2CR &= 0xFB;//P2^1:UART_TXD, P2^2:UART_RXD
Step2: 设置UART工作方式
设置SCON寄存器。例,SH88F02设置为工作方式1,SCON = 0x40;
在SH88F02应用中发现,必须先配置SCON在配置定时器,如果顺序颠倒UART不工作。
正常顺序见最后例程。
设置PCON的bit7可以设置波特率加不加倍。
Step3: 选择产生波特率的定时器
例,SH88F02选择定时器2为波特率发生器。
T2CON = 0x30; //(TCLK=1, RCLK=1)
Step4: 设置产生波特率定时器的工作方式及定时器重载值
一般产生波特率的定时器都工作在重载方式下。在这步就根据各芯片设置对应的定时器工作,设置完毕后注意要启动定时器:TRx = 1;
例, SH88F02定时器2设置如下:
T2CON = 0x30; //UART波特率由定时器2产生
T2MOD = 0x00; //定时器2时钟源为系统时钟
RCAP2L = 0xD8; //波特率为9600
RCAP2H = 0xFF;
TL2 = 0xD8;
TH2 = 0xFF;
TR2 = 1;
Step5: 启动UART
向SBUF中写入数据即启动了UART的发送。
REN = 1; // 允许接收
REN设置后,接收数据线RXD上侦测到低电平的起始信号即会开始接收数据。
TI = 1; //特别强调一下
其中TI = 1的设置与printf的使用有关。在实际测试中,如果在初始化中没有这句,用printf()语句不能正常输出,但是给SBUF赋值还是能正常输出的。
Step6: 中断设置:
EADC = 1;
EA = 1;
设置后当发送数据完毕,或接收数据完毕即会进入中断
void interruptUART() interrupt 4 using 3
{
if(TI)
TI = 0;
if(RI)
{
RI = 0;
rDataUart = SBUF;
uartReadFlag =1;
}
}
例,SH88F02 UART配置工作例程:
void Init_Port()
{
P0CR &= 0xDC; //P0^5为ADC input
P1CR &= 0x00; //P1端口配置为输入模式
P2CR &= 0xFB; //P2^1:UART_TXD, P2^2:UART_RXD
}
void Init_Uart() //串口通信初始化
{
SCON=0x40; //串口通信工作方式1
T2CON = 0x30; //UART波特率由定时器2产生
T2MOD = 0x00; //定时器2时钟源为系统时钟
RCAP2L = 0xD8; //波特率为9600
RCAP2H = 0xFF;
TL2 = 0xD8;
TH2 = 0xFF;
TR2 = 1;
TI = 1; //很重要
REN=1; //允许接收
}
void main(void)
{
Init_System();
while(1)
{
if(uartReadFlag)
{
uartReadFlag = 0;
// printf("Get the valule is: %d \r\n", rDataUart);
SBUF = rDataUart;
}
}
}
bit uartReadFlag = 0; //UART读到值标志
unsigned int rDataUart = 0; //UART接收buffer
void interruptUART() interrupt 4 using 3
{
if(TI)
TI = 0;
if(RI)
{
RI = 0;
rDataUart = SBUF;
uartReadFlag =1;
}
}
上述配置后,用printf即可与串口助手通信。