微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > S3C2440 UART串口驱动

S3C2440 UART串口驱动

时间:11-20 来源:互联网 点击:
接收数据错误中断[6]设置当接收数据时,如果产生异常,如传输中止,帧错误,校验错误时,是否产生接收状态中断信号:
0 =不产生错误状态中断1 =产生错误状态中断
0
回送模式[5]设置该位时UART会进入回送模式,该模式仅用于测试
0 =正常模式1 =回送模式
0
发送终止信号[4]设置该位时,UART会发送一个帧长度的终止信号,发送完毕后,该位自动恢复为0
0 =正常传输1 =发送终止信号
0
发送模式[3:2]设置采用哪个方式执行数据写入发送缓冲区
00 =无效
01 =中断请求或查询模式
10 = DMA0请求
00
接收模式[1:0]设置采用哪个方式执行数据写入接收缓冲区
00 =无效
01 =中断请求或查询模式
10 = DMA0请求
00
通常UART串口采用PCLK作为输入工作时钟,采用简单的轮询方式进行数据接收和发送,不开启数据接收超时,数据产生错误时不产生错误状态中断,因此:

UCON0 = 0x05;

表2-27 UART FIFO控制寄存器(UFCON0)
寄存器名地址是否读写描述复位默认值
UFCON00x50000008R/W串口0 FIFO控制寄存器0x00

UFCON0描述初始值
发送数据
触发级别
[7:6]设置FIFO发送模式的触发级别:
00 = FIFO为空触发01 = 16字节触发
10 = 32字节触发11 = 48字节触发
00
接收数据
触发级别
[5:4]设置FIFO接收模式的触发级别:
00 = FIFO为空触发01 = 16字节触发
10 = 32字节触发11 = 48字节触发
00
保留[3]0
发送FIFO重置[2]在重置FIFO后自动清除发送缓冲区
0 =正常模式1 =自动清除
0
接收FIFO重置[1]在重置FIFO后自动清除接收缓冲区
0 =正常模式1 =自动清除
0
启用FIFO[0]0 =不启用FIFO1 =启用FIFO0
表2-28 UART MODEM控制寄存器(UMCON0)
寄存器名地址是否读写描述复位默认值
UMCON00x5000000CR/W串口0MODEM控制寄存器0x00

UMCON0描述初始值
保留[7:5]必须全部置0000
AFC自动流控[4]0 =不开启流控1 =开启流控0
保留[3:1]必须全部置0000
请求发送[0]如果启用AFC,该位无效,S3C2440会自动控制nRTS,如果不启用AFC,nRTS必须由软件控制
0 =高电平激活nRTS1 =低电平激活nRTS
0

表2-29 UART发送/接收状态寄存器(UTRSTAT0)
寄存器名地址是否读写描述复位默认值
UTRSTAT00x50000010R/W串口0发送/接收状态寄存器0x06

UTRSTAT0描述初始值
发送器为空[2]当发送缓存寄存器中没有数据要发送且发送移位寄存器为空时,自动置1
0 =非空
1 =发送器为空(发送缓存和移位寄存器)
1
发送缓存寄存器为空[1]当发送缓存寄存器为空时,自动置1
0 =发送缓存寄存器非空
1 =发送缓存寄存器为空
1
接收缓存寄存器为空[0]当接收缓存寄存器有数据到达时,自动置1
0 =接收缓存寄存器为空
1 =缓存寄存器接收数据
0

表2-30 UART发送缓存寄存器(UTXH0)
寄存器名地址是否读写描述复位默认值
UTXH00x50000020(L)
0x50000023(B)
W串口0发送缓存寄存器-

表2-31 UART接收缓存寄存器(URXH0)
寄存器名地址是否读写描述复位默认值
URXH00x50000024(L)
0x50000027(B)
R串口0接收缓存寄存器-
表2-32 UART波特率除数寄存器(UBRdiv0)
寄存器名地址是否读写描述复位默认值
UBRdiv00x50000028R/W串口0波特率除数寄存器-

UBRdiv0描述初始值
波特率除数[15:0]设置波特率除数(大于0)使用外部输入时钟时可以置0-
上述寄存器是是和UART通信相关寄存器,使用简单的无FIFO,无自动流控AFC时,设置如下:

UFCON0 = 0x00;//不使用FIFO
UMCON0 = 0x00;//不使用流控
UBRdiv0 = 26;//波特率为115200,PCLK=50Mhz
UBRdiv0 = 53;//波特率为57600,PCLK=50Mhz
UBRdiv0 = 12;//波特率为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
DCD0x00000030;MRSRB6
DCD0x00000030;MRSRB7

END

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top