专栏名称: EDN电子技术设计
EDN China电子技术设计为电子设计工程师和设计经理人提供前沿深度的电子资讯、设计实例应用方案。
目录
相关文章推荐
51好读  ›  专栏  ›  EDN电子技术设计

单片机入门大厂资料:硬软件工程师都应该掌握的知识

EDN电子技术设计  · 公众号  ·  · 2024-07-23 18:08

正文

本入门系列讲解作为嵌入式系统开发技术人员所必需具备的基础知识。这些基础知识是硬件和软件技术人员都应该掌握的共通技术知识。 
本系列分为5大部分,首先学习单片机的基本构成和工作原理、以及外围功能电路,然后,挑战一个实际单片机的运行。

1 单片机的基本构成、工作原理
2 单片机的外围功能电路
3 单片机的编程语言和开发环境
4 外围功能电路控制
5 中断

01
单片机的基本构成、工作原理
 


单片机是控制电子产品的大脑


现如今,我们生活中的许多电器都使用了单片机。例如:手机、电视机、冰箱、洗衣机、以及按下开关,LED就闪烁的儿童玩具。那么,单片机在这些电器中究竟做了些什么呢?


单片机是这些电器动作的关键,是指挥硬件运行的。例如:接收按钮或按键的输入信号,按照事先编好的程序,指挥马达和LCD的外围功能电路动作。


那么,单片机是如何构成的呢?


单片机是由CPU、内存、外围功能等部分组成的。如果将单片机比作人,那么CPU是负责思考的,内存是负责记忆的,外围功能相当于视觉的感官系统及控制手脚动作的神经系统。


图1:单片机的构成要素
尽管我们说CPU相当于人的大脑,但是它却不能像人的大脑一样,能有意识的、自发的思考。CPU只能依次读取并执行事先存储在内存中的指令组合(程序)。当然CPU执行的指令并不是“走路”、“讲话”等高难度命令,而是一些非常简单的指令,象从内存的某个地方“读取数据”或把某个数据“写入”内存的某个地方,或做加法、乘法和逻辑运算等等。然而这些简单指令的组合,却能实现许多复杂的功能。

会思考的CPU


让我们从CPU的构成来了解它的作用吧。

图2:CPU的作用

程序计数器


CPU读取指令时需要知道要执行的指令保存在内存的什么位置,这个位置信息称为地址(相当于家庭住址)。程序计数器(PC)就是存储地址的寄存器。通常,PC是按1递增设计的,也就是说,当CPU执行了0000地址中的指令后,PC会自动加1,变成0001地址。每执行一条指令PC都会自动加1,指向下一条指令的地址。可以说,PC决定了程序执行的顺序。


指令解码电路


指令解码电路是解读从内存中读取的指令的含义。运算电路是根据解码结果操作的。确切地讲,指令解码电路就是数字电路中学过的解码电路,只不过电路结构稍微复杂些,所以,指令解码电路的工作原理就是从被符号化(被加密)的指令中,还原指令。

运算电路


运算电路也称为ALU(Arithmetic and Logic Unit),是完成运算的电路。能进行加法、乘法等算术运算、也能进行AND、OR 、BIT-SHIFT等逻辑运算。运算是在指令解码电路的控制下进行的。通常运算电路的构成都比较复杂。


CPU内部寄存器


CPU内部寄存器是存储临时信息的场所。有存储运算值和运算结果的通用寄存器,也有一些特殊寄存器,比如存储运算标志的标志寄存器等。也就是说,运算电路进行运算时,并不是在内存中直接运算的,而是将内存中的数据复制到通用寄存器,在通用寄存器中进行运算的。


CPU的工作原理


让我们通过一个具体运算3+4,来说明CPU的操作过程吧。

