S5PV210 包含 4 个异步收发器(UART),提供 4 个独立的异步串行输入/输出(I/O)端口。所有端口
可工作于中断模式或 DMA 模式。提供高达 3Mbps 的位速率。每个 UART 包含 2 个 FIFO 用于接收和发送
数据。具有可编程的波特率、红外收发、 1 位或 2 位停止位、 5~8 位数据位、校验。
数据发送:要发送的数据帧是可编程的。它包含 1 位起始位, 5~8 位数据位, 1 个可选校验位, 1
或 2 位停止位,这些都通过 ULCONn 寄存器来设置。在 FIFO 模式下发送器将要发送的数据发送给 Tx FIFO,
在非 FIFO 模式下,发送器将要发送的数据发送给 Tx 保持寄存器。
数据接收:和数据发送类似。
串口编程操作步骤如下:
1、配置时钟,选择时钟源
2、配置 ULCONn 寄存器:设置数据位、停止位、 校验位、模式
3、配置 UCONn 寄存器:设置数据接收和发送模式、时钟源
3、设置 UFCONn:启用或静止 FIFO
4、配置 UBRDIVn 和 UDIVSLOTn:计算波特率
5、发送数据:等待发送器为空,将要发送的 8 位数据赋给发送缓存寄存器 UTXHn
6、接收数据:等待接收缓冲区有数据可读,从接收缓存寄存器 URXHn 中取出数据
波特率计算:
DIV_VAL = UBRDIVn + (num of 1’s in UDIVSLOTn)/16
DIV_VAL = (PCLK / (bps x 16)) −1个人 QQ: 809205580 技术交流群: 153530783 个人博客: http://blog.youkuaiyun.com/zjhsucceed_329
或者
DIV_VAL = (SCLK_UART / (bps x 16)) −1
比如配置波特率为 115200bps,时钟源选择 PCLK=66MHz
DIV_VAL = (66000000/(115200 x 16))-1 = 35.8 - 1 = 34.8
UBRDIV0 = 34 (DIV_VAL 的整数部分)
(num of 1’s in UDIVSLOTn)/16 = 0.8 (DIV_VAL 的小数部分)
(num of 1’s in UDIVSLOTn) = 12
UDIVSLOT0 = 0xDDDD (查表)
+
#define GPA0CON (*(volatile unsigned int *)0xE0200000)
#define ULCON0 (*(volatile unsigned int *)0xE2900000)
#define UCON0 (*(volatile unsigned int *)0xE2900004)
#define UTRSTAT0 (*(volatile unsigned int *)0xE2900010)
#define UTXH0 (*(volatile unsigned char *)0xE2900020)
#define URXH0 (*(volatile unsigned char *)0xE2900024)
#define UBRDIV0 (*(volatile unsigned int *)0xE2900028)
#define UDIVSLOT0 (*(volatile unsigned int *)0xE290002C)
void uart_init(void)
{
/* 设置对应GPIO用于UART0 */
GPA0CON |= 0x22;
/* 设置UART0寄存器 */
/* bit[1:0]:0x3 = 8位数据位
* 其他位默认,即1位停止位,无校验,正常模式
*/
ULCON0 |= (0x3<<0);
/*
* Receive Mode [1:0]:1 = 接收采用查询或者中断模式
* Transmit Mode[3:2]:1 = 发送采用查询或者中断模式
* bit[6]:1 = 产生错误中断
* bit[10]:0 = 时钟源为PCLK
*/
UCON0 = (1<<6)|(1<<2)|(1<<0);
/* 设置波特率(详细信息请参考手册或者学习日记)
* DIV_VAL = UBRDIVn + (num of 1's in UDIVSLOTn)/16
* DIV_VAL = (PCLK / (bps x 16)) - 1
*/
UBRDIV0 = 0x23;
UDIVSLOT0 = 0x808;
return;
}
char uart_getchar(void)
{
char c;
/* 查询状态寄存器,直到有有效数据 */
while (!(UTRSTAT0 & (1<<0)));
c = URXH0; /* 读取接收寄存器的值 */
return c;
}
void uart_putchar(char c)
{
/* 查询状态寄存器,直到发送缓存为空 */
while (!(UTRSTAT0 & (1<<2)));
UTXH0 = c; /* 写入发送寄存器 */
return;
}