您的位置:首页 > 其它

s5pv210----串口设置之输入输出字符

2013-03-18 20:57 155 查看
第一节 S5PV210 UART相关说明

通用异步收发器简称UART,即UNIVERSAL ASYNCHRONOUS RECEIVER AND TRANSMITTER,它用

来传输串行数据。发送数据时,CPU 将并行数据写入UART,UART按照一定的格式在一根电线上串

行发出;接收数据时,UART检测另一根电线的信号,将串行收集在缓冲区中,CPU 即可读取UART

获得这些数据。

在S5PV210 中,UART提供了4 对独立的异步串口I/O 端口,有 4 个独立的通道,每个通道可

以工作于DMA 模式或者中断模式。其中,通道0 有256byte 的的发送FIFO和256byte 的接收FIFO,

通道1 有64byte的的发送FIFO和64byte的接收FIFO,而通道 2 和3 只有16byte的的发送FIFO

和16byte的接收FIFO。

S5PV210 的uart结构图如下:


UART使用标准的TTL/CMCOS 逻辑电平来表示数据,为了增强数据抗干扰能力和提高传输长度,通

常将TTL/CMOS逻辑电平转换为RS-232 逻辑电平,查看原理图可知Mini210S使用的是MAX3232SOP

芯片,使用的是TX0 和DX0:



搜索“XuTXD0”,可知



通过设置UART相关寄存器,我们就可以驱动UART工作,达到发送和接收字符的目的。

第二节 程序相关讲解

完整代码见目录12.uart_putchar,对比前一个目录11.clock_c,区别在于main.c和多了一个

uart.c文件。

1. main.c

完整代码如下:

int main()

{

char c;

uart_init(); // 初始化串口

while (1)

{

c = getc (); // 接收一个字符c

putc(c+1); // 发送字符c+1

}

return 0;

在main函数中,先会调用uart_init()初始化UART,然后使用 getc接收PC发过来的字符,再调

用putc()将该字符+1回复给PC。

2. uart.c

art_init() 代码如下:

oid uart_init()

// 1 配置引脚用于RX/TX 功能

GPA0CON = 0x22222222;

GPA1CON = 0x2222;

// 2 设置数据格式等

UFCON0 = 0x1; // 使能FIFO

UMCON0 = 0x0; // 无流控

ULCON0 = 0x3; // 数据位:8, 无校验, 停止位: 1

UCON0 = 0x5; // 时钟:PCLK,禁止中断,使能UART发送、接收

// 3 设置波特率

UBRDIV0 = UART_UBRDIV_VAL; // 35

UDIVSLOT0 = UART_UDIVSLOT_VAL; // 0x1

}

上述代码共有3 个步骤,下面我们来一一讲解每一个步骤:

第一步 配置引脚用于RX/TX 功能

参考UART引脚连接图,我们需要设置GPA0CON 和GPA1CON 寄存器使GPA0和GPA1引脚用于UART

功能。





第二步 设置数据格式等

<1> ULCON0用来设置数据格式,见下图



Word Length = 11,8bit 的数据;

Number of Stop Bit = 0,1bit 的停止位;

Parity Mode = 000,无校验;

Infrared Mode =0,使用普通模式;

所以ULCON0=0x3

<2> 9 UCON0 是UART的配置寄存器,见下图



Receive Mode = 01 ,使用中断模式或者轮询模式;

Transmit Mode = 01,使用中断模式或者轮询模式;

Send Break Signal = 0,普通传输;

Loop-back Mode = 0,不使用回环方式;

我们采用轮询的方式接受和发送数据,不使用中断,所以bit[6-9]均为0;

Clock Selection = 0,使用PCLK作为UART的工作时钟;

我们不使用DMA,所以bit[16]和bit[20]均为0;

所以UCON0 = 0x5

<3> UFCON0和UMCON0

这两个寄存器比较简单,UFCON0用来使能FIFO,UMCON0用来设置无流控。

第三步 设置波特率

波特率即每秒传输的数据位数,涉及两个寄存器:UBRDIV0 和UDIVSLOT0



波特率设置相关公式:UBRDIVn + (num of 1's in UDIVSLOTn)/16 = (PCLK / (bps x 16)) −1

其中,由Maximum Operating Frequenc y for Each Sub -block 图可知,UART工作于PSYS下,所

以PCLK即PCLK_PSYS = 66.5MHz,我们的波特率bps 设置为115200,所以

(66.5MHz/(115200 x 16) ) – 1 = 35.08 = UBRDIVn + (num of 1's in UDIVSLOTn)/16, 所以我

们设置UBRDIV0=35,UDIVSLOT0=0x1

getc()和putc()的代码如下:

// 接收一个字符

char getc(void)

{

while ((UFSTAT0 & 0xff) == 0); // 如果RX FIFO 空,等待

return URXH0; // 取数据

}

// 发送一个字符

void putc(char c)

{

while (UFSTAT0 & (1<<24)); // 如果TX FIFO 满,等待

UTXH0 = c; // 写数据

}



发送/接收状态寄存器

通过读UTRSTAT0 发送/接收状态寄存器,当Receive buffer data ready= 1 时说明接收到数据,

读URXH0 寄存器可以得到8bit的数据;当Transmitter empty = 1 时说明可以发送数据,写8bit

的数据到UTXH0。

第三节 编译代码和烧写运行

编译代码,在Fedora终端执行如下命令:

# cd 12.uart_putchar

# make

在12.uart_putchar 目录下会生成uart.bin,我们将其烧写到开发板中。

第四节 实验现象

先连接好串口线,并通过MiniTools 自带的串口助手打开串口(注意要设置好波特率等参数,如

图),然后从 PC键盘中敲入一个字符,则串口终端会显示该字符在ASCII 表中的下一字符,如输

入‘a’,串口终端会出现‘b’
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: