0 串口,UART,RS232,RS485傻傻分不清

0.1 串行通信与并行通信

串口名字表示采用的通信方式为串行而不是并行。那么串行与并行的区别是啥呢?很简单,串行就是同一时刻只能传输一个bit,而并行则可以同时传输多个bits。乍一看,仿佛并行通信速度更快,而且并行的信号线越多,传输数据快。CPU的总线就是使用并行通信的,总线带宽也从8一路飙升到了目前的64。然而这是在CPU的内部,对于设备间通信而言,并行通信意味着需要更多的信号连线,更复杂的控制逻辑,设备成本飙升。所以目前外围设备通信中,串行通信才是主流。如USB就是串行通信的代表,IDE的硬盘接口也被串行的SATA取代。
串口,顾名思义,采用的串行通信,一次发送一个bit位,干净利索。

0.2 异步通信和同步通信

UART是Universal Asynchronous Receiver&Transmitter的缩写,意思是统一异步通信。这里的关键点是异步通信。那就说明还存在另一种通信方式,叫做“同步通信”。这两者到底啥区别呢?
具体看参考这篇文章。总结来说:

  1. 同步通信要求接收端时钟频率和发送端时钟频率一致,发送端发送连续的比特流;异步通信时不要求接收端时钟和发送端时钟同步,发送端发送完一个字节后,可经过任意长的时间间隔再发送下一个字节。
  2. 同步通信效率高;异步通信效率较低。
  3. 同步通信较复杂,双方时钟的允许误差较小;异步通信简单,双方时钟可允许一定误差。
  4. 同步通信可用于点对多点;异步通信只适用于点对点。

0.3 RS232 RS485

串口通信有自己工业标准,目前常用的标准有两种:一是RS232,二是RS485。他们并不兼容,各自规定了自己的电气标准,通信规范。参考这篇文章。
简单来说:
由于RS232接口标准出现较早,难免有不足之处,主要有以下四点:
  (1) 接口的信号电平值较高,易损坏接口电路的芯片,又因为与TTL 电平不兼容故需使用电平转换电路方能与TTL电路连接。
  (2) 传输速率较低,在异步传输时,波特率为20Kbps。
  (3) 接口使用一根信号线和一根信号返回线而构成共地的传输形式,容易产生共模干扰,所以抗噪声干扰性弱。
  (4) 传输距离有限,最大传输距离标准值为50英尺,实际上也只能用在50米左右。
 针对RS232接口的不足,于是就不断出现了一些新的接口标准,RS-485就是其中之一,它具有以下特点:
  (1) RS-485的电气特性:逻辑“1”以两线间的电压差为+(2-6) V表示;逻辑“0”以两线间的电压差为-(2-6)V表示。接口信号电平比RS-232降低了,就不易损坏接口电路的芯片,且该电平与TTL电平兼容,可方便与TTL 电路连接。
  (2) RS-485的数据最高传输速率为10Mbps 。
  (3) RS-485接口是采用平衡驱动器和差分接收器的组合,抗共模干能力增强,即抗噪声干扰性好。
  (4) RS-485接口的最大传输距离标准值为4000英尺,实际上可达3000米,另外RS-232接口在总线上只允许连接1个收发器,即单站能力。而RS-485接口在总线上是允许连接多达128个收发器。即具有多站能力,这样用户可以利用单一的RS-485接口方便地建立起设备网络。

1 S3C2440片内串口控制器初始化理论

S3C2440片内集成了UART控制器,支持3个独立的串口。TQ2440开发板对其中的0号串口引脚连接了电平转换电路把TTL电平转换成了RS232标准的电平,并搭配了标准的DB9接头。这样就可以直接和PC的DB9接口通过串口线连接调试了。

1.1 时钟来源与波特率

串口通信需要时钟来驱动,S3C2440提供了三种时钟来源供UART控制器使用,分别是PCLK,UEXTCLK,FCLK/n。具体使用哪个时钟源通过UCONn寄存器来设置。
波特率以时钟源的频率为基础,按照固定的公式计算得出。

