s3c2451_uart.h
#ifndef _S3C2451_UART_H_
#define _S3C2451_UART_H_
#include "typedef.h"
#include "string.h"
#include "stdio.h"
#include "stdarg.h"
typedef struct
{
U32 ULCON; //线路控制寄存器,决定使用哪一个con口
U32 UCON; //控制寄存器
U32 UFCON; //FIFO控制寄存器
U32 UMCON; //MODEM控制寄存器
U32 UTRSTAT; //TX/RX状态寄存器
U32 UERSTAT; //错误状态寄存器
U32 UFSTAT; //FIFO状态寄存器
U32 UMSTAT; //MODEM状态寄存器
U32 UTXH; //发送缓冲寄存器
U32 URXH; //接受缓冲寄存器
U32 UBRDIV; //波特率分频寄存器-整数
U32 UDIVSLOT; //波特率分频寄存器-小数
}volatile *UART_MemMapPtr;
#define UART0_BASE_PTR ((UART_MemMapPtr)0x50000000) //每个UART的起始地址
#define UART1_BASE_PTR ((UART_MemMapPtr)0x50004000)
#define UART2_BASE_PTR ((UART_MemMapPtr)0x50008000)
#define UART3_BASE_PTR ((UART_MemMapPtr)0x5000C000)
typedef enum
{
UART0=0,
UART1,
UART2,
UART3
}UART_typedef; //定义每一个UART
typedef enum
{
wordwidth_5bit=0,
wordwidth_6bit,
wordwidth_7bit,
wordwidth_8bit
}WORDWIDTH_typedef; //定义传输的字长
typedef enum
{
stop_one=0,
stop_two
}STOP_typedef; //停止位的长度
typedef enum
{
parity_no=0,
parity_odd=4,
parity_even=5,
parity_one=6,
parity_zero=7
}PARITY_typedef; //奇偶校验
typedef enum
{
mode_rx=1, //接受模式
mode_tx=4, //发送模式
mode_rx_tx=5
}MODE_typedef; //
typedef struct
{
U32 baudrate;
WORDWIDTH_typedef wordwidth;
STOP_typedef stop;
PARITY_typedef parity;
MODE_typedef mode;
}UART_Init_typedef; //定义UART结构体
extern void uart_init(UART_typedef uartx,UART_Init_typedef uart_init_typedef); //UART初始化函数
extern void uart_senddata(UART_typedef uartx,U8 data); //发送字节函数
extern void uart_sendbuf(UART_typedef uartx,U8 *data,U8 len); //发送BUF函数
extern void uart_sendstring(UART_typedef uartx,U8 *string); //发送字符串函数
extern void uart_printf(char *fmt,...); //发送数组函数
extern U8 uart_receivedata(UART_typedef uartx); //接受字节函数
#endif
s3c2451.c
#include "s3c2451_uart.h"
UART_MemMapPtr const UART_BASE_PTR[4]={UART0_BASE_PTR,UART1_BASE_PTR,UART2_BASE_PTR,UART3_BASE_PTR}; //定义了UART数组,方便使用
void uart_init(UART_typedef uartx,UART_Init_typedef uart_init_typedef)
{
UART_BASE_PTR[uartx]->ULCON &=~(0x7f); //把前七位的寄存器清零
UART_BASE_PTR[uartx]->ULCON |=uart_init_typedef.wordwidth; //设置传输字长
UART_BASE_PTR[uartx]->ULCON |=(uart_init_typedef.stop<<2); //设置停止位
UART_BASE_PTR[uartx]->ULCON |=(uart_init_typedef.parity<<3); //设置奇偶校验位
if(uart_init_typedef.baudrate==115200) //115200传输速度设置
{
UART_BASE_PTR[uartx]->UBRDIV=34;
UART_BASE_PTR[uartx]->UDIVSLOT=0xDFDD;
}
if(uart_init_typedef.baudrate==9600) //9600传输速度设置
{
UART_BASE_PTR[uartx]->UBRDIV=428;
UART_BASE_PTR[uartx]->UDIVSLOT=0xDDD5;
}
UART_BASE_PTR[uartx]->UCON &=~(0xf); //寄存器清零
if(uart_init_typedef.mode==mode_rx) //接受模式
{
UART_BASE_PTR[uartx]->UCON |=uart_init_typedef.mode;
}
if(uart_init_typedef.mode==mode_tx) //发送模式
{
UART_BASE_PTR[uartx]->UCON |=uart_init_typedef.mode;
}
if(uart_init_typedef.mode==mode_rx_tx)
{
UART_BASE_PTR[uartx]->UCON |=uart_init_typedef.mode;
}
}
void uart_senddata(UART_typedef uartx,U8 data) //输出字节函数
{
UART_BASE_PTR[uartx]->UTXH=data;
while((UART_BASE_PTR[uartx]->UTRSTAT)==0);
}
void uart_sendbuf(UART_typedef uartx,U8 *data,U8 len) //发送BUF函数
{
unsigned char i;
for(i=0;i<len;i++)
{
uart_senddata(uartx,data[i]);
}
}
void uart_printf(char *fmt,...) //发送字符串函数
{
va_list ap;
char string[1024];
va_start(ap,fmt);
vsprintf(string,fmt,ap);
va_end(ap);
uart_sendstring(UART0,(U8*)string);
}
void uart_sendstring(UART_typedef uartx,U8 *string) //发送数组函数
{
U32 len=strlen((char *)string);
uart_sendbuf(uartx,string,len);
}
U8 uart_receivedata(UART_typedef uartx) //接受字节函数
{
return UART_BASE_PTR[uartx]->URXH;
}