假设保存在内存中的程序和数据如下。
◇步骤1:当程序被执行时,CPU就读取当前PC指向的地址0000中的指令(该操作称为指令读取)。经过解码电路解读后,这条指令的意思是“读取0100地址中的内容,然后,保存到寄存器1”。于是CPU就执行指令,从0100地址中读取数据,存入寄存器1。
  • 寄存器1:0→3(由0变为3)

  • 由于执行了1条指令,因此,PC的值变为0001


◇步骤2:由于PC的值为0001,因此CPU就读取0001地址中的指令,经解码电路解码后,CPU执行该指令。然后PC再加1。
  • 寄存器2:0→4(由0变为4)

  • PC:0001→0002


◇步骤3:由于PC的值为0002,因此CPU从0002地址中读取指令,送给指令解码电路。解码结果是:将寄存器1和寄存器2相加,然后将结果存于寄存器1。
  • 寄存器1:3→7

  • PC:2→3


于是3+4的结果7被存于寄存器1,加法运算结束。CPU就是这样,依次处理每一条简单的指令。

能记忆的内存


内存是单片机的记忆装置,主要记忆程序和数据,大体上分为ROM和RAM两大类。

ROM


ROM(Read Only Memory)是只读内存的简称。保存在ROM中的数据不能删除,也不会因断电而丢失。ROM主要用于保存用户程序和在程序执行中保持不变的常数。


RAM


RAM(Random Access Memory)是可随机读/写内存的简称。可以随时读写数据,但关机后,保存在RAM中的数据也随之消失。主要用于存储程序中的变量。


在单芯片单片机中(*1),常常用SRAM作为内部RAM。SRAM允许高速访问,但是,内部结构太复杂,很难实现高密度集成,不适合用作大容量内存。


除SRAM外,DRAM也是常见的RAM。DRAM的结构比较容易实现高密度集成,因此,比SRAM的容量大。但是,将高速逻辑电路和DRAM安装于同一个晶片上较为困难,因此,一般在单芯片单片机中很少使用,基本上都是用作外围电路。
(*1)单芯片单片机是指:将CPU,ROM,RAM,振荡电路,定时器和串行I/F等集成于一个LSI的微处理器。单芯片单片机的基础上再配置一些系统的主要外围电路,而形成的大规模集成电路称为系统LSI。

“为何要使用单片机……”


为什么很多电器设备都要使用单片机呢?


让我们用一个点亮LED的电路为例,来说明。如图3所示,不使用单片机的电路是一个由LED,开关和电阻构成的简单电路。


使用单片机的电路如图4所示。
很显然,使用单片机的电路要复杂得多,而且设计电路还要花费精力与财力。好象使用单片机并没有什么优点。但是,现在下结论还为时尚早。
如果我们让这个电路做一些比较复杂的操作,会怎么样呢。例如:如果希望LED在按下开关后,经过一段时间再点亮或熄灭,那么,对于安装有单片机的电路来说,只需更改单片机中的程序就可以了,并不需更改原电路。另一方面,对于没有单片机的电路来说,就必须在元电路中加入定时器IC,或者用标准逻辑IC和FPGA构成逻辑电路,才能实现这个功能。
也就是说,在更改和添加新功能时,带有单片机的电路显然更加容易实现。这正是电器设备使用单片机的原因。单片机可真是个方便的东西哦!

02
单片机的外围功能电路

来学习单片机必须具有的硬件电路(外围功能电路)。这样就可以将挑战一个实际单片机的运行了!

  • “动力”―电源电路
  • “总指挥”―振荡电路
  • 「闹钟」―复位电路


“动力”―电源电路


与迄今为止所学的各种电路相同,单片机的工作也需要电源。因此,单片机的外部都连接有象电池等电源部分。

图1:“RL78族 (RL78/G14)”(64引脚)的引脚连接图
图2:“RL78族(RL78/G14)”(64引脚)的电源电路连接实例
请看图1,该产品有64个引脚。电源有2个引脚是13/14号(VSS/EVSS0)和15/16号 (VDD/EVDD0),
  • 13号引脚(VSS)和14号引脚 (EVSS0)连接GND
  • 15号引脚VDD和16号引脚 (EVDD0)连接电源正极

