mini2440硬件篇之UART



通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),通常称作UART,是一种异步收发传输器UART以全双工方式传输数据,最简单的连线只有2根,TxD用于发送,RxD用于接收,Gnd地。UART使用标准的TTL电平(0~3.3V或0~5V),表示高低电平,为了增加抗干扰能力,增加传输长度,通常将TTL电平转换为RS-232电平。3~12V表示0,-3~-12表示1。

平常数据引脚处于空闲1状态,发送数据时,TxD变低电平,表示一个起始信号然后后面可以跟5、6、7、8位的数据,LSB低位优先。如果使用校验,数据发完后再发送一个校验位,最后发送1、2位停止位。

 

1. 芯片手册

2. mini2440电路图

 

3. S3C2440寄存器

对于s3c2440来说,它3个UART,配置过程如下。

对应的GPIO引脚设置成UART引脚。

ULCON LINE寄存器,配置校验、数据位、停止位。

UCON 控制寄存器,可以配置时钟源,中断或查询方式,不使用DMA。

UFCON FOFO寄存器,不使用FIFO

UMCON MODEM寄存器,不使用流控。

UTRSTAT 状态寄存器,只读,读取UART状态

UERSTAT 错误寄存器,也是只读。

UFSTAT FIFO的状态寄存器,也是只读。

UMSTAT MODEM状态寄存器,只读。

UTXH 发送缓冲区。

URXH 接收缓冲区。

UBRDIV 波特率设置寄存器

uart.h

/*******************************************************************
 * Copyright (C),2011-2012, XXX.
 * FileName: uart.h 
 * Author:HuangYinqing
 * Version:1.0
 * Date::2012-04-22
 * Description:串口0驱动.
 * Function List:
 * History:
 ******************************************************************/
#ifndef __UART_H__
#define __UART_H__

#define PCLK	50000000	//50M
#define UART_CLK PCLK
#define UART_BAUD_RATE 115200
#define UART_BRD ((int)(UART_CLK/(UART_BAUD_RATE*16))-1)

#define TXD0READY (1<<2)
#define RXD0READY (1)

/*函数声明*/
void Uart0Init(void);
unsigned char Uart0GetChar(void);
void Uart0SendString(char *pucStr) ;
void Uart0SendData(char *pucStr, int ulCount) ;

#endif

uart.c

/*******************************************************************
 * Copyright (C),2011-2012, XXX.
 * FileName: uart.c 
 * Author:HuangYinqing
 * Version:1.0
 * Date::2012-04-22
 * Description:串口0驱动.
 * Function List:
 * History:
 ******************************************************************/
#include "common.h"
#include "uart.h"


/********************************************************************
函数功能:发送一个字符。
入口参数:
	ucChar:待发送的字符
返    回:无。
备    注:无。
********************************************************************/
void Uart0PutChar(unsigned char ucChar)
{
	while( !( rUTRSTAT0 & TXD0READY ) );//发送一个字节
	rUTXH0 = ucChar;
}

/********************************************************************
函数功能:接收一个字符。
入口参数:无。
返    回:接收的字符。
备    注:无。
********************************************************************/
unsigned char Uart0GetChar(void)
{
	while( !( rUTRSTAT0 & RXD0READY ) ); //接收一个字节
	return rURXH0;
}

/********************************************************************
函数功能:发送字符串。
入口参数:
	pucStr:待发送的字符串指针。
返    回:无。
备    注:无。
********************************************************************/
void Uart0SendString(char *pucStr) 
{ 
	while( (*pucStr) != '\0' ) 
	{ 
	  Uart0PutChar(*pucStr++);
	} 
}

/********************************************************************
函数功能:发送指定长度数据。
入口参数:
	pucStr:待发送的字符串指针。
	ulCount:待发送的字节数。
返    回:无。
备    注:无。
********************************************************************/
void Uart0SendData(char *pucStr, int ulCount) 
{ 
	while(ulCount--) 
	{ 
	  Uart0PutChar(*pucStr++);
	}
}

/********************************************************************
函数功能:串口0中断函数。
入口参数:无。
返    回:无。
备    注:无。
********************************************************************/
static void __irq Uart0Handler(void) 
{ 
	char ch;
	
	ClearSubPending(BIT_SUB_RXD0);
	ClearPending(BIT_UART0); 
	
	while(rUTRSTAT0 & 1)	//==接收缓冲区有数据
	{
		ch = rURXH0;
		rUTXH0 = ch;
	}
} 

/********************************************************************
函数功能:串口0初始化函数。
入口参数:无。
返    回:无。
备    注:无。
********************************************************************/
void Uart0Init(void)
{
	rGPHCON &=  ~(0xf<<4); 
	rGPHCON |= 0xa<<4;    //==GPH2,GPH3用作TXD0,RXD0
	rGPHUP |= 3<<2;       //==GPH2,GPH3内部上拉
	
	rULCON0 = (0x03<<0);  //==数据格式:数据位为8位,1位停止,无奇偶校验,不使用红外
	rUCON0=(1<<0)|(1<<2); //==允许查询或中断方式,不使用DMA通道
	rUFCON0=0x00;         //==不使用FIFO
	rUMCON0=0x00;         //==不使用流控
	rUBRDIV0=UART_BRD;    //==设置波特率为115200kb/s
	
	pISR_UART0=(unsigned int)Uart0Handler;  //==串口收中断函数
	rINTMOD &= ~BIT_UART0;					//==普通中断模式
	rINTMSK &= ~BIT_UART0;                  //==打开中断屏蔽
	rINTSUBMSK &= ~BIT_SUB_RXD0;			//==打开接收子中断屏蔽
}
//


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值