ARM串口(UART)的使用 (S3C2440)

UART概述
通用异步收发器简称UART(Universal Asynchronous Receiver and Transmitter)
工作方式为:串行、全双工。
只需3根线:TXD(发送数据)、RXD(接收数据)、GND。

数据传输流程:

  1. 原来是高电平(空闲状态)
  2. 发送方拉低电平,保持1bit时间,为起始位。
  3. 接收方检测到起始位,然后通信双方按照波特率发送和接收5-8位数据。
  4. 若使用校验功能,则发送完数据位后还要接着发送奇偶校验位。
  5. 最后,发送停止位。

S3C2440的UART的特性

  • 3个独立异步串行I/O端口,每个都可以是基于中断或基
    于 DMA 模式的操作。
  • UART 通过使用系统时钟可以支持最高 115.2Kbps 的比特率。如果是外部器件提供 UEXTCLK 的 UART,则 UART可以运行在更高的速度。
  • 每个 UART 通道包含两个的 64 字节的 FIFO 给发送和接收。
  • S3C2440A 的 UART 包括了可编程波特率,红外(IR)发送/接收,插入 1 个或 2 个停止位,5 位、6 位、7 位或 8 位的数据宽度以及奇偶校验。
  • 每个 UART 包含一个波特率发生器、发送器、接收器和一个控制单元。波特率发生器可以由PCLK、FCLK/n 或 UEXTCLK(外部输入时钟)时钟驱动。

UART的结构框图
ARM串口(UART)的使用 (S3C2440)_第1张图片
要发送数据时,CPU控制内存要发送的数据通过FIFO传给UART单位,UART里面的移位器,依次将数据发送出去,在发送完成后产生中断提醒CPU传输完成。

接收数据时,获取接收引脚的电平,逐位放进接收移位器,再放入FIFO,写入内存。在接收完成后产生中断提醒CPU传输完成。

波特率发生
每个 UART 的波特率发生器为发送器和接受器提供串行时钟。波特率发生器的源时钟可以选择 S3C2440A 的内部系统时钟或 UEXTCLK。换句话说,分频由设置 UCONn 的时钟选项选择。波特率时钟是通过 16 和由 UART波特率分频寄存器(UBRDIVn)指定的 16 位分频系数来分频源时钟(PCLK,FCLK/n 或 UEXTCLK)产生的。
UBRDIVn 由下列表达式决定:
UBRDIVn = (int)( UART 时钟 / ( 波特率 × 16) ) - 1
例如,如果波特率为 115200 bps 并且 UART 时钟为 40 MHz,则 UBRDIVn 为:
UBRDIVn = (int)(40000000 / (115200 x 16) ) - 1
= (int)(21.7) - 1 [取最接近的整数]
= 22 - 1 = 21

**

编程

**
目的:实现串口初始化函数、发送一个字节函数、接收一个字节函数、发送字符串函数。

用到的特殊功能寄存器:
ARM串口(UART)的使用 (S3C2440)_第2张图片
ARM串口(UART)的使用 (S3C2440)_第3张图片
ARM串口(UART)的使用 (S3C2440)_第4张图片
ARM串口(UART)的使用 (S3C2440)_第5张图片
ARM串口(UART)的使用 (S3C2440)_第6张图片
ARM串口(UART)的使用 (S3C2440)_第7张图片
初始化函数:
1.要配置相应的GPIO引脚为串口功能。
2.设置方式(中断查询方式)、时钟源选择(PCLK)。
3.设置数据位、校验位、停止位。
4.设置波特率(配置UBRDIVn)。

/* 115200,8n1 */
void uart0_init()
{
	/* 配置GPH2、3为 TXD0、RXD0,并且开启上拉电阻 */
	GPHCON &= ~((3<<4) | (3<<6));
	GPHCON |=  ((2<<4) | (2<<6));
	GPHUP &= ~(3<<2);
	
	/* 配置UART CONTROL REGISTER,时钟源为PCLK,中断/查询方式 */
	UCON0 = 0x00000005;
	
	/* 配置UART LINE CONTROL REGISTER 为 8n1 */
	ULCON0 = 0x00000003;
	
	/* 配置UBRDIV0,波特率为115200,UBRDIVn = (int)( UART clock / ( buad rate x 16) ) –1 */
	UBRDIV0 = 26;
}

发送和接收函数则用到 状态寄存器UTRSTATn 和 发送缓冲寄存器UTXHn、接收缓冲寄存器URXHn。
具体代码如下:

int putchar(int c)
{
	while (!(UTRSTAT0 & (1<<2)));
	UTXH0 = (unsigned char)c;	
}

int getchar(void)
{
	while (!(UTRSTAT0 & (1<<0)));
	return URXH0;
}

int puts(const char *s)
{
	while (*s)
	{
		putchar(*s);
		s++;
	}
	
}

你可能感兴趣的:(ARM裸机,(JZ2440))