参阅“RL78族(RL78/G14)”数据手册(或硬件手册),您会发现“电源电圧VDD = 1.6~5.5 V”。这是指当电源电压处于1.6V到5.5V之间时,可以保证单片机的正常工作。这个电压范围称为工作电源电压。在有些单片机数据手册上把这个范围称为推荐工作电压范围。
图2是 “RL78族(RL78/G14)”的电源引脚连接的一个例子。
  • 与15号引脚连接的C1称为旁路电容。可以防止因瞬间大电流引起的电源电压下降,而导致的单片机的误动作。通常选择0.01μF~0.1μF的陶瓷电容作为旁路电容。
  • “RL78/G14”的内部电路工作电圧是通过内部电压调节器调节电源电压得到的,内部电路的工作电压是1.8或2.1V。为了保证内部电压调节器的稳定性,在12号引脚上也连接了电容C2。

“总指挥”―振荡电路

时序电路是按时钟信号(CK)的上升沿(信号从L→H的变化)或下降沿(信号从H→L的变化)同步工作的。单片机是由时序电路构成的,所以,要在外部连接一个振荡电路提供时钟信号。象这样从单片机的外部输入的时钟信号称为“外部时钟信号”。


图3:振荡电路的作用
图3是单片机(RL78/G14)接连一个振荡电路的例子。晶体振荡器被连接在X1和X2之间。
从图上可以看出一个外部时钟信号可以驱动单片机内部中的2个时钟振荡器。
  • 主时钟振荡器主要用作CPU的工作时钟
  • 子时钟振荡器主要用作外围电路和实时时钟的工作时钟

在内部外围功能十分强大的“RL78族(RL78/G14)”上内部有频率偏差仅为1%的高精度振荡电路。因此,无需从外部提供时钟信号 。这种单片机上内部的时钟产生电路称为“内部振荡器”。因为不需要外部振荡电路,减少了设计工序,降低了成本。
类似这样只要备有“内部振荡器”,大家可能认为就可以“无需从外部提供时钟信号”。但实际上在电子手表中,通常使用频率几乎不随温度而变化的、更加精确的晶体振荡器。

「闹钟」―复位电路


刚刚接通电源的单片机内部处于不稳定的状态,CPU无法正常运转。因此,就需要进行单片机状态初始化,这就叫做复位。单片机带有复位信号输入引脚,可以将这个信号调至低电平状态后让单片机复位。也就是说通过输入复位信号来彻底叫醒单片机进入工作状态。


接下来讲解一下复位的时序(图4)。只有在向单片机提供稳定的时钟信号和电源的状态下才能实现复位,同时需将复位信号调至低电平。为了实现这种状态,需要将相比电源上电稍迟一步上电的电路与复位输入引脚相连接。这种电路在电源上电后通过电阻电流慢慢流向电容,电压缓缓上升。因此,电源上电后经过一段时间可以形成解除复位的电 路。这种外部电路称为“上电复位电路”。

图4:简易复位电路及其波形
如上图4所示,上电复位电路左侧的电路称为“手动按钮复位电路”。这是通过手动按下按钮后让单片机进入初始化状态的电路。
普通单片机上复位信号必须在一定时间内保持低电平。具体时间记载在硬件手册和数据手册上。必须根据这个时间的长短来确定电阻R和电容C。
而“RL78族(RL78/G14)”采用的是内部型上电复位电路。因此,只要提供超过工作电压的电源,就可以叫醒单片机进入工作状态。真是太方便了!

CPU的复位操作


通过复位操作,可以使程序计数器PC回到初始值,PC中保存的是CPU将要执行的指令地址。程序计数器PC的初始值是应用程序的头地址。单片机开始运行应用程序的方式有“固定地址开始方式”和“向量方式”。在设计单片机时,决定要使用的方式。

  • 固定地址开始方式是指从固定地址开始执行指令的方式。不同的单片机具体的地址也有所区别。如果固定地址是0,那么,就从0地址开始执行程序。
  • 向量方式是指从ROM的固定地址中,读取要执行指令的地址信息。这种ROM上的固定地址称为复位向量。操作过程是先取读复位向量的地址,然后再将该地址存入程序计数器PC。这种看起来比较繁琐,但是却具有可以自由更改初始执行指令地址的优点。

