“uart.c”:
#include "s2351_uart.h"
#include "string.h"
#include "stdarg.h"
#include "stdio.h"
#include "s3c2451_vector.h"
UART_Memptr constUART_BASE_PTR[4]={UART0_BASE_PTR,UART1_BASE_PTR,UART2_BASE_PTR,UART3_BASE_PTR};
void UART_INIT(UART_typedef uartx,UART_init_typedef uart_init_typedef) //初始化函数数据位,停止位,校验位
{
UART_BASE_PTR[uartx]->ULCON &= ~(0x7f); //0~6位初始化为0,0x7f为0111 1111
UART_BASE_PTR[uartx]->ULCON |=uart_init_typedef.wordwith; //数据位
UART_BASE_PTR[uartx]->ULCON |=(uart_init_typedef.stop<<2); //停止位
UART_BASE_PTR[uartx]->ULCON |=(uart_init_typedef.parity<<3); //校验位
//波特率的选择
if(uart_init_typedef.bobit == 115200)
{
UART_BASE_PTR[uartx]->UBRDIV = 34;
UART_BASE_PTR[uartx]->UDIVSLOT = 0xDFDD;
}
if(uart_init_typedef.bobit == 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_send(UART_typedef uartx,U8 data)
{
UART_BASE_PTR[uartx]->UTXH = data; //将要发送的数据存放到这个串口模块的发送寄存器中
while((UART_BASE_PTR[uartx]->UTRSTAT &0x4)==0); //判断停止位的位置,遇到停止位,跳出循环,数据发送完毕
}
void uart_sendbuf(UART_typedef uartx,U8 *data,U8 len)
{
unsigned char i;
for(i = 0;i
}
void uart_sendstring(UART_typedef uartx,U8 *string) //字符串发送函数
{
U32 len = strlen((char*)string);
uart_sendbuf(uartx,string,len);
}
void uart_printf(char *fmt,...) //串函数打印口
{
va_list ap; //va_list 是C语言中解决变量问题的一组宏,变参可以是个数不固定,也可以是类型不固定
char string[1024];
va_start(ap,fmt); //ap初始化,fmt是最后一个可见的参数
vsprintf(string,fmt,ap); //将格式化的字符串存到string
va_end(ap);
}
U8 uart_receive(UART_typedef uartx)
{return UART_BASE_PTR[uartx]->URXH;}
void UART_interrupt_IRQ(UART_typedef uartx,U32 addr)
{
switch (uartx)
{
case UART0 :pISR_UART0 = addr;break;
case UART1 :pISR_UART1 = addr;break;
case UART2 :pISR_UART2 = addr;break;
case UART3 :pISR_UART3 = addr;break;
default :break;
}
}
"uart.h":
#ifndef _S2351_UART_H
#define _S2351_UART_H
#include "typedef.h"
#include "stdarg.h"
#include "stdio.h"
//串口用到的所有寄存器放到一个结构体里
typedef struct {
U32 ULCON;
U32 UCON;
U32 UFCON;
U32 UMCON;
U32 UTRSTAT;
U32 UERSTAT;
U32 UFSTAT;
U32 UMSTAT;
U32 UTXH;
U32 URXH;
U32 UBRDIV;
U32 UDIVSLOT;
} volatile *UART_Memptr;
#define UART0_BASE_PTR ((UART_Memptr)0x50000000)
#define UART1_BASE_PTR ((UART_Memptr)0x50004000)
#define UART2_BASE_PTR ((UART_Memptr)0x50008000)
#define UART3_BASE_PTR ((UART_Memptr)0x5000c000)
//串口的枚举
typedef enum {
UART0=0,
UART1,
UART2,
UART3
} UART_typedef;
//字节长度的枚举
typedef enum {
wordwith_5bit = 0,
wordwith_6bit,
wordwith_7bit,
wordwith_8bit
} WORDWITH_typedef;
//停止位的枚举
typedef enum {
stop_one = 0,
stop_two
} STOP_typedef;
//校验位的枚举
typedef enum {
parity_no = 0,
parity_odd = 4,
parity_even,
parity_one,
parity_zero
} PARITY_typedef;
//模式方式的枚举
typedef enum {
mode_rx = 1,
mode_tx = 4,
mode_rx_tx
} MODE_typedef;
typedef struct {
U32 bobit; //波特率
WORDWITH_typedef wordwith;
STOP_typedef stop;
PARITY_typedef parity;
MODE_typedef mode;
} UART_init_typedef;
extern void UART_INIT(UART_typedef uartx,UART_init_typedef uart_init_typedef); //串口初始化函数(选择串口,重命名)
extern void uart_send(UART_typedef uartx,U8 data); //串口号和需要发送的数据
extern U8 uart_receive(UART_typedef uartx);
extern void uart_sendbuf(UART_typedef uartx,U8 *data,U8 len);
extern void uart_sendstring(UART_typedef uartx,U8 *string);
extern void uart_printf(char *fmt,...);
extern void UART_interrupt_IRQ(UART_typedef uartx,U32 addr);