UBRDIVn = (时钟源频率 / (波特率X16) -1

设置波特率的寄存器为UBRDIVn。
我们的实验中,选择PCLK作为时钟源,频率为50MHz,如果要想得到115200Hz的波特率,那么就需要设置

UBRDIVn = 50,000,000 / 115200*16 -1 = 26

1.2 数据长度、停止位、校验位

这是串口通信的三要素,收发两端必须一致才能正确通信。通过ULCONn寄存器来设置。详见数据手册。

1.3 轮询方式发送一个字节的流程

需要发送数据时
(1)把数据写入UTXHn寄存器,写完成导致:
* 发送完成状态清0;
* UART硬件自动把其中的数据串行化发送出去;
* 发送完毕UTRSTATn的发送完成状态置1。

(2)循环检测发送完毕状态位,等待发送完毕退出。

1.4 轮询方式接收数据流程

接收数据也很简单
当接收到数据时,会把数据反串行化后放入URXHn寄存器中,并设置URTSTATn寄存器来通知。
(1)循环检测UTRSTATn的接收完成状态,直到其为1
(2)读取URXHn寄存器,取出收到的字节,读完成会导致:

  • UTRSTATn的接收完成状态清0

2 源码

uart.c

#include "2440addr.h"void uart_init(void)
{rGPHCON &= ~(3<<4 | 3<<6);rGPHCON |= 2<<4 | 2<<6;rGPHUP = 0x00;rULCON0 &= ~(0x3);  /* 8 bits */rULCON0 |= 0x3;rULCON0 &= ~(1<<2); /* 1 stopbit */rULCON0 &= ~(1<<5); /* no parity */rULCON0 &= ~(1<<6); /* normal (not infrared) */rUCON0 &= ~(3);     /* open send mode */rUCON0 |= 0x1;rUCON0 &= ~(3<<2);  /* open recv mode */rUCON0 |= 1<<2;rUCON0 &= ~(3<<10); /* PCLK */rUBRDIV0 = 26;      /* baud rate = 115200 */
}
void uart_set_baud(int baud)
{if (baud == 115200 ) {rUBRDIV0 = 26;} else if(baud == 9600 ) {rUBRDIV0 = 325;} else {}
}
void uart_set_stopbits(int n)
{if (n < 1 || n > 2) return;if (n == 1) {rULCON0 &= ~(1<<2);}else{rULCON0 |= 0x4;}
}
/* 0 - no, 1 - odd, 2 - even */
void uart_set_parity(int how)
{if (how < 0 || how >2) return;rULCON0 &= ~(0x7 << 3);if (how == 0) {rULCON0 |= (0 << 3);} else if (how == 1) {rULCON0 |= (4 << 3);} else {rULCON0 |= (5 << 3);}
}
/* n=5,6,7,8 */
void uart_set_databits(int n)
{if (n<5 || n>8) return;rULCON0 &= ~3;switch (n) {case 5:rULCON0 |= 0;break;case 6:rULCON0 |= 1;break;case 7:rULCON0 |= 2;break;case 8:rULCON0 |= 3;break;default:break;}
}
/* send a byte and wait until sent. */
void uart_send_byte(unsigned char c)
{rUTXH0 = c;while ( 0 == (rUTRSTAT0 & (1<<2)) );
}
unsigned char uart_recv_byte()
{while ( 0 == (rUTRSTAT0 & 1)) ;return rURXH0;
}void uart_send_str(char* msg)
{while (*msg) {uart_send_byte(*msg++);}
}

3 简单的打印函数

这里我们原样模拟了标准C库的函数。

3.1 putchar

注意对C字符串换行符的处理,需要转换成终端换行符序列0x0A0D。

int putchar(int c)
{if(c == '\n') {uart_send_byte(0x0A);uart_send_byte(0x0D);} else {uart_send_byte((unsigned char)c);}return 0;
}

3.2 puts

int puts(const char* str)
{while(*str){putchar(*str++);}return 0;
}

3.3 测试代码

 io_init(0);puts("Hello, World!\n");

4 项目源码

标签v0.6。

TQ2440开发板学习纪实(5)--- 设置UART串口,输出Hello World!相关推荐

  1. TQ2440开发板学习纪实(1)---最简单的独立运行汇编程序

    0 如何做到简单 TQ2440开发板,采用的CPU是三星S3C2440,核心板附加了2MB运行ROM和64MB运行RAM,并且搭配了64MB的Nand Flash.而S3C2440直接支持从NandF ...

  2. TQ2440开发板学习纪实(0.1)--- GNU Freestanding(Naked)C ARM交叉开发环境创建与测试

    0 由来 在我的博文 GNU ARM交叉汇编环境的搭建与测试中,详细讲解了GNU ARM汇编环境的创建与使用方法.实际开发中,直接使用汇编语言写的代码往往很少,尽在系统启动和性能要求极其苛刻的时候才会 ...

  3. TQ2440开发板学习纪实(9)--- 利用Undefined异常模拟BLX指令

    在博文 <紧急求助!ARM-GCC对于函数指针调用的编译有错误?>中,我提到了GCC在编译函数指针调用的时候,会生成绝对地址跳转指令BLX.而S3C2440A这款CPU不支持BLX指令,从 ...

  4. AB32VG1开发板学习(3)UART(串口的简单使用)

    官方的开发实践指南中写了一个uart_sample命令,用来初始化AB32VG1的3个串口,本文是我仿照官方实践指南写的一篇笔记,并没有写串口命令,而是单纯地操作uart1端口. 硬件引脚 AB32V ...

  5. 探索者STM32F407开发板学习笔记一安装调试,串口下载

    1.下载驱动CH340驱动(USB串口驱动),进行安装,一般直接点下一步就可安装成功.然后进行测试,数据线两端一端连接USB-232接口,一端连着电脑的USB接口,打开开关, 找到设备管理器,找到端口 ...

  6. linux 控制虚拟串口,linux虚拟串口控制器实现-适用于无开发板学习tty driver-好向圈...

    在前面几章,我们介绍了tty子系统的框架.数据结构.tty驱动的注册与注销等内容,本章我们借助 之前学习的内容开发一个虚拟的串口控制器驱动,以便我们理解开发串口驱动的步骤及驱动开发实践. 本次实现的虚 ...

  7. 移植u-boot-2016.11到TQ2440开发板全过程记录

    移植前的准备 获取并解压源码 SAMSUNG公司于2017年初停止了对S3C2410系列CPU的官方u-boot支持(可在最新版u-boot源码中打开doc/README.scrapyard,搜索关键 ...

  8. 运行在TQ2440开发板上以及X86平台上的linux内核编译

    一.运行在TQ2440开发板上的linux内核编译 1.获取源码并解压 直接使用天嵌移植好的"linux-2.6.30.4_20100531.tar.bz2"源码包. 解压(天嵌默 ...

  9. 阿里云HaaS100物联网开发板学习笔记(六)做个智能灯---一个完整的开发例子

    摘要:本篇文章将前期几个专题综合起来,基于阿里云HaaS100的新固件设计制作一个智能灯.这个智能灯由云平台.手机APP端和设备端组成,基本上涵盖了一个物联网小项目所需的主要步骤. 目录 1.在阿里云 ...

最新文章

  1. Mybatis缓存配置
  2. 基于角色的权限控制模型RBAC
  3. Web前端开发前景怎么样?现在学习还来得及吗?
  4. 泛微oa主表赋值明细表_OA系统学习--三
  5. 【讲座预告】Processing Learner Texts: from Annotation to ...
  6. 服务器挂机自动签到京东,解放双手,什么值得买自动签到京东自动签到给你更多时间享受生活...
  7. DisplayPort-DP接口知识
  8. Unity 基础 之 实现简单监听晃动(摇一摇)手机设备震动手机设备的事件的功能
  9. font setup -- dejavu 安装字体
  10. 什么是深度学习? 模仿人脑的算法
  11. 【Python学习】程序练习《购物车程序》
  12. python如何让程序暂停_王者荣耀集祝福linkedin雄攻略
  13. Word 如何删除页面中的回车符 / 段落标记
  14. android 调用系统打印
  15. Android-vold源码分析之连接电脑OTG(11)
  16. C语言第五章Structures Unions
  17. c#—MemoryStream读图片存入ImageList
  18. 静态网站与动态网站访问流程
  19. Redis的奇葩问题
  20. JDK -- 网络编程(TCP/UDP)

热门文章

  1. 如何彻底删除MySQL服务
  2. 好玩的熊猫头表情包图片生成PHP源码+实测可用
  3. Haydn解决方案数字化平台助力架构师1小时完成架构设计(实操篇)
  4. Myth源码解析系列之九-总结
  5. linux 的IP修改
  6. 产品经理常用工作方法及原则汇总
  7. OpenCV-Python自适应直方图均衡类CLAHE及方法详解
  8. 老旧小区改造,智慧社区解决方案应用其中
  9. “错误 C1083 无法打开包括文件: “boost/shared_ptr.hpp”: No such file or directory”解决办法
  10. Mybatis用Sqlserver逆向工程实现