通用异步收发传输器(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位停止位。
芯片手册
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; //==打开接收子中断屏蔽
}
//
上一篇:mini2440硬件篇之IIC
下一篇:mini2440硬件篇之DMA
推荐阅读最新更新时间:2024-03-16 15:22