最近有一个项目需要设计搭建一个嵌入式的信号处理平台,需要给一位纯机械背景的同仁讲解嵌入式硬件设计的相关知识。在整理资料过程中发现,嵌入式硬件设计相对比其软件设计的上手难度更大,相关的资料和书籍对于无电子背景的读者来说,学习成本也相对较高,所以打算写一篇较为基础的嵌入式硬件设计入门文章,供需要进行简单硬件开发设计的非专业同学查阅。
嵌入式(Embedded)是一个有关计算机的抽象的概念。计算机通常可以被分为两类,一种是普通计算机,也就是我们口中所说的狭义的“计算机”;那么另一种,就是嵌入式计算机(Embedded Computer)。我们日常使用的手机,平板电脑等等,这些“隐蔽”的计算机都属于嵌入式计算机的一种。它们控制着微波炉,冰箱,洗衣机,控制着工厂中的机器人,乃至城市中的信号灯,几乎我们工作生活中所有的电子设备都离不开嵌入式这个概念。
目录 · Table of Contents
计算机体系结构
在了解嵌入式硬件设计之前,我们有必要了解一下计算机结构。无论是嵌入式计算机,还是普通计算机,它们都有相似的计算机结构。

位于计算机体系结构最底层的,是硬件(Hardware)。比如,传统意义上的计算机主机,包括了中央处理器(CPU),主板(Mother Board),内存(Memory),显卡(GPU),硬盘(Disk)等,这些都被称为计算机硬件。我们的手机,其设备本身就是嵌入式系统的硬件部分。
但只有硬件的计算机,是无法工作的。当年智能手机刚时兴的时候,发烧友圈内流行一个名词,叫做“刷机”。偶尔“刷机”会失败,手机就会再也无法启动,失去一切功能,发烧友称之为“变砖”。这就是因为,“刷机”这一过程破坏了手机的固件(Firmware),导致系统无法开机。固件其实就是储存在硬件中的底层软件,负责初始化硬件系统,并对其进行配置以保证计算机的正常运行。由于其的重要性和不可替代性,通常被永久地储存在存储器中独立存在,从而被称之为固件(Fireware)。固件一般存储在非易失性存储器ROM(Read-Only Memory,只读存储器)中,但这种存储器一经出厂便不可修改。随着技术的发展,现在固件更多的使用的是EEPROM(Electrically-Erasable Programmable ROM,电可擦除可编程ROM),便于硬件的固件升级。
引导程序(Bootloader)保存在固件中。引导程序是由处理器运行的一个特殊程序,它负责把操作系统(Operating System,简称OS)从存储介质中读取到内存(Memory),以便处理器随后运行该操作系统。
所有的普通计算机都有操作系统,而对于嵌入式而言,只有较为复杂的嵌入式计算机拥有操作系统,比如我们手机的安卓系统,ios系统。一些简单的嵌入式设备比如空调,洗衣机,其应用程序(Application Software)在出厂时即被写入硬件存储设备中,变成了固件,所以这种简单的嵌入式设备就不需要操作系统了。
上述结构的最高层,就是应用程序,也就是我们俗称的“软件”,或者手机“APP”。通过各种应用程序,我们能利用计算机的算力(Compute Power)实现一些具体的功能或者操作,比如视频聊天,收发邮件,或者CAD制图。除去应用程序层一下的所有软件都看作是系统软件。对于嵌入式系统而言,应用程序和系统软件之间的界限相对比较模糊,比如上文中提到的,一些嵌入式应用程序已经作为固件载入设备中,其固件和应用程序共同作为该设备的系统软件。
虽然普通计算机和嵌入式计算机的体系结构是类似的,但是在硬件及系统层面,普通计算机和嵌入式计算机还是一定区别。

上图是一个典型的普通计算机硬件及系统原理框图。一台普通计算机通常有很大的主内存支持操作系统,应用软件和数据,以及众多的输入输出接口(I/O)。一些高性能嵌入式计算机也会采用普通计算机的上述结构,比如笔记本电脑。但对于一般的小型嵌入式设备,通常采用如下结构:

