S3C6410 通用异步接收和发送器( UART)提供了四个独立的异步串行I / O(SIO)端口.每个异步串行 I/O(SIO)端口通过中断或者直接存储器存取(DMA)模式来操作。换句话说,UART 是通过产生一个中断或 DMA 请求,在 CPU 和 UART 之间传输数据的。该UART使用系统时钟的时间可以支持的比特率最高115.2kb/s。如果一外部设备提供 ext_uclk0 或 ext_uclk1 ,则UART可以以更高的速度运行每个UAR 的通道包含了两个 64 字节收发 FIFO 存储器。
该S3C6410的UART包括可编程波特率,红外线( IR )的传送/接收,一个或两个停止位插入,5位, 6位,7位或8位数据的宽度和奇偶校验。
下面我们使用channel 0实现一个简单的通过UART向终端发送字符的程序来了解其基本功能。
没有选择使用FIFO功能,数据格式选择8N1,波特率选择115200。
8N1:8个数据位,1个停止位,没有校检位。
115200:每个周期可发送115200个数据位。
程序运行环境为选择从Nand flash启动,所以要先关闭好看门狗,并将系统时钟设置为533MHz, PCLK为66MHz.
/***************************usrt.S*******************************/ (实现了基本的寄存器配置和一个简单的mputc函数)
#include <uart.h> //此处头文件只是简单的将寄存器地址定义为宏,方便使用而已,并没有附上头文件。
#include <gpio.h>
.text
.align 2
.global uart_init
uart_init:
ldr r0, =GPACON //将GPA0和GPA1设置为UART RXD[0]和UART TXD[0]
ldr r1, [r0]
orr r1, r1, #0x22
str r1, [r0]
ldr r0, =ULCON0 //配置UART 0 通道行控制寄存器并设置数据格式为8N1
mov r1, #((3<<3)|3)
str r1, [r0]
ldr r0, =UCON0 //选择时钟源为PCLK
ldr r1, =(2<<10)
str r1, [r0]
ldr r0, =UBRDIV0 //设置波特率为115200
mov r1, #34
str r1, [r0]
ldr r0, =UDIVSLOT0
ldr r1, =0xdfdd
str r1, [r0]
ldr r0, =UCON0 //设置工作模式为轮询或中断
ldr r1, [r0]
orr r1, r1, #0x5
str r1, [r0]
mov pc, lr
.align 2
.global mputc
mputc: //mputc函数, r0为接受的参数。
ldr r1, =UTXH0
str r0, [r1]
ldr r0, =UTRSTAT0
1:
ldr r1, [r0]
tst r1, #(1<<2)
beq 1b
mov pc, lr
/***************************start.S******************************/ 向终端发出a-z字符
.text
.align 2
.global _start
_start:
bl set_port //通知协处理器外设地址
bl close_wtd //关闭看门狗
bl clock_init_533 //初始化系统时钟
bl uart_init
mov r4, #'a'
1:
cmp r4, #'z'
bgt 1f
mov r0, r4
bl mputc
add r4, #1
b 1b
1:
loop:
b loop
.align 2
.global set_port
set_port:
ldr r0, =0x70000013
mcr p15, 0, r0, c15, c2, 4
mov pc, lr
.text
.align 2
.global close_wtd
close_wtd:
ldr r0, =WTCON
ldr r1, [r0]
bic r1, r1, #1
str r1, [r0]
mov pc, lr
由于选择nand flash启动,所以必须关闭看门狗,设置系统时钟并通知CPU外设地址范围,设置系统时钟的代码并没有附上。编译成二进制文件后将其烧到nand flash并选择从nand flash启动即可看到终端上输出a-z(需连接minicom).