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).