1、初始化:
a、把使用到的引脚GPH2、GPH3定义为TXD0、RXD0:
GPHCON |= 0xa0
GPHUP |= 0xf0(禁止上拉)
b.ULCON0 ( UART channel 0 line control register ):设为0x03
此值含义为:8个数据位,1个停止位,无校验,正常操作模式(与之相对的是Infra-Red Mode,此模式表示0、1的方式比较特殊)。
c.UCON0 (UART channel 0 control register ):设为0x5
除了位[3:0],其他位都使用默认值。位[3:0]=0b0101表示:发送、接收都使用“中断或查询方式”——本实验使用查询查询方式。
d.UFCON0 (UART channel 0 FIFO control register ):设为0x00
每个UART内部都有一个16字节的发送FIFO和接收FIFO,但是本实验不使用FIFO,设为默认值0
e.UMCON0 (UART channel 0 Modem control register ):设为0x00
本实验不使用流控,设为默认值0
f.UBRDIV0 ( R/W Baud rate divisior register 0 ):设为26
本实验未使用PLL, PCLK=50MHz,设置波特率为115200,则由公式
UBRDIVn = (int)(PCLK / (bps x 16) ) –1
可以计算得UBRDIV0 =26,请使用S3C2440数据手册第314页的误差公式验算一下此波特率是否在可容忍的误差范围之内,如果不在,则需要更换另一个波特率。
2、发送数据:
a.UTRSTAT0 ( UART channel 0 Tx/Rx status register ):
位[2]:无数据发送时,自动设为1。当我们要使用串口发送数据时,先读此位以判断是否有数据正在占用发送口。
位[1]:发送FIFO是否为空,本实验未用此位
位[0]:接收缓冲区是否有数据,若有,此位设为1。本实验中,需要不断查询此位一判断是否有数据已经被接收,中断模式下等待中断触发。
b.UTXH0 (UART channel 0 transmit buffer register ):把要发送的数据写入此寄存器。
3、接收数据:
a.UTRSTAT0:如同上述“2、发送数据”所列,我们用到位[0]
b.URXH0 (UART channel 0 receive buffer register ):
当查询到UTRSTAT0 位[0]=1时,读此寄存器获得串口接收到的数据。
#define
#include <stdlib.h>
#include <string.h>
#include "def.h"
#include "option.h"
#include "2440addr.h"
#include "2440lib.h"
#include "2440slib.h"
#include "mmu.h"
#include "profile.h"
#include "memtest.h"
#define LED1_ON
#define LED1_OFF
void delay(int times)//延时函数
{
}
void Led_port_init(void)
{
}
void beep_init(void)//蜂鸣器初始化
{
}
void beep(void)
{
}
void Uart0_init(void)
{
}
void Main(void)
{
while(1)
{
}
}
以下为中断方式:
#define
#include <stdlib.h>
#include <string.h>
#include "def.h"
#include "option.h"
#include "2440addr.h"
#include "2440lib.h"
#include "2440slib.h"
#include "mmu.h"
#include "profile.h"
#include "memtest.h"
#define LED1_ON
#define LED1_OFF
void delay(int times)//延时函数
{
}
void Led_port_init(void)//设置GPB5为输出端口
{
}
void beep_init(void)//蜂鸣器初始化
{
}
void beep(void)
{
}
void Uart0_init(void)
{
}
void inte_init()
{
}
void __irq uartISP(void)//中断处理函数
{
}
void Main(void)//主函数
{
}