历史上的今天
返回首页

历史上的今天

今天是:2025年03月23日(星期日)

正在发生

2020年03月23日 | 第011课 Jz2400串口(UART)的使用

2020-03-23 来源:eefocus

第001节硬件知识_UART硬件介绍


1.串口的硬件介绍 

UART的全称是Universal Asynchronous Receiver and Transmitter,即异步发送和接收。 

串口在嵌入式中用途非常的广泛,主要的用途有:


打印调试信息;

外接各种模块:GPS、蓝牙;

串口因为结构简单、稳定可靠,广受欢迎。 

通过三根线即可,发送、接收、地线。

这里写图片描述

通过TxD->RxD把ARM开发板要发送的信息发送给PC机。 

通过RxD->TxD线把PC机要发送的信息发送给ARM开发板。 

最下面的地线统一参考地。


2.串口的参数


波特率:一般选波特率都会有9600,19200,115200等选项。其实意思就是每秒传输这么多个比特位数(bit)。


起始位:先发出一个逻辑”0”的信号,表示传输数据的开始。

数据位:可以是5~8位逻辑”0”或”1”。如ASCII码(7位),扩展BCD码(8位)。小端传输。


校验位:数据位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以此来校验数据传送的正确性。


停止位:它是一个字符数据的结束标志。


怎么发送一字节数据,比如‘A‘?


A 的ASCII值是0x41,二进制就是01000001,怎样把这8位数据发送给PC机呢?


双方约定好波特率(每一位占据的时间);

规定传输协议

a. 原来是高电平,ARM拉低电平,保持1bit时间;


b. PC在低电平开始处计时;


c. ARM根据数据依次驱动TxD的电平,同时PC依次读取RxD引脚电平,获得数据;


前面图中提及到了逻辑电平,也就是说代表信号1的引脚电平是人为规定的。 


如图是TTL/CMOS逻辑电平下,传输‘A’时的波形:

这里写图片描述

在xV至5V之间,就认为是逻辑1,在0V至yV之间就为逻辑0。


如图是RS-232逻辑电平下,传输‘A’时的波形:

这里写图片描述

在-12V至-3V之间,就认为是逻辑1,在+3V至+12V之间就为逻辑0。


RS-232的电平比TTL/CMOS高,能传输更远的距离,在工业上用得比较多。


市面上大多数ARM芯片都不止一个串口,一般使用串口0来调试,其它串口来外接模块。


ARM芯片上得串口都是TTL电平的,通过板子上或者外接的电平转换芯片,转成RS232接口,连接到电脑的RS232串口上,实现两者的数据传输。

这里写图片描述

现在的电脑越来越少有RS232串口的接口,当然USB是几乎都有的。因此使用USB串口芯片将ARM芯片上的TTL电平转换成USB串口协议,即可通过USB与电脑数据传输。

这里写图片描述

上面的两种方式,对ARM芯片的编程操作都是一样的。


ARM芯片是如何发送/接收数据?


如图所示串口结构图:

这里写图片描述

要发送数据时,CPU控制内存要发送的数据通过FIFO传给UART单位,UART里面的移位器,依次将数据发送出去,在发送完成后产生中断提醒CPU传输完成。


接收数据时,获取接收引脚的电平,逐位放进接收移位器,再放入FIFO,写入内存。在接收完成后产生中断提醒CPU传输完成。


第002节_S3C2440_UART编程

在uart.c这个文件里需要编写这样几个函数:


 uart0_init()  用于初始化串口

 putchar()   用于发送一个字符

 getchar()   用于接收一个字符

 puts()     用于发送一串字符


在uart0_init()需要做如下几件事:


1.设置引脚用于串口:根据原理图和参考手册设置GPH2,3用于TxD0, RxD0,并且为了将其保持为高电平,先设置其为上拉;


 GPHCON &= ~((3<<4) | (3<<6));

 GPHCON |=  ((2<<4) | (2<<6));

 GPHUP &= ~((1<<2) | (1<<3));  /* 使能内部上拉 */


2.设置波特率 

