基于ARM--s3c2451的函数封装---UART封装

本文详细介绍了如何针对ARM处理器S3C2451进行UART(通用异步收发传输器)的函数封装,主要内容涵盖s3c2451_uart.h头文件中的定义和配置方法。
摘要由CSDN通过智能技术生成

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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值