历史上的今天

今天是:2024年11月09日(星期六)

正在发生

2019年11月09日 | 2440裸机编程之八 UART通用异步收发

发布者:影子猎人 来源: 51hei关键字:裸机编程  UART  通用异步收发 手机看文章 扫描二维码
随时随地手机看文章

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串口实验nnn");
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 != '')
  transmit_byte(*p++);
}


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


结果如图:




当然也可以用中断来处理,这里接收用中断做。
//********************************************************************
#define bps 115200
char ch;

void Main(void)
{     
    int i;
    ……硬件初始化……

uart0_init();
Uart_Printf(" uart串口实验nnn");
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 != '')
  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
}


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


运行正常:


关键字:裸机编程  UART  通用异步收发 引用地址:2440裸机编程之八 UART通用异步收发

上一篇:2440裸机编程之九 LCD液晶显示器
下一篇:2440裸机编程之七 模数转换器ADC

推荐阅读

变形机器人凭借多样的功能性和强大的适应性,在众多领域中都有巨大的应用价值,未来发展十分可期。不过,要想将潜力变为现实,各国还需要从技术、应用等方面做出努力。 《铁胆火车侠》、《机动战士高达》、《变形金刚》等作品,曾经让无数人大饱眼福,其中各种酷炫的变身战斗,总是会让人感到热血沸腾,尤其对于男生来讲,能够拥有“变形金刚”一样的...
Ⅰ、写在前面相信看过前面那篇文章“更加深入理解I2C总线、协议及应用”的人对I2C都有一定的了解了。那篇文章是针对I2C,使用单片机IO模拟I2C方式实现读写操作。本文将讲述硬件I2C读写操作,也就是由处理器自身硬件的I2C实现时钟、数据的传输过程。Ⅱ、STM8硬件I2C知识STM8S的I2C模块不仅可以接收和发送数据,还可以在接收时将数据从串行转换成并行数据,...
根据发表在《自然》杂志上的一项最新研究,EPFL的工程师发明了一种新的计算机芯片,该芯片能够在单个电路中存储和处理数据。 下一代计算机芯片由二硫化钼(MoS2)的2D材料组成,可为节能电子产品打开了大门。 2D材料可让下一代计算机芯片立即存储、处理数据 New Atlas报告说,通常,计算机在一个区域(CPU)中处理数据,然后将其传递到另一个区域,例...
经过数十年发展,长三角和京津冀地区已经形成了中国半导体产业最为成熟的重要两极。随着全国多地区掀起发展半导体产业的浪潮,粤港澳大湾区作为中国最大的的芯片消费和应用市场,把广东省打造成中国半导体产业新一极,推动粤港澳大湾区与京津冀、长三角地区优势互补、协同发展的新一轮产业变革正在酝酿中。商务部对外贸易司副司长张冠彬在11月6日第四届进...

史海拾趣

问答坊 | AI 解惑

从研发到管理是条不归路-义隆电子副处长钟炳荣

从研发到管理,是一条没办法回头的路。一旦开始接触管理工作,对新技术的了解无可避免地会慢慢降低。对很多技术人员来说,这是很难克服的心理障碍。   对公司来说,经营者可以规划今年营收要成长多少,明年规模要扩大多少,五年后要将市占率提 ...…

查看全部问答∨

单片机开发调试应注意的问题

如何用keil调试时计算延时的方法|单片机系统设计与C51编程实践|C51单片机开发工具DIY|实战msp430B捕获PWM波的脉冲宽度|EMC8BIT单片机指令应用的误区与技巧|EM78系列单片机的子程序库|单片机系统开发的规范化问题|PWM技术在单片机控制智能充电器中的 ...…

查看全部问答∨

示波器测晶振输出

请问有源晶振的输出信号,用示波器能测出来吗?探头如何选择?…

查看全部问答∨

槽型开关,K128

谁有槽型开关K128的结构图,或接法图资料什么的呀,我在网上找不到资料,谢谢了…

查看全部问答∨

工作需要优化display driver各位能给我什么优化的提示吗?

我已经运行了分析软件,分析结果如下: RopCode                cTotal        cGPE        dwGPETime        Avg.GPETime  ...…

查看全部问答∨

串口数据入库问题

我想将从串口读的数据入到CE设备上的数据库中,请问我应该如何做?EVC有专门的串口类吗?…

查看全部问答∨

100分求PXA310 BSP

哪位有PXA310的WINCE BSP 能否共享一下! QQ:502240410 MSN(E-Mail):wangxin_801115@hotmail.com 百分相送,不够再加 感谢各位!…

查看全部问答∨

张帆的驱动开发群

我建了个驱动开发群,QQ群:11312034 本人是《Windows驱动开发技术详解》的作者张帆,希望一起交流。 …

查看全部问答∨

wince4.2 sdio下层驱动

wince4.2 sdio下层驱动…

查看全部问答∨

208的捕捉与定时器

if(IRCODE != 0xFF) { delay();                                //这里设断点 TXIRCODE(IRCODE); }复制代码今天在做红外遥 ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved