微控制单元:全称微控制单元,简称MCU。 从字面意思上我们可以理解为微型计算机系统。 那么通过比较我们就会明白为什么是微机系统了。
母板
我们先来看看我们熟悉的电脑主板。 有人可能会问,我是来学习单片机的。 为什么要向我介绍主板? 我们在这里用主板来比喻。 上面我们看了很多东西,估计很多用久了的人都不知道单片机和代码是什么。
我在这里找到了电脑主板的电路框图。 这是一款带有 DDR2 内存的较旧主板。 从下面的框图中我们大概可以看出,大的部分包括CPU、北桥、南桥; 最底层的南桥主要负责这些低速设备,包括USB、PCI、SATA、BIOS等外设。
真正的电脑主板
电脑主板原理框图
手机“CPU”
这里CPU之所以加引号,是因为CPU指的是中央处理器,而我们手机的处理器不仅仅只有中央处理功能。 这是2021年5月联发科天玑900处理器的最新版本,我们来看看左边的介绍。 有CPU、GPU、5G和WIFI模块,还有人工智能APU。 比较主板,看看是否发现任何共同点。 观点。 是的,手机处理器将所有这些外设集成到一个芯片中。 事实上,最新的CPU也在朝这个方向发展。 现在已经有很多CPU集成了显卡。
那么我们可以想一想,我其实并不需要电脑CPU和手机处理器强大的性能和众多的功能。 我只需要控制I/O、串口通信等,你觉得删掉那些不必要的东西,增加简单的计算单元,然后提高它的可靠性可以吗? 答案肯定是肯定的,这也意味着我们思考的问题和这些计算机科学家思考的问题是一致的。 我们往下看。
联发科天玑处理器
微控制器的内部元件
我们看下图,这是学校和课本上最常用的51单片机。 还包括一个CPU(8051核心),可怜的1K的SRAM(内存),还有只有几十K的闪存(硬盘),然后外围的模块基本都是ISP、EEPROM、看门狗、复位模块、串口用于下载代码的端口模块、中断模块和基本输入输出I/O模块。
STC89C52RC内部框图
PIC16单片机内部框图
MSP430单片机内部框图
典型STM32内部框图
由于单片机主要应用在一些价格敏感的领域,因此这类单片机的种类很多。 比如我们常用的51单片机。 主要应用包括数字家电(洗衣机、电饭锅、电磁炉、微波炉)、工业现场数据采集和传输等,但随着其价格优势减弱和易用性逐渐被32-市场上的位单片机,我们看下图,看看大家熟知的STM32的内部结构是不是感觉比51单片机复杂很多。 拥有51单片机的所有外设,而且这些模块功能更加强大; 它还具有51单片机没有的模块,如调试功能模块、RTC模块、USB模块、CAN总线模块、ADC、SPI、I2C等。
我们来看一下MCU和人的对比。 CPU相当于人的大脑,用来处理来自各个模块的信息。 那么I/O输出就相当于人手。 CPU+RAM+FLASH相当于人的大脑。 I/O输入和A/D相当于人的皮肤和眼睛,用于接收外界温度和图像信息输入; 而串口、SPI、I2C等总线就相当于耳朵和嘴的配合,一方面接收其他控制器发过来的信息,另一方面将要传输的信息发送出去。
微控制器如何工作?
我们先举个例子:我们想住酒店。 我们如何知道您想住在哪里? 是的,这就是房间号。 该房间号是由酒店预先设定的。 然后我们就可以通过唯一的房间号找到这个房间; 如果这是我们公司,我们每个大房间里都挤满了职能组在那里工作,然后我们的项目经理接到领导的指示后,就不断地去各个房间寻找对应的职能部门来完成任务。
我们的微控制器也是如此。 我们所有的外设都挂在微控制器的可访问地址上。 我们需要预先定义微控制器的地址。 否则我们将无法找到该地址对应的是哪个设备,也就没有办法对其进行操作。 其实单片机的地址是我们为了实际使用方便而编造的。
CPU是如何执行程序的?
1、我们先看一下两位全加器。
A = 01B = 1H
B = 11B = 3H
A + B = 1 + 3 = 4 = 100B
Proteus仿真文件:
MCU-CPU_2bit_Fulladder.pdsprj
16.1K
·
百度云盘
为了方便更多位的运算,我们使用内部集成8个全加器芯片74283进行运算
数据1 = 0000 0101B = 5H
数据2 = 0000 1010B = 10H
总和 = 0000 1111B = 15H
2、那么数字电路是如何进行加、减、乘、除运算的呢?
注意:这里我们不考虑一些特殊情况。 我们的8位数字最大可以表示的数字是255,所以我们只考虑该值小于255的情况。更深入的讨论,大家可以去找更专业的资源来学习。
加法运算:
假设我们要执行8+13运算:
十进制运算:8+13=21;
二元运算:0000 1000 + 0000 1101 = 00010101;
我们用8位全加器来验证一下
Proteus仿真文件:
MCU-CPU_8bit.pdsprj
17.4K
·
百度云盘
减法运算:
加法涉及进位,而减法则需要考虑借位。 这是小学时加减法的经验,但计算机不是这样处理的。 计算机只有加法,没有减法。 那么 int a = b – c 是如何得到结果的呢? 首先我们要明白一个概念——补语。
计算机中的有符号数,以最高位作为符号位,“0”代表“+”,“1”代表“减-”; 其余数字用作数字位来表示数值。 例如Byte类型的取值范围是-128~127,其中代表数值的只有7位,第一位代表正负。
补码规定正数和0的补码是它的原码(原码和补码的定义这里不再赘述),负数的补码是原码的反码正数代码加1。
例如求负数-10的补码:十进制10(以8位为例)的原码为0000 1010,其补码为1111 0101。反转加1后,补码为1111 0110。因此,负 10 的补码是 1111 0110。
不知道写完这篇之后,大家有没有发现什么端倪呢? 让我们回到减法计算。 a = b – c 实际上相当于 a = b + ( -c )。
情况 1,减数 > 被减数
Proteus仿真文件:
MCU-CPU_8Bit_NOT.pdsprj
18.7K
·
百度云盘
情况 2,减数 > 被减数
通过这两个例子,是不是清楚了计算机是如何计算减法的呢?
乘法运算:
通过谈论减法,我们是否也获得了乘法的一些启发呢? 乘法实际上是循环加法。 例如,5 * 3 实际上是 5 + 5 + 5。看起来就是这样。 事实上还不止于此。 现在有一种电子设备叫乘法器,可以进行二进制乘法、除法等运算。 我们还以5*3为例来解释乘法器的乘法过程。
提示:当然也可以通过移位电路进行输送。 这里我就不举例了。
虽然CPU中存在乘法器,但我们发现实际最终的运算过程仍然是由加法和位移运算计算出的乘法运算。 我们不确定我们编写的代码中的乘法是使用乘法运算还是转换为加法运算。 有些编译器在编译时会对代码进行优化,选择最优的算法来计算结果。
分部操作:
除法可以通过减法来实现。 例如,10 / 3 相当于 10,继续减去 3,直到被减数小于 3。减去 3 次后,10 / 3 的结果为 3,余数为减后的剩余值 1。 。
其实上面已经提到了乘法器,除法的原理也类似(这里不讲浮点数的除法,只讲整数的除法),只是稍微复杂一些。
我们也举个例子来说明一下。
提示:这只是此处显示的除法运算之一。 您可以考虑其他除法运算的方法,例如使用移位方法。
那么我们来看一个完整的CPU运算电路
有兴趣的朋友可以参考以下链接:
它包含了完整的8位与运算电路、或运算电路、右移运算电路、左移运算电路、加法运算电路等。我们在实际操作时,通过对取出的指令进行内译来确定当前的操作。 是对外部I/O的加法操作、移位操作还是锁存操作。
那么这里我们发现复杂的运算会产生中间数据,比如乘法和除法,需要经过多次计算才能得到结果,所以我们需要寄存器来暂时存储这些数据,以便我们进行计算。
CPU执行整个程序的流程分解
我们以这段代码为例来详细解释一下。
#include
sbit LED = P0^0;
void delay( unsigned int nTime)
{
unsigned char i;
while(nTime--)
for(i=10; i>0; i--);
}
void main()
{
while(1)
{
LED = 0;
delay(10);
LED = 1;
delay(10);
}
}
我们再看一下组装说明。 我们的程序从 main 函数开始执行。
C:0x0000 02002D LJMP C:002D
5: void delay( unsigned int nTime)
6: {
7: unsigned char i;
8: while(nTime--)
C:0x0003 EF MOV A,R7
C:0x0004 1F DEC R7
C:0x0005 AA06 MOV R2,0x06
C:0x0007 7001 JNZ C:000A
C:0x0009 1E DEC R6
C:0x000A 4A ORL A,R2
C:0x000B 600B JZ C:0018
9: for(i=10; i>0; i--);
C:0x000D 7D0A MOV R5,#0x0A
C:0x000F ED MOV A,R5
C:0x0010 D3 SETB C
C:0x0011 9400 SUBB A,#0x00
C:0x0013 40EE JC delay(C:0003)
C:0x0015 1D DEC R5
C:0x0016 80F7 SJMP C:000F
10: }
11:
C:0x0018 22 RET
12: void main()
13: {
14: while(1)
15: {
16: LED = 0;
C:0x0019 C280 CLR LED(0x80.0)
17: delay(10);
C:0x001B 7F0A MOV R7,#0x0A
C:0x001D 7E00 MOV R6,#0x00
C:0x001F 120003 LCALL delay(C:0003)
18: LED = 1;
C:0x0022 D280 SETB LED(0x80.0)
19: delay(10);
C:0x0024 7F0A MOV R7,#0x0A
C:0x0026 7E00 MOV R6,#0x00
C:0x0028 120003 LCALL delay(C:0003)
20: }
C:0x002B 80EC SJMP main(C:0019)
C:0x002D 787F MOV R0,#0x7F
C:0x002F E4 CLR A
C:0x0030 F6 MOV @R0,A
C:0x0031 D8FD DJNZ R0,C:0030
C:0x0033 758107 MOV SP(0x81),#0x07
C:0x0036 020019 LJMP main(C:0019)
提示:默认情况下,我们的单片机会跳转到main函数执行。
第一步:获取说明
C:0x0019 C280
PC计数器指向读取指令的地址,然后将其存储在指令寄存器中。 由指令译码器译码后送至计算单元执行相应的运算。 例:我们的单片机程序一般直接跳转到main函数,则PC=地址0x0019处的命令为C280
第二步:解码
清除 LED (0x80.0)
指令寄存器中的指令由译码电路译码,然后CPU根据译码结果进行加、减、乘、除、移位等运算。 例:通过译码电路可知C280表示C2表示清位指令
第三步:执行
在执行阶段,算术/逻辑单元(ALU)根据指令的类型用于不同的目的。对于其他指令,它将充当加法器来递增或递减堆栈指针,或者计算有效地址,或者只需添加 0,将输入传递到输出即可。
例:相当于清零0x80的第0位,即将P0.0置低,然后PC更新PC的值。 如果不操作PC值,它会自动累加。 自动累加后为0x001B,然后继续下一步。 一个循环操作就完成了我们整个程序的执行。
这里我们只给出程序是如何执行的一个大概的轮廓,省略了很多详细的操作。 您可以参考更详细的程序执行流程进一步参考。
晶振在单片机中起什么作用?
以上操作我们都是手动进行的。 我们知道,数字电路本身是不能工作的,也不能工作。 否则,电路就会出现问题。 它必须依靠其他电路产生的高低电平来驱动它工作。 ,我们将这种规则的高电平和低电平定义为脉冲。 微控制器也是一个数字电路。 它是如何工作的? 我们必须有一个带有能源的电路,能够不断地产生脉冲,这样它才能继续工作。 这就是为什么晶振被称为单片机电路中的“心脏”。 如果我们去掉这个“心脏”,整个微控制器系统也会罢工。
为什么有些微控制器没有晶振? 我们知道单片机只需要连续的脉冲输入即可工作。 在某些情况下,我们对微控制器没有精确的时间要求。 因此,我们一般采用内部振荡器为单片机提供时钟脉冲,保证单片机的正常工作。 因此,在有些地方我们看不到晶振。 这是因为它内部有RC振荡电路。
复位:CPU需要有一个初始状态来执行程序,可以通过复位进入初始状态。 这样,单片机就知道它的起始位置,并且可以按照既定的方式运行程序。