接下来,将学习单片机的开发环境,让你亲自驱动一个实际的单片机!


03
单片机的编程语言和开发环境
 

CPU懂的机器语言


单片机的CPU从存储器读取程序,但是一次只能读取一条指令,然后解释每条指令,并执行。存储器中保存的内容,不管是程序还是数据,都是二进制代码“0”和“1”组成的字符串。指令二进制代码告诉CPU要做什么,而数据二进制代码则是CPU操作或处理指令时要使用的值。CPU的操作包含加、减运算等指令。这些像密码一样排列的“0”和“1”字符串就是机器语言。比如图1左边显示的就是一个机器语言指令,意思是“将2放入寄存器A(寄存器是CPU内部的储存区域)。


CPU总是按存储器地址的顺序读取指令代码,除非遇到跳跃指令。例如,如果复位后的地址是0000,则从0000开始按0001、0002、0003的顺序读取并执行指令。也可以说,一个程序就是按处理要求排列一系列的机器语言。


CPU只能理解如上所述的机器语言。因此,为了使CPU运行,就必须使用机器语言的程序。但是,机器语言不易为人们识别和读写。因此,人们用了更简单易懂的字符串来代替机器语言,这就是汇编语言。例如,在“给寄存器A赋值2”这样的处理时,如果用汇编语言来表示,就很简单,请看图1的右边部分。汇编语言中,用MOV字符串表示赋值,所以“给寄存器A赋值2”的处理就可用“MOV A,#02”表示。


图1:机器语言和 汇编语言的比较
虽然汇编语言比机器语言更加简单易懂了,但是人们读起来还是挺难理解的。而且,汇编语言还存在另一个问题,就是不同的CPU,机器语言的描述方式也不同。因此,如果更换了CPU,就必须改写与机器语言有着密不可分关系的汇编语言,工作量比较大。(以上例子中的机器语言和汇编语言均为瑞萨的RL78族单片机中的语言。)
如上所述,每更换一次CPU都必须对程序进行改编,不但造成生产性低下,还加重了编程人员的负担。

人性化的C语言


能够解决上述问题的编程语言就是C语言。C语言具有不依存于特定的CPU,又具有程序移植性高等的特点。另外,由于编程时可使用人们熟悉的英文单词,所以对编程人员来说C语言是最容易使用的编程语言。下面我们将C语言和汇编语言做一个简单地比较。(图2)

图2:汇编语言和C语言的比较
虽然C语言不依存于CPU而且还是人们最容易使用的编程语言,但对于CPU来说,C语言却是一种完全无法理解的语言。因此,就需要一种可以将C语言翻译为机器语言的软件,这就是被称为编译器 (编译程序) 的软件。经过编译器翻译的程序的文件格式被称为目标文件格式。如果目标文件格式最终没有被配置到存储器中,CPU就无法执行该程序。
另外,近来由于程序越来越趋于复杂化,所以几乎都采取了将一个程序分割为多个C语言程序文件的结构。所以,还需要一个工具将多个目标文件格式汇总成一个机器语言并配置到存储器上,能够担当起此重任的就是连接编辑程序(linkage editor,也被称为“linker(链接器)”)。

能够找出程序错误的调试器


由人进行编程的应用程序难免会存在错误(bug)。而用来发现和帮助人们修正程序错误的工具被称为调试器(Debugger)。下面简单介绍调试器的类型。

电路内仿真器(In-Circuit Emulator , 简称:ICE) :
ICE可取代实际的单片机,与仿真专用的评价单片机(evaluation chip,评价芯片)连接并进行调试。

