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

来源:互联网 发布:网络服务器机柜厂家 编辑:程序博客网 时间:2024/06/05 12:41

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;       //定义每一个UARTtypedef 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;}


原创粉丝点击