由于项目需求,要实现S3C2440串口与PC机的通讯。通过实验手册上的串口通讯示例了解串口的工作原理,实现简单的串口通讯实验。为进一步利用串口编程实现更加复杂的功能做准备。
实验效果:PC机上按下任意键,通过串口将字符传送至2440,2440又通过串口返回至PC机,并在DNW终端或超级终端显示该字符。
二、实验原理
PC机 <-------> S3C2440开发板
S3C2440的UART提供了三个独立的异步串行I/O端口,每个都可以在中断和DMA两种模式下进行,他们支持的最高波特率是115.2Kbps。每个UART通道包含两个64字节的FIFO,分别提供数据接收和发送。
每个UART包含波特率发生器、接收器、发送器和控制单元。其中,波特率发生器以MCLK为时钟源。发送器和接收器包含64字节FIFO寄存器和移位寄存器。当发送数据时,数据先写到FIFO,然后拷贝到发送移位寄存器,再从数据输出端口(TxDn)依次被移位输出。被接受的数据也同样从接收端口(RxDn)移位输入到移位寄存器,然后拷贝到FIFO中。
1、数据发送操作
数据发送帧的格式是可编程的,它包含一个开始位,5到8个数据位,一个可选的奇偶位和1或2个停止位,这些可通过线性控制器(ULCONn)来设置。
2、数据接收操作
与数据发送一样,数据接收的帧也是可编程的。接收器能够检测溢出错误、奇偶校验错误、帧错误和中止状况,每种情况下都将会产生一个错误标志置位。
3、波特率发生器
每个UART的波特率发生器为传输提供了串行移位始终。波特率发生器的时钟源可以从S3C2440的内部系统时钟或UEXTCLK中来选择。波特率由时钟源(PCLK、FCLK、或UEXTCLK)16分频和UART波特率除数寄存器(UBRDIVn)指定的16位除数决定。UBRDIVn的值可按照下式确定:
UBRDIVn = (int)(UART clock/(bps*16)) – 1
(UART clock为PCLK、FCLK或UEXTCLK) 除数的范围为1到(216-1)。
例如,若波特率为115200bps,且UART为40MHz,则UBRDIVn为:
UBRDIVn =(int)(40000000/(115200*16))-1
= (int)(21.7) – 1
= 22 – 1
= 21
三、代码实现
主程序部分:serial.c
#define ULCON0 (*(volatile unsigned *)0X50000000) //UART线控制寄存器 #define UCON0 (*(volatile unsigned *)0X50000004) //UART控制寄存器 #define UFCON0 (*(volatile unsigned *)0X50000008) //FIFO控制寄存器 #define UTRSTAT0 (*(volatile unsigned*)0X50000010) //UART状态寄存器 #define UBRDIV0 (*(volatile unsigned *)0X50000028) //波特率 #define UTXH0 (*(volatile unsigned *)0X50000020) //发送数据寄存器8位 #define URXH0 (*(volatile unsigned *)0X50000024) //接收数据寄存器8位 int TSmain() { char buf; ULCON0 &=0XFFFFFF00; ULCON0 |=0X03; //1位起始位,8位数据位 UCON0 =0X0805; //串口时钟PCLK,查询方式 UBRDIV0 =0X1A; //波特率115200 while(1) { if(UTRSTAT0 & 0X01) //接收是否完毕 =1结束 { buf=URXH0; //读取数据 while(!(UTRSTAT0 & 0X04));//是否允许发送 =1允许 UTXH0=buf; } } return 0; }
引导程序部分
AREA |DATA|,CODE,READONLY ENTRY ldr r13,=0x1000 IMPORT TSmain b TSmain END