J-TAG仿真器:
J-TAG仿真器使用单片机内事先预留的调试电路进行调试。也就是说通过实际使用的单片机来进行调试。和ICE相比,J-TAG仿真器的价格较低。

简易仿真器:
简易仿真器是使调试用的监视程序在单片机上运行,在与PC通信的同时进行调试。除了调试对象的程序之外,还需启动其他监视程序,所以,与ICE或J-TAG仿真器相比,简易仿真器的程序运行速度慢而且还有各种功能限制。其最大的优点是价格非常低廉。


综合开发环境


正如上面所讲的,在进行单片机的软件开发时,使用了上述的编译器、连接编辑程序、调试器等各种工具。以前,这些软件都是作为单个软件分别提供的,一般是通过命令提示符调出各个程序、或是通过批处理程序调出使用。但是,已经有以综合开发环境的方式给予提供,综合开发环境就是将各种程序综合到一个程序包中。


04
外围功能电路控制
 

(SFR) Special Function Registers


单片机中有象箱子功能一样的地方,我们称为寄存器,用来暂存数据。寄存器的种类有程序计数器、通用寄存器、以及SFR(特殊功能寄存器)等。


SFR主要用来设定外围功能电路(计数器或串行端口、通用I/O等)的工作方式,确认其工作状况,并对其进行控制的。也就是说SFR并非仅仅只是用来保存数据的“箱子”。通过改变保存在“箱子”里的数据,不仅可以改变外围功能电路的动作方式,而且“箱子”里的数据也将随着外围功能电路的工作状况而改变。


控制外围功能电路的基础知识


下面以通用I/O为例来说明单片机对外围功能电路的控制。通用I/O具有以下功能:

  1. 输出功能:可以输出高电平电压或低电平电压
  2. 输入功能:可以读出输入到引脚的电压电平

首先来看输出功能的控制。图1中的引脚A是一个通用I/O。
如果向引脚A的寄存器(SFR)
  • 写入0,则引脚A的输出电压将为低电平(0V)。
  • 写入1,则引脚A的输出电压将为高电平(5V)。

图1:通用I/O的输出功能
如果将图1的引脚A连接一个LED,就可以构成一个控制LED的电路(见图2)。此时,向寄存器(SFR)写入0则LED亮灯,输入1则LED熄灭。虽然这是一种很简单的动作,但却反映了单片机对各种外围功能电路进行控制的基本原理。利用这种功能,就可以完成象电机的ON/OFF一样的开关作用(由于通常的单片机上不能流过驱动电机运行的大电流,所以还需另行准备用FET或晶体管作成的电机驱动电路)。另外,如果使用多个通用I/O端口,就可以完成更加复杂的控制。
图2:通用I/O的LED控制电路
接下来看输入功能(图3)。
  • 如果向引脚A输入低电平电压(0V),就会从寄存器(SFR)读出0。
  • 如果向引脚A输入高电平电压(5V),就会从寄存器(SFR)读出1。

即,读取寄存器(SFR)的值,就可以判断外部电压是低电平电压还是高电平电压。
图3:通用I/O的输入功能
图4:通用IO输入功能构成的开关电路
使用通用I/O的输入功能构成图4所示的电路,单片机就可以判断出开关(S)的状态。
  • 当开关(S)断开时,电源电压通过上拉电阻(R),连接到引脚A(相当于输入高电平电压),寄存器(SFR)将的值变为1。
  • 当开关(S)关闭时,引脚A被连接到低电平电压,寄存器(SFR)的值变为0。
单片机通过读取引脚A的寄存器(SFR)的值,是“1”还是“0”,可以判断外部开关(S)是断开还是关闭状态。
单片机上搭载了各种功能的SFR。通过程序来更改或读出这些功能寄存器的值,就可获知单片机外围电路的信息,而对外围电路进行控制。所以可以说,SFR就象是单片机的五官或者手脚。
以上就是单片机控制外部外围功能的基础知识。下期是本系列的最后一期,我们将说明关于中断的内容。敬请期待。