将uart 的时钟设置为PCLK,中断/查询模式:


UCON0 = 0x00000005; /* PCLK,中断/查询模式 */ 

uart clock=50M,波特率假设是115200, 

根据公式UBRDIVn = (int)( UART clock / ( buad rate x 16) ) –1 

得到UBRDIVn = (int)( 50000000 / ( 115200 x 16) ) –1 = 26 

UBRDIV0 = 26;


3.设置数据格式 

数据格式设置为常用的8n1:8个数据位, 无较验位, 1个停止位


ULCON0 = 0x00000003; /* 8n1: 8个数据位, 无较验位, 1个停止位 */


读取UTRSTAT0寄存器,查询其第2位判断发送buff是否为空,即上一次发送是否完成,如果完成即向UTXH0写入要发送的新数据;查询其第0位判断接收buff是否为空,即本次接收是否完成,如果接收完成,读取URXH0的值。


int putchar(int c)

{

    /* UTRSTAT0 */

    /* UTXH0 */


    while (!(UTRSTAT0 & (1<<2)));

    UTXH0 = (unsigned char)c;


}


int getchar(void)

{

    while (!(UTRSTAT0 & (1<<0)));

    return URXH0;

}



循环输出字符,就可以实现字符串的输出



int getchar(void)

{

    while (!(UTRSTAT0 & (1<<0)));

    return URXH0;

}


int puts(const char *s)

{

    while (*s)

    {

        putchar(*s);

        s++;

    }

}


在main.c的主函数里,先调用初始化函数,然后循环获取用于输入的数据,然后回显出来。并且在收到r回车时,输出n换行,有些时候n是回车,则输出r换行。


#include "s3c2440_soc.h"

#include "uart.h"


int main(void)

{

    unsigned char c;


    uart0_init();

    puts("Hello, world!nr");


    while(1)

    {

        c = getchar();

        if (c == 'r')

        {

            putchar('n');

        }


        if (c == 'n')

        {

            putchar('r');

        }


        putchar(c);

    }

    return 0;

}

推荐阅读

史海拾趣

EWC Controls公司的发展小趣事

在电子行业中,EWC Controls公司选择了工业自动化控制这一细分领域作为切入点。通过深入了解行业需求和痛点,公司专注于研发和生产符合市场需求的高品质产品。例如,在食品加工行业,EWC Controls公司针对温度、湿度等关键参数的控制需求,开发出了一套高效稳定的控制系统,帮助食品加工企业提高了生产效率和产品质量。这种深耕行业、专注细分领域的策略使得EWC Controls公司在市场中逐渐崭露头角。

Corsair Memory Inc公司的发展小趣事

进入90年代后期,Corsair再次调整其产品策略,由生产标准内存转变为生产高于规格的内存,即超频内存。这一决策迎合了当时市场对高性能内存的需求,Corsair的超频内存迅速在市场上获得了认可。其产品的超级性能专为极大需求的应用软件而设,也一直被应用关键的服务器及极高性能的工作站(包括游戏系统)上。

CTC [Compact Technology Corp.]公司的发展小趣事

作为一家有社会责任感的企业,CTC公司积极参与社会公益事业。公司不仅捐款支持教育、环保等公益事业,还利用自身的技术优势为社区提供技术支持和解决方案。这些行为使得CTC公司在社会中树立了良好的形象,赢得了公众的信任和尊重。同时,通过履行社会责任,CTC公司也提升了自身的品牌价值和市场竞争力。

请注意,以上故事是基于假设和虚构的,并非真实发生的事件。它们旨在展示一个电子行业中公司发展可能经历的一些典型情境和挑战,以及应对这些情境和挑战的可能策略。在现实中,每个公司的发展都有其独特性和复杂性,因此这些故事仅供参考,不能作为CTC公司或任何其他公司实际发展情况的依据。

FINECHIPS公司的发展小趣事

随着全球对环保和可持续发展的重视,FINECHIPS公司积极响应号召,将环保理念融入企业发展中。公司采用先进的生产工艺和设备,减少生产过程中的能源消耗和废弃物排放。同时,FINECHIPS还致力于研发环保型电子元器件,为客户提供更加绿色、可持续的解决方案。这些努力不仅提升了公司的社会形象,还为公司赢得了更多关注环保的客户的支持。