较小的嵌入式系统使用微控制器(Micro Controller)作为处理器。如上图所示,微控制器通常将小容量内存(RAM&ROM)以及一些I/O集成在一个芯片内。嵌入式工程师通常需要选取一枚能够胜任项目计算规模的微控制器芯片,并通过该芯片,针对项目,在外围添加不同的外设(Peripheral)从而实现嵌入式系统的功能。这便是嵌入式系统硬件设计的基本概括。下文将具体的介绍一些设计过程中的基础知识,以及开发流程。
嵌入式处理器
由于嵌入式应用种类繁多,所以每个项目所使用的处理器也多种多样。这种采用大规模集成电路的处理器通常被称为芯片(Chip)。最为核心的芯片是微控制器,它相当于普通计算机的CPU,但相比CPU集成了一些外设,如存储器,I/O设备以及定时器等。其他芯片如数字信号处理芯片(DSP),运算放大器等。
目前市面广泛应用的多为8位(bits)和32位微处理器。位是数据存储的最小单位,而在这里所说的处理器位数,是指处理器一次能处理的最大位数。关于位的更多概念,本文不再赘述,不过有兴趣的读者可以了解一下处理器的工作原理,以便更加深入的了解这些概念。
8位的微处理器的运算能力较低,一般被用于比较简单的项目,比如普通计算器,冰箱,洗衣机等。比较常用的型号如Arduino Uno,或者电子学生人手一个的“51单片机”等,都属于8位的微处理器。32位处理器的性能相对较强,可以胜任一些算量比较大的项目,比如无人机,机器人等。比较常见的有Arduino Mega,意法半导体公司(ST Microelectronics)的STM32系列,以及早期的智能手机芯片,均为32位处理器。随着电子制造技术的提高,制程越来越小,现在的顶级智能手机中也出现了64位处理器,比如iPhone所搭载的A13仿生芯片,以及高通骁龙的旗舰系列芯片,都采用了64位架构以应对越来越高的算力要求。
选择一颗合理的微处理器芯片是嵌入式硬件设计的第一步,这其中需要考虑预算成本,项目所需的算力,以及需要搭载的外设多少。目前市面上的微处理器种类非常多,厂商还会针对不同的应用场景对微处理器进行功能优化,比如ESP8266针对物联网设备需要WiFi这一特点,在微控制器中集成WiFi模块,或是针对移动设备推出的低功耗处理器,亦或者像高通旗下的骁龙系列处理器,针对智能手机的需求,将通讯模块和图形处理器(GPU)集成在一张芯片上。这就对工程师的设计工作提供了更多的选择,同时也要求工程师对项目要有深入的理解,从而选取经济,合适的处理器芯片。
主流的芯片通常会有一些厂商提供开发板(Evaluation Board),开发板主要为选定的芯片提供一个测试平台,开发板通常在改性芯片的最小系统(Minimum System)的基础上增加一些常用的外设,以供开发者调试使用。开发者可以根据项目所需功能,在开发板的基础上测试,并制定设计路线,增添删改其外设,最终制定出项目的设计方案。所谓最小系统则是指能提供芯片运行必要硬件环境的最小的嵌入式计系统。

输入与输出
嵌入式处理器如微控制器或DSP,通常都会提供一组芯片上的输入输出端口(I/O),并以芯片引脚的方式暴露给设计人员。

上图是STM32L151R6的芯片引脚,其中PA-PD均为芯片的I/O,设计人员通过芯片引脚,可以进行一系列的开发工作。I/O的类型有很多,下图是Stellaris LM3S8962型开发板的I/O接口示意图:

该控制器的核心是一个32位的ARM Cortex-M3处理器。开发板引出了微控制器的大多数引脚。下文将引述几个常见的I/O接口。
通用数字I/O
嵌入式系统设计人员经常将专用或者定制的数字硬件连接到嵌入式处理器,因此嵌入式处理器大多具有一定数量的通用I/O(General-Purpose I/O, GPIO),其允许软件读写以电压级别表示的逻辑0或1。如果处理器的供电电压(Supply Voltage)为V,那么在高电平有效逻辑(Active High Logic)中,接近于V的电压表示为逻辑1,接近于0的电压表示为逻辑0。在低电平有效逻辑(Active Low Logic)中,情况则正好相反。
脉冲宽度调制
脉冲宽度调制(Pulse Width Modulation, PWM)是将可变大小的功率 有效地传输给外部硬件设备的技术。例如,PWM可用于控制电机的速度,LED灯的亮度以及加热元件的温度等。
由于PWM硬件只适用于数字电路,因此很容易被集成到基于微控制器的芯片中。通过特定的设计,数字电路只会产生高和低两个电压。一个PWM信号以某个固定频率在高低电压之间快速切换,改变信号为高电平时的时间总长度。占空比是信号总长度中电压为高的时间比例。如果占空比为100%,那么电压就一直为高,如果占空比为0%,电压就一直为低。
很多微控制器都提供一组PWM类的外设,对于这些外设,程序员通常只需要在外设对应的存储器映射中写入特定值,设置占空比和频率,相应的外设就可以以与设定的占空比成正比地将功率传输给外部硬件。
串行接口
串行接口(Serial Interface)是指采用串行通信方式的扩展接口,在串行接口数据传输过程中,数据一位一位地顺序传送。微处理器通常使用通用异步接收器/发送器(Universal Asynchronous Receiver/Transmitter, UART),完成串口的接收和发送。常见的串行接口有通用串行总线(Universal Serial Bus, USB),JTAG(Joint Test Action Group),内部集成电路(Inter-Integrated Circuit, I2C)以及串行外设接口总线(Serial Peripheral Interface, SPI)等等。
总结
本文主要从计算机结构,以及处理器和接口类型这三个方面介绍了嵌入式硬件开发过程中所需要了解的必要的知识。嵌入式硬件开发是一个门槛相对较高的工作类型,尤其是模拟电路设计部分,相比数字电路设计难度更大。
如果读者需要设计相对复杂的硬件设备,需要有《模拟电路》以及《数字电路》这两门课程作为基础。初学者可以通过Arduino或者51单片机,熟悉了解嵌入式系统设备的一些特点,从而更加深入的了解嵌入式底层的设计思路。
设计过程中一定要亲自阅读芯片文档,按照文档要求配置硬件环境。电路设计软件推荐Altium Designer(付费)或KiCAD(开源免费)进行项目的设计。
参考文献
[1] Catsoulis, J., 2007. Designing Embedded Hardware. Beijing: O’Reilly.
[2] E. A. Lee & S. A. Seshia, 2017. Introduction to Embedded Systems – A Cyber-Physical Systems Approach, Second Edition. Cambridge: MIT Press.