S3C2440 UART串口驱动3
扫描二维码
随时随地手机看文章
表2-28 UART MODEM控制寄存器(UMCON0)
寄存器名
地址
是否读写
描述
复位默认值
UMCON0
0x5000000C
R/W
串口0MODEM控制寄存器
0x00
UMCON0
位
描述
初始值
保留
[7:5]
必须全部置0
000
AFC自动流控
[4]
0 =不开启流控1 =开启流控
0
保留
[3:1]
必须全部置0
000
请求发送
[0]
如果启用AFC,该位无效,S3C2440会自动控制nRTS,如果不启用AFC,nRTS必须由软件控制
0 =高电平激活nRTS1 =低电平激活nRTS
0
表2-29 UART发送/接收状态寄存器(UTRSTAT0)
寄存器名
地址
是否读写
描述
复位默认值
UTRSTAT0
0x50000010
R/W
串口0发送/接收状态寄存器
0x06
UTRSTAT0
位
描述
初始值
发送器为空
[2]
当发送缓存寄存器中没有数据要发送且发送移位寄存器为空时,自动置1
0 =非空
1 =发送器为空(发送缓存和移位寄存器)
1
发送缓存寄存器为空
[1]
当发送缓存寄存器为空时,自动置1
0 =发送缓存寄存器非空
1 =发送缓存寄存器为空
1
接收缓存寄存器为空
[0]
当接收缓存寄存器有数据到达时,自动置1
0 =接收缓存寄存器为空
1 =缓存寄存器接收数据
0
表2-30 UART发送缓存寄存器(UTXH0)
寄存器名
地址
是否读写
描述
复位默认值
UTXH0
0x50000020(L)
0x50000023(B)
W
串口0发送缓存寄存器
-
表2-31 UART接收缓存寄存器(URXH0)
寄存器名
地址
是否读写
描述
复位默认值
URXH0
0x50000024(L)
0x50000027(B)
R
串口0接收缓存寄存器
-
表2-32 UART波特率除数寄存器(UBRDIV0)
寄存器名
地址
是否读写
描述
复位默认值
UBRDIV0
0x50000028
R/W
串口0波特率除数寄存器
-
UBRDIV0
位
描述
初始值
波特率除数
[15:0]
设置波特率除数(大于0)使用外部输入时钟时可以置0
-
上述寄存器是是和UART通信相关寄存器,使用简单的无FIFO,无自动流控AFC时,设置如下:
不使用FIFO
不使用流控
波特率为115200,PCLK=50Mhz
波特率为57600,PCLK=50Mhz
波特率为57600,PCLK=12Mhz
UTXH0和URXH0分别是数据发送和接收寄存器,发送数据时通过轮询方式判断发送状态寄存器的状态,当可以发送数据时,执行UTXH0寄存器写入操作,接收数据时,以轮询方式检测接收状态寄存器状态,当有数据到达时,读取URXH0寄存器里的数据即可取得串口数据。
#defineTXD0READY(1<<2)//发送数据状态OK
#defineRXD0READY(1)//接收数据状态OK
/* UART串口单个字符打印函数*/
extern void putc(unsigned char c)
{
while( ! (UTRSTAT0 & TXD0READY) );
UTXH0 = c;
}
/* UART串口接受单个字符函数*/
extern unsigned char getc(void)
{
while( ! (UTRSTAT0 & RXD0READY) );
return URXH0;
}
1.1.6UART串口驱动实验init.s:本程序文件对看门狗,内存等基本硬件做初始化,然后跳入到xmain.c中的xmain函数执行。
;
; UART串口实验
;
GPBCONEQU0x56000010
GPBDATEQU0x56000014
AREA Init, CODE, READONLY
ENTRY
start
; close watchdog
ldr r0, = 0x53000000;将看门狗控制寄存器地址放入r0
mov r1, #0
str r1, [r0];设置看门狗控制寄存器的值为0
bl initmem;跳转到initmem代码段,初始化内存
IMPORT xmain;引入main.c中的xmain函数
ldr sp, =0x34000000;调用C程序之前先初始化栈指针
ldr lr, =loop;设置xmain函数的返回地址
ldr pc, =xmain;跳转到C程序中的xmain函数的入口处执行
loop
b loop;死循环
initmem;内存初始化
ldr r0, =0x48000000;加载内存相关寄存器首地址r0
ldr r1, =0x48000034;加载内存相关寄存器尾地址到r1
adr r2, memdata;将寄存器配置数据地址段首地址加载到r2
initmemloop
ldr r3, [r2], #4;循环设置存寄存器
str r3, [r0], #4
teq r0, r1
bne initmemloop;循环到最后一个寄存器时退出函数
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