历史上的今天
返回首页

历史上的今天

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

正在发生

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

2019-11-09 来源:51hei

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
}


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


运行正常:


推荐阅读

史海拾趣

Heatron LED Integration公司的发展小趣事

在环保和可持续发展成为全球共识的今天,Heatron LED Integration积极践行绿色发展理念。公司不仅在生产过程中注重节能减排和资源循环利用,还致力于推广高效、节能的LED照明产品。通过不断的技术创新和产品优化,公司成功推出了一系列低碳环保的LED照明解决方案,为推动全球绿色可持续发展贡献了自己的力量。

AEC Design公司的发展小趣事
为了进一步提升技术实力和市场竞争力,AEC Design公司积极寻求与其他企业或研究机构的战略合作。通过与上下游企业建立紧密的供应链合作关系,公司确保了原材料的稳定供应和产品质量的有效控制。同时,与高校和研究机构的合作则为公司带来了源源不断的技术创新动力。
ETEQ Microsystems Inc公司的发展小趣事

随着市场的不断发展,ETEQ Microsystems Inc意识到只有不断创新才能保持竞争力。公司投入大量资源进行研发,终于在XXXX年成功研发出业界首款集成了人工智能算法的微型传感器。这一产品不仅提高了数据的处理效率,还大大降低了能耗,为物联网领域带来了革命性的变化。

Axon' Cable公司的发展小趣事

品质是Axon' Cable公司的生命线。公司始终坚持以客户需求为导向,不断提升产品品质和服务水平。Axon' Cable建立了完善的质量管理体系,并通过了多项国际认证。同时,公司还注重持续改进和创新,不断优化生产流程和提高生产效率。这些努力使得Axon' Cable的产品在品质上始终保持领先地位,赢得了客户的信任和好评。

这些故事虽然无法涵盖Axon' Cable公司发展的全部细节,但试图展现了其在电子行业中的成长轨迹和取得的成就。通过这些故事,我们可以看到Axon' Cable公司凭借其坚定的信念、不懈的努力和创新精神,在电子行业中不断发展壮大,成为了一家具有全球影响力的知名企业。

Degson Electronics Co Ltd公司的发展小趣事

随着市场需求的不断变化,Degson意识到只有不断创新和升级产品,才能在激烈的市场竞争中保持领先地位。因此,公司投入大量资金用于研发,并在技术上取得了重大突破。Degson成功研发出了一系列新型接线端子和精密模具,不仅提高了产品的性能和质量,还降低了生产成本。这些新产品迅速在市场上获得了广泛应用,进一步巩固了Degson在电子连接器领域的领先地位。

AMRI Enterprise Co Ltd公司的发展小趣事

AMRI Enterprise Co Ltd注重与高校和研究机构的产学研合作,通过引进先进技术和人才,推动公司的技术创新。公司与多所知名高校建立了紧密的合作关系,共同开展科研项目和技术攻关。这些合作不仅为AMRI带来了前沿的技术成果,还提升了公司的研发能力和创新能力。在产学研合作的推动下,AMRI不断推出具有创新性和竞争力的新产品,为公司的持续发展提供了强有力的支撑。

问答坊 | AI 解惑

冲动是魔鬼之——维修德生R-911的资料总集(checked)

本帖最后由 辛昕 于 2018-5-3 16:34 编辑 说起来,我早已忘记当年那个美女研究生小姐姐长什么样了,也根本没成功约过人家....... 倒是这一次疯狂的维修......... 没想到我后来的工作,甚至直到如今,都没改变这种毫无章法的风格.......... 真 ...…

查看全部问答>

msp430 DCO 怎么设置

     我想利用DCO产生一个320K的时钟给SMCLK用。看了手册没明白该怎么设置,手册上所说的8个离散频率是多少啊      有谁会告诉我下,该怎么设置DCO到320K,或告诉我怎么用具体的我自己设置…

查看全部问答>

大家一开始是如何学习硬件设计的

小弟是个菜鸟,还没有入门,现在想学硬件,不知该从何学起,都要学习什么课程,希望大家不涩赐教。…

查看全部问答>

LPC11U14实现SD卡U盘

此实验在本人设计的LPC1114/LPC1343/LPC11U14开发板是验证成功:下面先秀秀图吧,下面是三种芯片三种开发板。SD卡在背面。。。                             ...…

查看全部问答>

gerber文件格式的简写

在板厂制版的时候,大家可能会遇到要求发送光绘文件的情况,关于gerber文件的后缀分别代表什么意思呢?那就看看下面这个说明吧:GTL---toplayer 顶层GBL---bottomlayer 底层GTO---TopOverlay 顶层丝印层GBO---Bottomlayer 底层丝印层GTP---TopPaste ...…

查看全部问答>

Launchpad上面有没有5V的输出啊~~~

我用电表测了一下,发现Vcc是3.3V,不知道launchpad上面有没有5V的电压输出啊~~~…

查看全部问答>

2012年10月份北京举办的一些重要行业展会和研讨会

  中国国际光电产业博览会暨第十七届中国国际激光、光电子及光显示产品展览会 展会场馆:北京朝阳区三环东路六号中国国际展览中心举办时间:2012年10月16日~2012年10月18日 第九届中国国际机器视觉展览会暨机器视觉技术及工业应用研讨会展 ...…

查看全部问答>

Launchpad官网价格翻番9.9刀,论坛活动中正在以25元的价格发售(加触摸板)

Launchpad价格已经翻了一番,论坛参加活动还能够25元获得launchpad+触摸板, 活动链接:https://bbs.eeworld.com.cn/TI/201303_MSP430_Launchpad/index.html 这个价格怕是最后一拨了,存货完了,launchpad就回不到25的时代咯。 [ 本帖最后由 wstt ...…

查看全部问答>

双通道 H 桥电机驱动器

DRV8833 为玩具、打印机及其他机电一体化应用提供了一款双通道桥式电机驱动器解决方案。 该器件具有两个H 桥驱动器,并能够驱动两个直流(DC) 电刷电机、一个双极性步进电机、螺线 管或其他电感性负载。 每个H 桥的输出驱动器模块由N 沟道功率MOS ...…

查看全部问答>

CCS 5程序 调试的一些方法

用CCS 5    单步 调试时,如果遇到__delay_cycles(782000);怎么直接跳出,这个好像不是函数??? 如果是for循环语句又怎么跳出?? 还有什么调试技巧吗??…

查看全部问答>