第011课 Jz2400串口(UART)的使用

2020-03-23来源: eefocus关键字:Jz2400  串口  UART

第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;

}

关键字:Jz2400  串口  UART 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic492326.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:第010课 掌握Jz2440_ARM芯片时钟体系
下一篇:第012课 内存控制器与SDRAM

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

交叉编译工具的使用说明
写在前面的话,由于已经学习了JZ2440V3开发板的裸机程序。想检验下学习成果,所以从今天开始把以前学的知识点在tiny4412开发板上面做个检验。裸机部分学习到把uboot移植完成就结束;然后,学习内核的驱动和其他子系统框架。言归正传,现在开始学习交叉编译工具链的使用。源文件需要经过编译才能生成可执行文件。在Windows下进行开发时,只需要点几个按钮即可编译,集成开发环境(比如 Visual studio)已经将各种编译工具的使用封装好了。Linux下也有很优秀的集成开发工具,但是更多的时候是直接以命令方式运行编译工具;即使使用集成开发工具,也需要掌握一些编译选项。PC机上的编译工具链为gcc、 ld、 objcopy
发表于 2020-03-26
交叉编译工具的使用说明
第014课 Jz2400_ARM异常与中断体系详解
第001节_概念引入与处理流程取个场景解释中断。假设有个大房间里面有小房间,婴儿正在睡觉,他的妈妈在外面看书。问:这个母亲怎么才能知道这个小孩醒?过一会打开一次房门,看婴儿是否睡醒,让后接着看书一直等到婴儿发出声音以后再过去查看,期间都在读书第一种 叫做查询方式: *优点:简单 *缺点: 累 写程序如何:while(1){    1 read book(读书)    2 open door(开门)    if(睡)        return(read book)    else&nb
发表于 2020-03-23
第014课 Jz2400_ARM异常与中断体系详解
第010课 掌握Jz2440_ARM芯片时钟体系
第001节_S3C2440时钟体系结构S3C2440是System On Chip(SOC),在芯片上不仅仅有CPU还有一堆外设。至于有哪些外设,可以查看参考手册。在S3C2440参考手册的第一章PRODUCT OVERVIEW里面有个BLOCK DIAGRAM图:可以把该图分为上中下三块,上面的是与CPU密切相关的,工作于FCLK;中间的一些对性能要求较高的设备,像LCD显示、相机等,在AHB BUS,H即为High,高速之意,工作于HCLK;下面的是一些对性能要求不那么高的低速设备,在APB BUS,P即为Peripheral之意,工作在PCLK。在参考手册的特性里介绍了S3C2440的工作频率,Fclk最高400MHz,Hcl
发表于 2020-03-23
第010课 掌握Jz2440_ARM芯片时钟体系
JZ2440开发板介绍(S3C2440)
1、开发板实物图2、开发板上硬件3、在开发板使用时一般会用到JTAG接口、USB和USB-COM1接口、NAND和NOR模式选择开关、power电源开关。JTAG接口:用于J-LINK的连接。ETH:以太网网口;
发表于 2020-03-11
JZ2440开发板介绍(S3C2440)
JZ2440开发笔记(1)——arm-linux-gcc环境搭建
1、下载arm-linux-gcc-4.4.3安装包,http://arm9.net/download.asp2、解压arm-linux-gcc-4.4.3-20100728.tar.gz,使用命令tar -zxvf arm-linux-gcc-4.4.3-20100728.tar.gz3、将解压出来的文件夹重命名为arm,然后将arm文件夹拷贝到/usr/local下,#cp -rv arm  /usr/local/4、修改环境变量,把交叉编译器的路径加入到PATH。(推荐使用方法一)   方法一:修改/etc/bash.bashrc文件   #vim /etc/bash.bashrc  在最后加上:   export
发表于 2020-02-21
MSP430 串口初始化,及串口操作
#include  <msp430x14x.h> /*    关于UART0串口的配置,及操作函数说明*//* 一、uart0初始化*/ void uart0_idev_init(void){        P3SEL  |= BIT4  + BIT5;     // 1. 选择P3.4和P3.5做UART0通信端口        ME1    |= UTXE0 + URXE0;    // 2. 使能
发表于 2020-03-10
何立民专栏 单片机及嵌入式宝典

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

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