05
中断
 

“中断”与“轮询”


本期我们将说明在单片机编程过程中一定会遇到的、也是单片机控制中不可缺少的一种处理方式---“中断”。   


图1:“中断”处理 示意图
“中断”处理并非单片机控制系统所特有的现象,在我们的日常生活中“中断”的例子也随处可见。让我们来看看身边的例子吧。比如尽管您知道今天有快递送到,但却不知道快递送来的具体时间,在这种情况下,也许您会选择坐在客厅里边看书,边等快递送来。在您看书其间,门铃响的时候就表明快递到了(有事件发生)。这就是“中断”的例子。   
如果不用“中断”处理等待方式的话,在看书的过程中,您就不得不经常走到门口去确认快递是否到了。像这样频繁地确认是否有“事件”发生的现象,在单片机控制中是通过软件编程完成的。我们把这种处理方式称为“轮询”(图2)。
图2:“轮询”处理示意图

单片机中的中断处理


实际上单片机的中断处理更加复杂,还是以上述事例(边看书边等待快递送来)进行说明。

现在,相信大家对“中断” 已经有所了解了。下面我们来看看在实际的“中断”处理中,单片机内部是怎样进行的。
在单片机中,通知事件发生的中断信号一般来自于外部INT引脚的输入信号,或是来自定时器、串行I/F等内部的外围功能电路的信号。接收中断信号的是中断控制器。中断控制器根据产生的中断信号的优先级,按优先级顺序发送给CPU。当然,被设定为无效的设备所传送来的中断信号是不会传给CPU的,您也可以屏蔽或忽略它们。CPU根据从中断控制器接收到的指示,执行相应的程序(中断处理)。

图3:单片机内部的“中断”处理

实时处理中断


“中断”与“轮询”看起来好象可以进行同样的处理,实际上它们有很大的区别。区别在于当事件发生时,中断方式可以立刻执行对应事件的处理。中断的这种处理方式被称为是实时处理。


而在“轮询”方式中,如果对发生事件的监视周期较短的话也可以实现实时处理,但是在通常情况下,总是有多个事件发生,有时主程序也不允许太短的循环,所以,难以实现实时处理。


当 “中断” 发生时,由于从检测到事件发生到切换到中断处理只需要几十至几百个时钟,所以可以在短时间内对应事件进行处理。


例如,在键输入或开关输入的情况下,对于单片机来说开关何时将被按下是不可预测的事件。所以,如果在主程序中以“轮询”的方式监视的话,将会无端浪费CPU的处理时间,而且,如果要进行多个“轮询”处理,则“轮询”的周期将会变长。


如果不具备单片机的硬件知识,是很难理解和应用“中断”的。“中断”的内容也确实有些难度,但是它却是单片机系统控制中无法避开的一种处理。所以,大家一定要加深对单片机知识的理解,并熟练掌握“中断”的基本知识和使用方法!


本文单片机入门系列共分5期,讲解了单片机的基础知识。希望对你有所帮助。


来源:renesas官网

END

电路图集

常用模拟电路 | 运放电路 | 保护电路 | EMC标准电路 | 电源电路大全 | 实用控制电路 | 单片机应用电路 | 波形发生电路 |  汽车电路图大全 | 555电路 | 小家电电路  9大基本模块电路 | 原理图英文缩写  | 电路图符号 

入门基础

电路基础 | 数字电路 | 示波器基础 | 万用表使用 | 信号完整性 | 地线知识 | 嵌入式基础  STM32基础知识总结  | C语言知识点

元器件

电阻 | 电容 | 电感 | 二极管 | 三极管 | TVS | 晶闸管 | MOS管 |IGBT | 传感器 | 继电器 元器件等效电路| 元器件选型完全指南 | 元器件故障

加入社群

如果您想加入电子行业相关社群,您可以扫码添加我们社群运营同事。并备注您入群需求及关键词即可。(关键词指目标技术领域