找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4165|回复: 1
打印 上一主题 下一主题
收起左侧

2440裸机编程之八 UART通用异步收发

[复制链接]
跳转到指定楼层
楼主
ID:68618 发表于 2014-11-12 13:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
S3C2440A 内部集成的UART(通用异步收发器)单元提供三个独立的异步串行I/O端口,也就是通常所说的串口。串口是用途广泛的通讯口,很多工业现场总线都以串口为基础。在这里,串口不仅可以用来与外部设备进行数据通讯,还可以用来观察系统的运行状况,例如前面已经使用过的利用串口终端工具观察程序运行情况的方法。 S3C2440A 的UART 单元提供三个独立的异步串行I/O 端口,每个都可以在中
断或DMA 两种模式下工作。它们支持的最高波特率为115. 2 kbps。每个UART 通道包含2 个64 位FIFO 分别供接收和发送使用。
S3C2440A 的UART 具有以下可配置的参数项目:可编程的波特率,红外收/发模式,l 或2 个停止位,5 位、6 位、7 位或8 位数据宽度和奇偶校验位。每个UART模块包含以下几个部件:波特率发生器,发送器,接收器和控制单元。波特率发生器可以以PCLK、FCLK或UEXTCLK作为时钟源。发送器和接收器包含64字节的FIFO和移位寄存器。要被发送的数据,首先被写入FIFO,然后被拷贝到发送移位寄存器中,最后从数据输出端口(TxDn)依次被移位输出。被接收的数据也同样从数据接收端口(RxDn)依次被移位输入到移位寄存器,然后被拷贝到FIFO中。




这里以uart0简单介绍它的使用。
ULCON0     用于选择 模式、校验、停止位、数据位
UCON0      用于使能 发送、接收
UBRDIV0    设置uart0波特率,波特率 = PCLK/(UBRDIV0+1) /16
UTRSTAT0   接收和发送完毕的标志,用于软件查询
URXH0      接收数据寄存器,存放接收到的数据
UTXH0      发送数据寄存器,用于发送

这是个uart0的简单收发程序:
//********************************************************************
#define bps 115200
char ch;
void Main(void)
{     
    int i;
    ……硬件初始化……

uart0_init();
Uart_Printf(" uart串口实验\n\n\n");
Uart_Printf(" 请发送一个字符\n");
while(1)
{
  ch=receive_byte();
  transmit_string("你刚发送了:");
  transmit_byte(ch);
  transmit_byte('\n');
}
}
void uart0_init(void)
{
rGPHCON = rGPHCON & ~(0xf<<4) | 2<<4 | 2<<6 ; //GPH2、3 选为 TXD、RXD
rUMCON0 = 0x0;         //关闭控制流功能
rULCON0 = 0<<6 | 0<<3 | 0<<2 | 3;    //普通模式、无校验、1位停止位、8位数据位
rUCON0  = 1<<2 | 1;        //发送模式:允许、接收模式:允许
rUBRDIV0=(U32)(PCLK/(bps*16))-1;    //设置波特率,pclk 为ARM 时钟频率,bps 为传输波特率
}
char receive_byte(void)   //接收一个字节
{
while(!(rUTRSTAT0&0x1)); //等待接收到数据
return rURXH0&0xff;   //返回数据
}

void transmit_byte(char data) //发送一个字节
{
while(!(rUTRSTAT0 & 0x2)); //等待发送缓存区为空
rUTXH0=data;    //发送数据
}

void transmit_string(char* p) //发送一个字符串
{
while(*p != '\0')
  transmit_byte(*p++);
}

//*******************************************************************

结果如图:




当然也可以用中断来处理,这里接收用中断做。
//********************************************************************
#define bps 115200
char ch;
void Main(void)
{     
    int i;
    ……硬件初始化……

uart0_init();
Uart_Printf(" uart串口实验\n\n\n");
Uart_Printf(" 请发送一个字符\n");
while(1); //等待中断
}
void uart0_init(void)
{
rGPHCON = rGPHCON & ~(0xf<<4) | 2<<4 | 2<<6 ; //GPH2、3 选为 TXD、RXD
rUMCON0 = 0x0;         //关闭控制流功能
rULCON0 = 0<<6 | 0<<3 | 0<<2 | 3;    //普通模式、无校验、1位停止位、8位数据位
rUCON0  = 1<<2 | 1;        //发送模式:允许、接收模式:允许
rUBRDIV0=(U32)(PCLK/(bps*16))-1;    //设置波特率,pclk 为ARM 时钟频率,baud 为传//输波特率



rSUBSRCPND = 1;      //SUBSRCPND的RXD0位 清0
rSRCPND = 1<<28;     //SRCPND的UART0位 清0
rINTPND = 1<<28;     //INTPND的UART0位 清0
pISR_UART0 = (U32)receive_int;  //申请中断向量
rINTSUBMSK = rINTSUBMSK & ~(1);  //禁止RXD0的屏蔽
rINTMSK = rINTMSK & ~(1<<28);  //禁止UART0的屏蔽
}
char receive_byte(void)   //接收一个字节
{
while(!(rUTRSTAT0&0x1)); //等待接收到数据
return rURXH0&0xff;   //返回数据
}

void transmit_byte(char data) //发送一个字节
{
while(!(rUTRSTAT0 & 0x2)); //等待发送缓存区为空
rUTXH0=data;    //发送数据
}

void transmit_string(char* p) //发送一个字符串
{
while(*p != '\0')
  transmit_byte(*p++);
}

void receive_int(void) __irq
{
transmit_string("(中断)你刚发送了:");
transmit_byte(rURXH0&0xff);
transmit_byte('\n');

rSUBSRCPND = 1;      //SUBSRCPND的RXD0位 清0
rSRCPND = 1<<28;     //SRCPND的UART0位 清0
rINTPND = 1<<28;     //INTPND的UART0位 清0
}

//*******************************************************************

运行正常:

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:45457 发表于 2015-9-11 19:09 | 只看该作者
2440裸机编程之八 UART通用异步收发
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表