【细说STM32】之五——说说串口
首先,串口对每一个做硬件和嵌入式软件的人来说,就是一个必备的工具,调试一个带MCU或者CPU的系统。我们在调试的过程中,一般第一件事情:GPIO点灯。这个我们前期内容已经介绍过了。 在完成GPIO点灯之后,一般我们就希望能够实现串口打印的功能,便于我们将一些寄存器信息打印出来便于调试。
由于我个人的特殊经历,对于我来说,串口这东西,仔细写起来,可以写一本书!应该不少于200页。 2008年我刚进华为工作时,碰到了一个特殊的历史时期,嵌入式领域群雄逐鹿。
1、Intel、AMD高调宣称X86系统进入嵌入式领域,要占领PowerPC的市场。(后来Intel也做到了,通用服务器占领了几乎所有电信核心侧的设备——刀片服务器、机架服务器)。 2、当时,MIPS、ARM、PowerPC还难分伯仲,不过多核ARM不成熟,无法在电信领域广泛应用。MIPS由于其优异的性价比和搞性能展露头角,慢慢由于其较差的质量表现而偃旗息鼓。 3、PowerPC,随着来着其他处理器的压力,也开始推出多核处理器。
我当时的工作是参与X86处理器作为嵌入式的电路开发。当时碰到一个问题:传统X86作为PC机已经演进得非常成熟的架构。PC的硬件结构与嵌入式SoC有很大的区别。
CPU下面是北桥负责高速外设、北桥的南面(下面)是南桥负责低速接口外设、然后还有一个SIO负责更低速的外设。 SIO全称叫Super I/O。
超级输入输出芯片(SIO)一般位于主板左下方或者左上方。主要使用的芯片有Winbond、ITE,它为主板上的标准I/O接口提供控制处理功能。这里所说的“超级”是指它集成了PS/2键盘、PS/2鼠标、串口COM、并口LPT接口等处理功能,而这些接口都是计算机中的慢速I/O设备。它们全部位于主板后部右边。它的主要功能包括负责处理从键盘、鼠标、串行接口等设备传输来的串行数据,将它们转换成为并行数据,同时也负责并行接口、软驱接口数据的传输与处理。SuperIO是通过一个类似于精简的PCI总线,叫做LPC总线与南桥进行连接的。
如此复杂的硬件结构,也是因为Intel强大的发货量,形成自有体系和标准。
所以在传统的PC机的主板上带一个RS232串口的,都是通过SuperIO实现的。X86上也是通过固定的地址去访问 而我们熟悉的ARM、不管是Cortex-M、还是Cortex-A都是一颗MCU、CPU都带了串口——UART; 从iBox选择的STM32F103的MCU的结构框图上面,我们可以看到有一堆UART、USART。
然而,在我当时面对的嵌入式X86的系统的设计需求,不需要并口、PS2、硬件监控、FDC、
H/W Monitor:一个应用程序读出所有计算机访问硬件传感器的测量值。
FDC:提供了一个主处理器和软驱之间的接口(软驱——看懂的人暴露年龄了)
Parallel port:并行端口(SPP),双向并行端口(BPP),增强型并行端口(EPP),扩展功能并行端口(ECP)四种模式。通过DIR可以控制它的输入/输出模式 认识上图的人再次暴露年龄 KBC:电路提供的功能包括一个键盘和一个PS2鼠标。控制器从键盘和鼠标接受串行数据,检查校验后将这些数据输出到其输出缓冲区。从它的读写命令中可以了解一些基本设置。 UART:终于说到我们的本文的主角UART、即串口了。在老式的台式电脑或者笔记本上,其实都会有RS232电平标准的UART:
关于串口的各种电平标准,我们前期有发布过相关的内容: UART、RS-232、RS-422、RS-485 SuperIO的UART输出的一般也是TTL电平,还需要接到RS232芯片,再接到DB9接口
X86系统的地址的寻址空间还有点复杂:除了内存空间(Memory)、还有IO空间。 IO空间是在X86开发时,串口这些低速的外设是用IO空间进行访问和读写的: 由UARTDevice Configuration Registers可知,UART1~UART4的基址分别是03F8H,02F8H,03E8H,02E8H。 GPIO:通用管脚 ACPI:ACPI是控制电脑电源的系统 这些对于传统的由PowerPC实现的电信嵌入式系统来说,除了串口,其他功能不是需要的;同时,原来的一些NorFlash、寄存器、传感器 数据,需要通过MPI接口进行访问,而这些都是SuperIO芯片不能实现的。 另外由于SuperIO的功能多,所以尺寸大,管脚也多。
所以在当时的设计需求里面,使用一个SuperIO并不合适。所以选择一个CPLD实现LPC接口控制UART接口。 由于我是从事过这么一个工作,所以对UART的工作过程特别熟悉。而且,我们一开始按照自己的想法,自定义了很多寄存器,并且地址是按照自己想法去设计的,结果:商业软件windows、商用linux无法直接识别到串口。后来又改回基址:03F8H,02F8H,03E8H,02E8H这几个地址。
我前言还没写完就累了。。。。 下次继续跟大家聊串口。
文章出处: 硬件十万个为什么
|