S3C2440 UART串口驅(qū)動(dòng)3
表2-28 UART MODEM控制寄存器(UMCON0)
寄存器名
地址
是否讀寫
描述
復(fù)位默認(rèn)值
UMCON0
0x5000000C
R/W
串口0MODEM控制寄存器
0x00
UMCON0
位
描述
初始值
保留
[7:5]
必須全部置0
000
AFC自動(dòng)流控
[4]
0 =不開啟流控1 =開啟流控
0
保留
[3:1]
必須全部置0
000
請(qǐng)求發(fā)送
[0]
如果啟用AFC,該位無效,S3C2440會(huì)自動(dòng)控制nRTS,如果不啟用AFC,nRTS必須由軟件控制
0 =高電平激活nRTS1 =低電平激活nRTS
0
表2-29 UART發(fā)送/接收狀態(tài)寄存器(UTRSTAT0)
寄存器名
地址
是否讀寫
描述
復(fù)位默認(rèn)值
UTRSTAT0
0x50000010
R/W
串口0發(fā)送/接收狀態(tài)寄存器
0x06
UTRSTAT0
位
描述
初始值
發(fā)送器為空
[2]
當(dāng)發(fā)送緩存寄存器中沒有數(shù)據(jù)要發(fā)送且發(fā)送移位寄存器為空時(shí),自動(dòng)置1
0 =非空
1 =發(fā)送器為空(發(fā)送緩存和移位寄存器)
1
發(fā)送緩存寄存器為空
[1]
當(dāng)發(fā)送緩存寄存器為空時(shí),自動(dòng)置1
0 =發(fā)送緩存寄存器非空
1 =發(fā)送緩存寄存器為空
1
接收緩存寄存器為空
[0]
當(dāng)接收緩存寄存器有數(shù)據(jù)到達(dá)時(shí),自動(dòng)置1
0 =接收緩存寄存器為空
1 =緩存寄存器接收數(shù)據(jù)
0
表2-30 UART發(fā)送緩存寄存器(UTXH0)
寄存器名
地址
是否讀寫
描述
復(fù)位默認(rèn)值
UTXH0
0x50000020(L)
0x50000023(B)
W
串口0發(fā)送緩存寄存器
-
表2-31 UART接收緩存寄存器(URXH0)
寄存器名
地址
是否讀寫
描述
復(fù)位默認(rèn)值
URXH0
0x50000024(L)
0x50000027(B)
R
串口0接收緩存寄存器
-
表2-32 UART波特率除數(shù)寄存器(UBRDIV0)
寄存器名
地址
是否讀寫
描述
復(fù)位默認(rèn)值
UBRDIV0
0x50000028
R/W
串口0波特率除數(shù)寄存器
-
UBRDIV0
位
描述
初始值
波特率除數(shù)
[15:0]
設(shè)置波特率除數(shù)(大于0)使用外部輸入時(shí)鐘時(shí)可以置0
-
上述寄存器是是和UART通信相關(guān)寄存器,使用簡(jiǎn)單的無FIFO,無自動(dòng)流控AFC時(shí),設(shè)置如下:
不使用FIFO
不使用流控
波特率為115200,PCLK=50Mhz
波特率為57600,PCLK=50Mhz
波特率為57600,PCLK=12Mhz
UTXH0和URXH0分別是數(shù)據(jù)發(fā)送和接收寄存器,發(fā)送數(shù)據(jù)時(shí)通過輪詢方式判斷發(fā)送狀態(tài)寄存器的狀態(tài),當(dāng)可以發(fā)送數(shù)據(jù)時(shí),執(zhí)行UTXH0寄存器寫入操作,接收數(shù)據(jù)時(shí),以輪詢方式檢測(cè)接收狀態(tài)寄存器狀態(tài),當(dāng)有數(shù)據(jù)到達(dá)時(shí),讀取URXH0寄存器里的數(shù)據(jù)即可取得串口數(shù)據(jù)。
#defineTXD0READY(1<<2)//發(fā)送數(shù)據(jù)狀態(tài)OK
#defineRXD0READY(1)//接收數(shù)據(jù)狀態(tài)OK
/* UART串口單個(gè)字符打印函數(shù)*/
extern void putc(unsigned char c)
{
while( ! (UTRSTAT0 & TXD0READY) );
UTXH0 = c;
}
/* UART串口接受單個(gè)字符函數(shù)*/
extern unsigned char getc(void)
{
while( ! (UTRSTAT0 & RXD0READY) );
return URXH0;
}
1.1.6UART串口驅(qū)動(dòng)實(shí)驗(yàn)init.s:本程序文件對(duì)看門狗,內(nèi)存等基本硬件做初始化,然后跳入到xmain.c中的xmain函數(shù)執(zhí)行。
;
; UART串口實(shí)驗(yàn)
;
GPBCONEQU0x56000010
GPBDATEQU0x56000014
AREA Init, CODE, READONLY
ENTRY
start
; close watchdog
ldr r0, = 0x53000000;將看門狗控制寄存器地址放入r0
mov r1, #0
str r1, [r0];設(shè)置看門狗控制寄存器的值為0
bl initmem;跳轉(zhuǎn)到initmem代碼段,初始化內(nèi)存
IMPORT xmain;引入main.c中的xmain函數(shù)
ldr sp, =0x34000000;調(diào)用C程序之前先初始化棧指針
ldr lr, =loop;設(shè)置xmain函數(shù)的返回地址
ldr pc, =xmain;跳轉(zhuǎn)到C程序中的xmain函數(shù)的入口處執(zhí)行
loop
b loop;死循環(huán)
initmem;內(nèi)存初始化
ldr r0, =0x48000000;加載內(nèi)存相關(guān)寄存器首地址r0
ldr r1, =0x48000034;加載內(nèi)存相關(guān)寄存器尾地址到r1
adr r2, memdata;將寄存器配置數(shù)據(jù)地址段首地址加載到r2
initmemloop
ldr r3, [r2], #4;循環(huán)設(shè)置存寄存器
str r3, [r0], #4
teq r0, r1
bne initmemloop;循環(huán)到最后一個(gè)寄存器時(shí)退出函數(shù)
mov pc,lr
memdata
DCD0x22000000;BWSCON
DCD0x00000700;BANKCON0
DCD0x00000700;BANKCON1
DCD0x00000700;BANKCON2
DCD0x00000700;BANKCON3
DCD0x00000700;BANKCON4
DCD0x00000700;BANKCON5
DCD0x00018005;BANKCON6
DCD0x00018005;BANKCON7
DCD0x008e07a3;REFRESH
DCD0x000000b1;BANKSIZE