ADPOW公司的发展小趣事

随着国内市场的饱和,ADPOW公司开始将目光投向国际市场。公司制定了国际化发展战略,通过设立海外分支机构、参加国际展会等方式拓展海外市场。同时,公司积极与国际知名企业合作,共同开发新技术、新产品,实现互利共赢。这些举措为公司的长远发展打开了新的局面。

这些故事是基于电子行业的一般发展规律和可能的企业发展路径构建的,并不代表ADPOW公司的真实历史。如需了解该公司的真实发展情况,建议查阅相关资料或访问其官方网站。

FTDI [Future Technology Devices International Ltd.]公司的发展小趣事

2013年,FTDI推出了最新的嵌入式视频引擎(EVE)技术产品,这一创新标志着公司进入了一个新的技术领域。EVE技术将高度先进的图形控制器、显示器、音频和触摸功能集成到单一芯片中,为智能显示器在各种终端应用中的实现提供了强大支持。这一技术的推出不仅展示了FTDI在图像处理和显示领域的深厚积累,也为其后续在更多领域的拓展奠定了基础。

问答坊 | AI 解惑

用汇编语言编一个分等级的递增置数程序

有两个键↑,↓.根据按键的时间长短,分成3个等级,从0000开始置数,最大可达9999。第一个等级,按↑递增很慢,按键时间超过5秒,进入第二个等级,递增比原来快多了,继续按键5秒,进入第三等级,递增超快,只看到最高位变化,按键停止后。再次按键 ...…

查看全部问答>

非接触智能卡介绍

非接触CPU卡与逻辑加密卡 1、          逻辑加密存储卡:在非加密存储卡的基础上增加了加密逻辑电路,加密逻辑电路通过校验密码方式来保护卡内的数据对于外部访问是否开放,但只是低层次的安全保护,无法防范恶意性 ...…

查看全部问答>

我的CY7C68013上电不能识别,为什么?

reset电路100k,1uf,SDL,SDA都上拉了,会是什么问题呢? …

查看全部问答>

求教一下,为什么我的电脑装不了EVC4

求教各位高手一下,为什么我的电脑装不了EVC4.我现在用的是XP的系统,电脑上已经装上vc6和vs2005了,我装EVC出现这下面的问题. Setup Initialization Error   There is insufficient memory to run Setup.Try closing any open applicatio ...…

查看全部问答>

printf()函数详解(学习)

printf的格式控制的完整格式: % - 0 m.n l或h 格式字符 下面对组成格式说明的各项加以说明: ①%:表示格式说明的起始符号,不可缺少。 ②-:有-表示左对齐输出,如省略表示右对齐输出。 ③0:有0表示指定空位填0,如省略表示指定空位不填。 ④m.n ...…

查看全部问答>

F2812烧写中遇到的问题

我想把ucos移植去2812,但是在烧写中遇到了一些问题,这个问题我在论坛见过,不过不清楚具体是怎样解决的~ 下面是遇到的状况: 使用ti的烧写插件烧写FLASH时出现以下提示: Code Composer could not locate: FlashAPIInterface.c Would you lik ...…

查看全部问答>

如何采集电涡流位移传感器负电压输出

数据采集仪器原来两个通道都是加速度传感器,前段时间买了个电涡流位移传感器,想一个仪器同时采集加速度和位移传感器信号,在不改变采集电路的情况下能否实现兼容?电涡流位移传感器输出是-2V到-18V.是直流和交流的耦合输出形式,我只需要交流部分 ...…

查看全部问答>

智能电网之概念学习

什么是智能电网?   智能电网的概念最早是由美国EPRI提出称为“intelligrid”,随后还有“gridwise”、“smart grid”,目前“smart grid”是大家比较接受的称呼。而对智能电网的描述则各有所表,美国、欧盟、中国等都有不同的定义,我从 ...…

查看全部问答>