ARM的串口配置

“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{uart_send(uartx,data[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);


你可能感兴趣的:(ARM)