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

xiaoxiao2021-02-28  89

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); //接受字节函数 #endifs3c2451.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; }

转载请注明原文地址: https://www.6miu.com/read-42843.html

最新回复(0)