UART:通用异步收发器(Universal Asynchronous Receiver and Transmitter),简称串口。主要用于:markdown
例如:115200 8n1
,它表示发送的波特率为115200,8个数据位,无校验位,1个中止位。也就是说:异步
1秒能传输115200位数据,即发送一位须要耗时t=1/115200秒。
每发送1byte数据,须要发送10位数据(开始位、数据位,中止位),耗时t=10/115200。
因此1秒钟能传输11520byte的数据。spa
最多见的UART串口都是采用TTL/CMOS
电平,即0V ~ 0.7V
表示逻辑0
,2V ~ 5V
表示逻辑1
。调试
在传输字符'A'
时,发送波形以下:code
但一般状况下,TTL电平知足不了长距离传输的要求,此时就引入RS-232
电平,当电平在 +3V ~ +12V
时,表示逻辑0,当电平在 -3V ~ -12V
时,表示逻辑1。orm
经过查阅芯片手册第11章UART,知道S3C2440支持3个Uart口。引脚以下get
而后查看JZ2440电路图,能够知道USB串口采用的是UART0。string
因此咱们能够经过配置UART0,来打印调试信息。it
首先,咱们配置GPH二、GPH3为串口引脚,并使能其上拉电阻。io
//设置引脚用于串口
//GPH2,3用于TxD0,RxD0
GPHCON &= ~((3<<4)|(3<<6));
GPHCON |= ((2<<4)|(2<<6));
//使能内部上拉
GPHUP &= ~((1<<2)|(1<<3));
复制代码
咱们经过设置UBRDIVn分频,能够分频串口的时钟,来知足咱们所指望的波特率。公式以下:
UBRDIVn = (int)( UART clock / ( buad rate x 16) ) –1
芯片手册也给了例子,但咱们在上一章中,咱们将PCLK设置为50MHz,因此咱们代入上式,获得UBRDIVn=26
。即此时UART clock为50MHz,波特率为115200。
此时,咱们重点关注,如何将PCLK设置为UART clock。
这里设置UCON0[11:10]为00或10,让UART clock等于PCLK的50MHz。
而后指定UCON0[3:2]和UCON0[1:0]为01,开启中断或查询模式。
//设置波特率
//UBRDIVn = (int)(UART clock / (buad rate x 16)) - 1
//UART clock = 50M
//UBRDIVn = 26
//PCLK,中断/查询模式
UCON0 = 0x00000005;
UBRDIV0 = 26;
复制代码
常见的数据格式为8n1,即8个数据位,无校验位,一个中止位。
//设置数据格式
ULCON0 = 0x00000003;//8n1
复制代码
当UTRSTATn[2]=1时,表示发送buffer和移位控制器都是空的,此时能够继续发送数据。
当UTRSTATn[0]=1时,表示接收buffer中有数据,此时能够进行读取数据。
咱们只需将数据存入UTXHn寄存器中,数据将会被UART自动发送出去。同时经过读取URXHn寄存器,来读取UART接收到的数据。
uart.c
#include "s3c2440_soc.h"
#include "uart.h"
void uart_init() {
//设置引脚用于串口
//GPH2,3用于TxD0,RxD0
GPHCON &= ~((3<<4)|(3<<6));
GPHCON |= ((2<<4)|(2<<6));
//使能内部上拉
GPHUP &= ~((1<<2)|(1<<3));
//设置波特率
//UBRDIVn = (int)(UART clock / (buad rate x 16)) - 1
//UART clock = 50M
//UBRDIVn = 26
//PCLK,中断/查询模式
UCON0= 0x00000005;
UBRDIV0 = 26;
//设置数据格式
ULCON0 = 0x00000003;//8n1
}
int uart_putchar(int c) {
while(!(UTRSTAT0 & (1<<2)));
UTXH0 = (unsigned char)c;
}
int uart_getchar(void) {
while(!(UTRSTAT0 & (1<<0)));
return URXH0;
}
int uart_puts(const char *s) {
while(*s) {
uart_putchar(*s);
s++;
}
}
复制代码
main.c
#include "uart.h"
int main(void) {
unsigned char c;
uart_init();
uart_puts("Hello, world!\n\r");
while(1)
{
c = uart_getchar();
uart_putchar(c);
}
return 0;
}
复制代码
修改s3c2440_soc.h
......
#define __REG(x) (*(volatile unsigned int *)(x))
#define __REG_BYTE(x) (*(volatile unsigned char *)(x))
......
#define UTXH0 __REG_BYTE(0x50000020) //UART 0 transmission hold
#define URXH0 __REG_BYTE(0x50000024) //UART 0 receive buffer
......
复制代码