细心的童鞋们会发现,生活中有好多仪器仪表都以“微电脑” (有的是“数码” / “智能”)来冠以前缀,例如:微电脑电饭煲、微电脑洗衣机、微电脑万年历等等。这些电子产品给人一种高大上的感觉,似乎让人以为内部集成了高科技的暗箱,不错,你没有看错,这些电子产品内部都有一种叫做单片机的东西作为整个产品的控制核心,肩负这智能控制的强大任务。单片机到底是何方圣神?它都能用来干些什么?它如此地神通广大,到底暗藏着怎样的玄机?接下来,我们将走进单片机的“内芯”世界,探寻单片机这神奇而有趣的世界。
单片微型计算机(MCU)简称为单片机,是一种将*处理器(CPU)、只读存储器(ROM)、随机存储器(RAM)等集成在一块硅片上的超大规模集成电路芯片。它高可靠性、高性价比、低电压、低功耗,可以集成在产品内部,作为产品的控制核心,广泛应用于智能仪器仪表、程控玩具、工业控制系统、数据采集、消费类电子产品等。当然我们知道,计算机可以进行信息处理和控制,但是普通的PC机体积较大且功耗也很高不适合嵌入到小巧的电子产品中进行控制,所以人们把组成计算机的基本部件:CPU、ROM(相当于电脑的硬盘)、RAM(相当于电脑的内存条)等通过超大规模集成电路技术放在一块硅片上(如下左图为直插式的单片机芯片,右图为芯片原理图),有些芯片只有指甲盖大小(如贴片式芯片)。
单片机也叫做嵌入式微控制器,在嵌入式领域的低端电子产品占据霸主地位,最简单常用的要属MCS-51单片机,许多芯片也都使用51单片机的cpu内核,许多单片机爱好者也将这款单片机作为跨入单片机领域的入门选择。当然,接触过51单片机的开发人员都了解,这款单片机太过于简单,片内外设也寥寥无几,但是做一些简单的DIY或简单的控制已经足够了。除了51单片机,市面上主流的单片机还有AVR 、PIC、430等,按照cpu一次性能处理数据的位数有8位、16位、32位不等(以下为单片机的开发板)。
单片机的“内芯”世界
介绍到这里我们对于单片机有了初步的了解,那么言归正传,单片机的“内芯”世界到底是怎样的花花世界呢?cpu又是如何协调各个部件有条不紊的进行控制呢?下面就带领大家,走进单片机的“内芯”。
如上图,是单片机的内部结构组成。主要包括:*处理器(CPU)、内部的数据存储器(ARM)、内部的程序存储器(ROM)、定时/计数器、可编程的并行I/O、串行通信接口、中断的控制系统、时钟电路。接下来分别介绍这些部件。
(1)*处理器(CPU)
*处理器作为单片机的核心部件,由运算器和控制器组成,完成算术/逻辑运算和控制功能。当然,它的结构相当地复杂,内部都是一些组合逻辑电路和时序逻辑电路。cpu会根据时序控制程序指令的执行,将一些数据从存储器中取出加载到寄存器中运算,再去控制相应的执行部件。当然你会疑问:cpu是如何知道指令在哪里的呢?这就要说到一个叫做PC的寄存器了,它指向的是下一条将要执行指令的地址,cpu就是根据PC的值去ROM中取指令的,这就相当于一个指挥棒一样,它指向哪里程序就执行到哪里。一般都是使用C语言来设计程序(当然一些对效率和精确度要求较高的场合使用的是汇编),但是最终还是会转化为汇编到最后的二进制机器码,这些都是一些集成开发环境提供的编译器来完成一些转化操作,最终通过烧写器把机器码烧写到芯片内。
(2)内部的数据存储器(RAM)
上文中我们提到RAM是随机存储器(类似与内存条),为何到这里成了数据存储器呢?不要纠结,这里说的是同一个意思,因为RAM这芯片中是作为存取临时的数据来使用的,在我们的程序中会使用很多的变量(数据),这些变量在程序运行时在这里开辟空间的。当然,又称它为随机存储器,是因为变量存放在这里面是可以随时随着程序执行修改的,它有个最大特点就是系统掉电之后存放这里面的数据就丢失了。一般在这个存储器中都会有一些承担着特殊任务的存储单元,这就是特殊功能寄存器(SFR),咱们使用单片机对外设的控制都是通过设置这些功能寄存器来实现的(例如:P0=0xfe, 使P0.0口输出低电平),使用汇编语言可以通过指令直接操作这些寄存器的(例如:MOV P0, #0xfe)。
(3)内部的程序存储器(ROM)
这里实质上是只读存储器(类似于硬盘),用于存放程序指令和固定的原始数据。烧写器所烧写的二进制机器码就放在这个存储器中,它的容量大小就决定了你所写的程序的大小。由于单片机只是进行低端的控制,所以一般单片机不跑操作系统,不能进行复杂的控制工作也不能执行多任务,从头到尾一个进程在跑,都是将运行的代码写在一个大循环中,如果要处理突发事件就会跑到中断处理程序中执行中断处理相关代码,这就是后面要说到的中断控制系统所做的工作。
(4)定时/计数器
定时/计数器用于完成一些定时和计数的功能。定时功能是由晶振分频后得到的特定频率的脉冲,通过信号的放大整形后就是矩形脉冲,通过设置相关的寄存器就能设置特定的时间,计时时间到后会触发定时器中断,类似于我们使用一个闹钟,定时时间到后“闹醒”我们。当然单片机内的定时器是可编程的能产生中断的定时器,定时时间到后程序会跳转到中断处理程序中执行我们想要干的事。计数功能是记单片机的外部引脚输入的脉冲信号,例如流水线上我们通过光电传感器来计数通过的产品个数,这就利用了单片机的计数功能。
(5)可编程的并行I/O
单片机都会有并行的I/O端口来实现并行数据的输入/输出,这样就可以来接受外部的信号以及输出我们想要输出的控制信号。例如:我们要驱动一个数码管显示一些数码,就需要利用这些IO口的不同编码来驱动其显示。一般一些电子产品都会有声音、报警提示都是利用IO口来驱动蜂鸣器等来实现。还有就是我们要使用单片机控制一些强电设备,这个时候就需要IO口驱动继电器来间接操作设备(有时是用光耦等来做隔离)。可以这样说:并行的IO口就是单片机的执行机构,去驱动外部设备,达到我们想要的控制功能。
(6)串行通信接口
这里所说的单片机的串行通信指的是通用异步收发器(UART),是一种全双工的异步的串行通信方式(俗称串口),不像并行的IO使用多条信号线,串口只是采用两根线就能和其他的单片机或者是PC机完成通信,一条是数据接收(RXD),一条是数据发送(TXD)。这个串行口不仅可以作为全双工的异步通信收发器来使用,还能作为同步的移位寄存器使用。例如:下位机的单片机将采集的数据通过串口将数据显示在上位机(PC机)的上位机软件的图形化界面上。当然,处理串口之外单片机还能使用其他的串行通信方式:如I2C、SPI、单总线等。现在大多数单片机都把这些功能集成到芯片内部,直接可以通过设置相应的寄存器来实现数据的串行通信。
(7)中断的控制系统
中断控制系统是为了应对程序在执行过程中所遇到的突发事件,例如:程序运行过程中,我们需要通过按键对产品进行人为的干预,设置一些必要的参数等。中断的处理过程就是:当CPU执行正常的程序的时候,突然接收到一个中断请求,那么中断系统就会让CPU停止当前正在执行的程序,转而去执行ROM中特定的程序(中断处理程序),执行完该段程序后会继续执行先前被中断的程序。单片机中一般都有定时器中断、外部中断和串口中断,当定时的时间到了就会产生定时器中断,外部中断引脚发生电平的变化后会产生外部中断,串行数据收发完毕之后就会产生串口中断。
我们知道了中断是如何产生的和哪些突发事件会产生中断,那么问题来了:执行完中断后为何还能回到原来被中断的位置呢?中断处理的原理又是怎样的呢?我们知道指令代码存放在ROM中,当中断产生的时候,单片机会将PC的值和其他的一些可能被覆盖的寄存器的数据保存在堆栈(一块特定的内存空间)中(叫做现场保护),然后就会根据一个叫做中断向量表的东西找到中断对应的入口地址,取出入口地址所对应的指令去执行,当然一般入口地址中存放的都是一条跳转指令(如:SJMP uart_irq),这条指令会使程序跳转到一片”广阔“的区域去执行相应的中断处理程序(叫做中断响应),当执行完中断处理程序之后,程序要想回到原来被中断的位置,必须知道其指令所在的地址,幸好之前我们已经保存了这个值那就是PC的值,就可以把这个值从堆栈中弹出到PC中,被保护的数据也会恢复到相应的寄存器中(叫恢复现场),这时就可以接着往下执行了。就好比老师在讲课,突然要接一个电话,于是老师就会把讲到了书的页码和位置记录下来,然后去接电话,接完电话后,回到教室根据页码找到刚才所讲的位置继续往下讲。
(8)时钟电路
时钟电路用于产生时钟信号给内部各个电路,从而能有条不紊地控制这些电路。CPU在执行指令的时候也是离不开时钟电路提供的时序的,每个机器周期会执行特定的指令,当然主频越高CPU的处理指令和运算数据的速度越快。没有时钟电路单片机是万万不能工作的,时钟频率太低影响程序运行的速度,太高会导致产品的功耗较大,所以每种单片机都会有特定的工作频率需要对应的晶振时钟电路(如下图左)。
除了这些片内的部件外一般单片机都会有复位电路来实现上电的自动复位和手动复位(如上图右)。很多人对于复位电路搞不明白不了解复位过程或者是只知道有复位这个功能。那么到底什么是复位呢?又是如何通过外部的简单电路实现复位的呢?下面我们就来说说复位:首先复位相当于我们使用的PC机的重启,就是通过复位电路让单片机的CPU从最开始的位置执行指令。以下是51单片机的复位电路(为高电平复位),复位原理是:系统刚上电时,电容器C被充电,电容器相当于短路(暂态过程分析),单片机的复位引脚(RST)为高电平,并持续一段时间(对我们来说很短),只要高电平持续24个机器周期就可以使单片机完成复位,当电容器充满电后,电容器相当于断路,没有电流通过电阻器R,RST接地,即是变成了低电平,这时候CPU就从最开始的位置执行指令。当按下按键后,RST通过按键接高电平也就完成了手动复位。
说到这里,我相信大家对域单片机的”内芯”世界有了一定的了解,当然单片机的片内外设可能远不止这些,例如:提高系统稳定性的看门狗,进行模数/数模转化的ADC/DAC等等。回到单片机的原理本质其实并不难理解:无外乎是CPU从程序存储器中取出指令,并执行指令的过程。我们所设计的无论是C语言单片机程序还是汇编语言程序归根到底要转化为最终的二进制机器码,通过最终的组合逻辑和时序逻辑来完成我们想要实现的功能。
单片机的“内芯”世界
前面也提到过单片机一般都是单任务的程序,不能运行操作系统(有些单片机能跑一些小的操作系统如stm32就可以运行uC/OS II的小系统),只能进行一些简单的控制(相对而言),像一些复杂的多任务的功能和一些虚拟内存的管理等都不能完成 ,就需要我们的嵌入式微处理器(如:ARM)来运行操作系统(如:Linux),这里不在赘述嵌入式微处理器的内容。当然上述这些都是本人通过深入研究单片机和查阅一些权威资料对于单片机原理的一些理解,可能还有一些其他的理解,望给出宝贵的意见,以便以后的修改和更新。