【计算机组成原理】3.2.0+3.2.3 主存储器的基本组成

2024-08-31 21:52

本文主要是介绍【计算机组成原理】3.2.0+3.2.3 主存储器的基本组成,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

3.2.0+3.2.3 主存储器的基本组成

00:00

各位同学大家好,在这个小节中我们会学习主存储器的基本组成。这个小节的内容本来是在王道书里的3.3那个小节,但是我们会把这部分的内容把它提到3.2之前来讲解。因为学习这个小节的内容,可以让大家能够对主存储器的基本原理能有一个宏观的认识,然后我们再回去学习3.2会更容易理解。

00:25

在这个视频中我们首先会学习使用半导体元器件来存储二进制0和1的一个基本的原理,然后通过半导体元器件的一个组合,我们可以构成所谓的存储芯片。由于存储芯片里边存储了很多个字的数据,因此存储芯片必须提供一个寻址的功能。在这个小节的最后,我们还会探讨不同的寻址方式如何实现。

00:51

好的,首先我们来看一下组成主存储器的基本的半导体元件,还有它工作的一个原理。在第一章里面我们说过,一个主存储器逻辑上可以分为存储体,MAR和MDR这样的三大部分。其中MAR是地址寄存器,MDR是数据寄存器。这三个部分会在时序控制,逻辑这些电路的控制下,有条不紊的相互配合着工作。

01:17

好,之前我们说过存储体就是用来存放实际的二进制数据0和1的,一个存储体由多个存储单元构成,而每一个存储单元又由多个存储元来构成,也就是存储元件。用这样的一个存储元件,我们就可以存放一位的二进制0或者一。

01:38

这里边涉及到两个半导体元器件,下面这个部分是电容,上面这个部分是一个MOS管。可能很多同学没有学过数字电路这门课,这简单的解释一下,我们可以把MOS管这种半导体元件,把它看作是一种可以用电来控制的开关。如果说我们在这个MOS管的这一端输入了一个高电压,比如这个电压达到了5伏这样的一个阈值,那么这个MOS管它就可以导通,它就可以导电,而如果我们不给这一端加电压,或者电压不到阈值的要求5伏的话,那这个MOS管就是一个绝缘体,它是不导电的,所以我们在这个地方把它画成了虚线。所以为什么这种元器件我们会把它叫做半导体呢?因为它既不是导体,也不是绝缘体,在给了一定的电压条件的情况下,这个绝缘体可以变为导体,而如果我们给的电压条件不满足足的情况下,它又不是导体。所以MOS管就是一种典型的半导体元器件。

02:42

好,再看另外这个元器件,电容。电容是我们在高中阶段学过的东西,一个电容有两个金属板,还有中间的绝缘体构成。下面这块金属板这个地方画了三条线,表示的是它是接地的,那我们知道接地的话,相当关于这边的电压应该是0伏,对吧?那现在如果我们给上面这一块金属板加一个大于0伏的电压,比如说加一个5伏的高电平电压。由于这两块金属板产生了这种电压差,因此这个电容里面的电荷就会开始移动,也就是所谓给电容充电的一个过程。那当我们输入一个5伏电压之后,这个电容里边就可以保存一定的电荷,而如果我们在上边输入的是一个低电平信号,比如说0伏或者1伏,由于上面这块金属板和下面这块金属板的电压差非常小,所以这种情况下电容不会充电。所以接下来我们可以根据电容是否保存了电荷两种状态的信息,来对应二进制的零和一。来看一下,假设现在这个电容上是保存了一些电荷的,我们规定当它保存了一些电荷的时候,它表示的是二进制的一,那接下来我们如何读取这个二进制的比特位呢?很简单,我们只需要给这个MOS管的这一端加一个高电平信号,5伏的高电平信号也可以理解为是输入一个二进制的一,那么刚才我们不过当MOS管的这一端输入电压达到一定的阈值之后,达到5伏之后,这个MOS管就可以接通,相当于这个开关可以开始导电。

04:24

由于MOS管接通了,所以此时电容里边保存的这些电荷就可以顺着这个导线往外流,当我们在这一端检测到有一个输出电流的时候,就意味着此时它输出了一个二进制的一。再换一种情况,如果本来这个电容它里边没有保存电荷,也就是说这种状态表示二进制的0,那么当MOS管接通的时候,我们在这一端并不能检测到有电荷的流出。因此在这种情况下,我们就可以判断这个电容里边保存的是二进制的0。这是读出一个二进制的原理。

05:03

再来看写入一个二进制的原理。假设现在我们想要让这个电容保存一个二进制的一,那么我们可以在这一端导线的这一端(右侧)加一个5伏的高电平,同时给这个MOS管也加一个5伏的高电平,这样的话MOS管可以接通。接通之后是不是意味着电容上边这一块金属板它的电压应该是5伏,而下边这个金属板由于是接了地,所以它是0伏,那只要电容的两块金属板之间有这种电压差,就会导致这个电容里面的电荷开始移动,于是这个电容就会存储一些电荷,也就是存储了二进制的一,那接下来我们再让这个MOS管断开,这样的话电容里的电荷是不是就跑不出去了?好,所以这就是存储元件存储二进制0和1的一个原理,需要用到一个MOS管和一个电容。

05:57

好,接下来如果我们把多个存储元进行科学合理的连接,那么我们就可以一次性读出或者写入多个二进制数据。比如现在上面这一排存储元,它们存储的二进制信息分别是这样的一些值,那注意这张图里有一条红色的线,这条线连接了每一个存储元的这个MOS管,因此如果我们给这条红色的线加一个5伏的高电平,是不是就意味着所有这些存储元的MOS管都可以被导通?当MOS管导通之后,电容里存储的电荷就可以顺着这条线,然后往绿色这条线往外导出。也就是说我们只需要监测每一条绿色的线有没有产生电流,我们就可以判断每一条线它所对应的是二进制的零还是一。如果有电流,那么意味着产生的是一个二进制的一,如果没有电流,那么就意味着产生的是一个二进制的0。好,所以用这样的方式我们就可以读出这一整行的这个存储元所存储的这些二进制比特的信息。

07:04

好,这样的一整行就是我们之前提到过的存储单元,也就是一个存储字。而多个存储单元就构成了我们之前提到过的存储体,也可以叫做存储矩阵。我们一次可以读出的这些二进制位就是一个存储字。

07:23

像这个例子当中,存储字长就应该是八个比特,因为我们一行总共有八个存储元。如果说我们再让这个存储元更多一些,比如说有16个存储元构成一行,那么是不是就意味着存储字长就变成了16比特?

07:39

好,讲到这儿大家应该就能够理解为什么我们在第一章的时候说过,存储器每一次读或者每一次写的单位都是读或者写一个存储字。因为从属于同一个存储字的这些存储元件,他们的MOS管这一端都是接了同一根线的,如果要接通,那么就是整个字的所有这些存储单元同时接通,也就可以同时被读出或者同时被写入。

08:07

好,另一点再次强调要注意字节和存储字的一个区别。一个字节一定是等于八个比特,而一个存储字等于多少个比特,这个具体得看我们的存储体它的结构是什么样的。好,那么在这个图示当中,我们的存储体当中只包含了两个存储单元。接下来我们要研究的问题就是如何根据地址来决定我们要读或者要写哪个存储字呢?这就涉及到译码器的使用。好,译码器的作用是这样的,我们给出了N位二进制地址之后,这N位2进制地址应该会对应2的N次方个存储单元。所以译码器它会根据这个地址寄存器MAR里边给出的这几位地址,把它转变成某一条选通线的高电平信号。比如此时CPU给这个MAR送过来的地址是三个0,那三个0翻译成十进制就应该是对应十进制的0。所以译码器会把第0根这个字选线给它一个高电平的输出,这样的话我们第一个存储字所对应的这些存储元件都会被选通,我们就可以读出每一位的这个二进制数据了。总之每一个地址会对应译码器的一条输出线,零号、一号、二号,以此类推,总共有2的3次方个地址,也就是8个地址。因此译码器的这个输出端总共会有8条线。

09:40

好,所以经过译码器的处理,一个地址信号会被转换成译码器的某一条输出线的高电平信号。当这一条红色的字选择线被接通之后,我们就可以通过这个数据线,也就是这绿色的这条线,把每一位的二进制信息传送到MDR当中,然后接下来CPU会通过数据总线从MDR当中取走这一整个字的数据,这数据总线的宽度应该是和存储字长是相同的。好,所以这就是给出地址之后,通过译码器的处理选中其中的某一个字的原理。对于这个例子来说,这个存储体它的总容量应该是存储单元的个数乘以存储字长。那存储单元的个数就应该是2的3次方,因为只有3位的地址,然后每一个存储字应该是8个比特,所以相乘就可以得到这个存储体它的一个总容量。

10:39

好,接下来我们继续完善这个存储芯片的构成。我们还需要增加一个控制电路,用于控制译码器、MAR和MDR。比如CPU通过地址总线把地址送到MAR当中。但是由于我们使用的是电信号来传送这些二进制数据,而电信号难免也会有不稳定的情况。因此当MAR里边的这个电信号稳定之前,这个地址信息是不能送到译码器当中的。所以这就是控制电路的一个作用,只有MAR稳定之后,它才会打开这个译码器的开关,让译码器来翻译这个地址,然后给出相应的输出信号。那同样的当数据输出的时候,只有这个输出的电信号稳定之后,控制电路才会认为此时的输出是正确无误的。所以它也需要控制MDR在什么时候给数据总线送出数据。

11:36

好,另一个方面,存储芯片还需要对外提供这样的一些线路,一个叫片选线,通常我们会用CS上面加一个杠,或者CE上面加一个杠来表示片选线的电信号,像这种头上画了一横的意思就是说这个电信号当它是低电平的时候是有效的。那这儿CS和CE其实是英文缩写,芯片的英文是chip对吧?这是芯片,然后CS表示的是芯片选择chip select芯片选择信号。如果我们给出的芯片选择信号是一个低电平的时候,就说明这个芯片的总开关是被我们接通的,那有的地方也会把片选线的信号把它命名为CE,CE是chip enable,也就是芯片使能的一个信号,和芯片选择信号的含义一样,也就是说当我们给这个片选线加一个低电平的时候,就意味着这块芯片是可以工作的,是这样的一个意思。

12:37

好,另外控制电路还需要对外提供一个读控制线和写控制线。有的地方是读控制线,写控制线会把它分成这样的两条线,WE表示的是允许写,那上面画一条横杠的意思就是说当这个写控制线的信号WE它是低电平的时候,表示此时这个芯片正在进行的是写操作,也就是要把MDR里保存的这些数据,把它输入到各个电容当中。好,另外当我们需要读出数据的时候,我们需要给这些读控制线OE这个电信号,让它变为低电平,当读控制线接收到一个低电平信号的时候,控制电路就知道,此时我们要进行的是一个读操作,而不是一个写操作。好,这是第一种常见的设计方法,我们会把读和写这两个控制线分为单独的两根。

13:29

还有一种常见的设计方法是可以把读写控制线合二为一,用一根线来表示我们此时要进行写还是读。这种情况下,当我们对这根线输入一个低电频的时候,表示我们要进行的是写操作,而如果我们输入的是一个高电平,那么表示此时要进行的是一个读操作。好,这一点大家需要注意。在题目当中他可能会告诉你,我们会采用两根读写线,或者也有可能是只采用一根读写线。当采用这两种方案的时候,我们的芯片对外暴露的引脚就是金属的引脚数目是不一样的。这一点我们一会儿再解释。

14:07

好,到目前为止我们就给出了一块存储芯片的完整的一个构造。好,我们把这些内部细节屏蔽掉,进行一个封装。那么整体来看,我们的存储芯片它由这样的一些逻辑部分构成。其中存储矩阵就是这些一个一个的存储元。

14:26

然后左边这个部分译码驱动电路,它其实是分为了译码器和驱动器。译码器的作用刚才我们已经说过,而驱动器的作用也很简单,我们的译码器它不是会输出某一条线的高电平信号吗?那这一条线你看一下,它连了很多很多存储元,需要控制这些存储元的开和关。为了译码器输出的这个高电平信号稳定有效,因此通常还会在译码器后面加上接上一个驱动器。这个驱动器的作用就是保证这译码器它输出的这些电信号是稳定可靠的,所以驱动器其实就是把电信号进行放大的一个部件。

15:08

另外读写电路包括了我们之前给的这些红色、绿色的这些线,还有控制电路,因为控制电路也是用来控制这些数据的读写的。好,所以逻辑上我们可以把存储芯片的内部分为这样的三大部分。另外,一块存储芯片需要接收来自外界的一个地址信息,这个地址信息通常是CPU通过地址总线给传过来的。好,另外还需要通过数据线进行数据的传输。除此之外还需要通过片选线的电信号来确定这块芯片此时是否可用。另外也需要提供读写控制线,这个读写控制线有可能只有一条,也有可能有两条。

15:49

好,现在大家可能还会比较疑惑,这个片选线到底有什么作用?我们来看一个我们实际的内存条它的样子。大家有空可以把自己的电脑拆开来看一下,看一下你的内存条是不是长这个样子,它里边有这样黑色的一小块的芯片,这样的每一块芯片其实就是一个存储芯片。所以我们使用的内存条,它里边其实是包含了多块存储芯片的,比如在这个图里边,每一块存储芯片能存储的数据容量都是1GB那么它总共有八块存储芯片,总共是不是就可以存储8GB的数据。

16:29

好,现在思考这样的一个问题,如果你要读取的数据刚好是存放在这一块存储芯片当中,那么是不是意味着你提供了一个读写的地址之后,我们只能让这一块存储芯片工作,其他的存储芯片不能工作,所以这就是片选线的作用。如果我们只想读取这块存储芯片指定地址的那些数据,那么我们就需要让这块存储芯片的片选线信号有效,也就是CS这个信号给一个低电平,而其他这些芯片的片选线信号,我们都给它一个高电平信号。这样的话我们就可以保证此次我们要读取的就是指定芯片的数据据。好,所以这就是片选线片选信号的一个作用。因为我们的一个存储器有可能会有多块存储芯片构成。好,所以大家可以再结合这个例子来思考片选线的一个作用。

17:28

好,接下来还需要补充的一点是,我们这儿的每一块存储芯片,其实它都会对外暴露出这样的一个的金属针脚,或者叫金属的引脚,这些金属引脚其实就是用来接收地址信号,或者数据信号,或者片选信号,还有读写信号用的。所以我们经常会遇到这样类型的题目,就是告诉你一块存储芯片的某一些参数信息,然后让你判断这块存储芯片它的引脚的数目至少应该是多少。这种类型的题目其实就是让你判断,你的地址线位数总共有多少根。每一根地址线会对应这样的一个金属的引脚,然后数据线应该有多少根?那每一条数数据线同样也会对应这样的一个金属的引脚。那除了地址线和数据线之外,我们是不是一定还需要有一个片选线,也就是片选信号的一个输入端口,所以片选线一定也会对应一个金属引脚。

18:29

好,另一个方面我们还需要提供一个读写控制线,来表示我们此时要进行的是读操作还是写操作,所以读写控制线也至少会对应一个金属的引脚。好,如果题目告诉你读写控制线分成了两根,就是我们之前上一页PPT讲到的那种情况。那此时是不是读控制线和写控制线会分别对应不同的两个金属引脚。所以大家需要根据题目用来判断这个存储芯片对外暴露出的金属银角到底有多少根。好,除了我们这实现功能所必须提供的金属引脚之外,通常还会有供电使用的引脚,还有接地的引脚。好,所以注意体会这个地方每一条线会对应一个金属的银角。

19:15

好,如果告诉你一块存储芯片它有N位地址,那是不是意味着地址需要有N条,那这N位地址又会对应2的N次方这么多个存储单元。另外之前说过,我们知道了存储单元的数量,然后再乘以每一个存储单元,也就是每一个存储字长,就可以得到这个芯片的总容量是多少。之前我们都是用多少个字节或者多少个比特这样的方式来描述一块芯片的容量。从这个小节开始,大家还会见到这样的描述,比如说一块存储芯片,它是8乘以8位的,第一个8表示的是它有多少个存储单元,而第二个8位表示的是它的存储字长是多少,每个存储单元包含多少位的信息。好,所以接下来大家有可能会经常遇到类似的描述。

20:05

比如说一块存储芯片是8K乘以8位这样的一个大小。第一个8K指的是它总共有8K这么多个存储单元,也就是2的13次方这么多的存储单元,然后每一个存储单元也就是存储字长是8位,那显然这个型号的存储芯片应该有13位的地址对吧,然后每个地址对应这样的一行存储元,然后每一行总共有8个存储元。好,第二块存储芯片8K乘以1位,意思就是说总共有8K的存储单元,而每一个存储单元,也就是这儿的每一行只会包含一个存储元件,是这样的一个意思。

20:46

好,所以以后大家也需要注意这种描述方式。前面的部分反映了存储单元的数量,而后边这个部分是反映了存储字长。所以如果题目告诉你一块存储芯片它是64K乘以16位,那你是不是就可以根据这两个部分的信息来分别判断出地址线有多少位,数据线有多少位,然后根据地址线数据线的数量,再加上片选线,还有读写控制线,你就可以判断出这块存储芯片应该对外暴露出多少个金属的引脚。那这就是一种很常见的考察方式,具体的大家会在课后习题里边遇到。

21:27

好,接下来我们要进一步探讨关于寻址的问题。在这个图示里边这样的一个小方格表示一个字节,也就是8比特的信息。然后这样的一整行表示的是一个存储字,也就是说这块存储芯片它的字长是4个字节。那我们假设它的总容量是1K个字节,也就是256个字,也就是说总共有256行。之前我们说过就是现代的计算机当中通常是按字节编址的,也就是说每一个字节会对应一个地址。那么这个存储矩阵当中总共有1K个字节,所以就会对应1K个地址。这是0号字节、1号字节、23456。

22:12

好,以此类推,每一个字节会对应一个地址,这是按字节编址的意思。但是我们现在的这些存储器虽然是按字节编址的,然而通常也支持按字寻址,按半字寻址,甚至按双字寻址。既然是按字节编址,总共有1K个地址单元,那么我们的地址线就应该有十根,因为二的10次方刚好就是1K,只有十根地址线才可以表示1K个地址,那整个地址空间应该是从十个全0一直到十个全1,也就是0到1023这样的一个范围。好,现在我们把每个字节的地址画到这个图里。

22:53

好,现在如果我们想要按字寻址,由于一个字占四个字节,因此我们会把四个连续的字节地址,把它们合并看作是一整个字。这个问题其实我们之前说过,当我们指明了要读的是第几个字的时候,我们只需要把字地址进行算术左移两位,这样的就可以把字地址转换成与之对应的字节地址。比如此时我们要读的是1号字,那么这是第0号字、1号字、2号字、3号字,也就是要读第二行的这一个字,那么我们把1号字的这个1进行算术左移两位,也就是在末尾添两个零,那么这个二进制数对应的十进制应该是4对吧,这样的话我们就得到了这一个字它的起始字节的一个字节地址。

23:43

好,关于半字寻址和双字寻址和字节编址的一个对应关系的转换,其实也是类似的原理。

好,这个小节中我们认识了主存储器的一个基本原理。刚开始我们介绍了两种基本元件,一种叫MOS管,MOS管的作用就是作为一个电路的开关。第二个重要的元器件就是电容,用来存储电荷,也就是存储二进制的0或1。给电容充电的过程就是我们写数据的过程,给电容放电的过程就是我们读出数据的一个过程。好,由这两种半导体元件我们就可以构成一个存储元,然后把多个存储元进行合理的连接,再加上译码驱动电路、读写电路,还有各种什么地址线、数据线,这些东西就构成了存储芯片。通过这个小节的学习,大家一定要能够理解这个译码器的一个工作原理。

24:38

另外我们经常会遇到一种题型,就是让大家判断一块存储芯片它金属引脚的个数。那关键在于大家要能够判断地址线和数据线分别是多少根。另外也需要注意读写控制线它到底是分为了两根还是合并为了一根,那每一条线都会对应一个金属的引脚。

25:00

好,这个小节的最后我们也简单介绍或者说复习了一下和寻址相关的知识,虽然现代计算机都是按字节编址的,每一个字节会对应一个地址,但是字节编址的这种形式也可以很方便的支持按字节寻址、按字寻址、按半字寻址和双字寻址。好的,以上就是这个小节全部内容。

这篇关于【计算机组成原理】3.2.0+3.2.3 主存储器的基本组成的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1125091

相关文章

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

基本知识点

1、c++的输入加上ios::sync_with_stdio(false);  等价于 c的输入,读取速度会加快(但是在字符串的题里面和容易出现问题) 2、lower_bound()和upper_bound() iterator lower_bound( const key_type &key ): 返回一个迭代器,指向键值>= key的第一个元素。 iterator upper_bou

hdu4407(容斥原理)

题意:给一串数字1,2,......n,两个操作:1、修改第k个数字,2、查询区间[l,r]中与n互质的数之和。 解题思路:咱一看,像线段树,但是如果用线段树做,那么每个区间一定要记录所有的素因子,这样会超内存。然后我就做不来了。后来看了题解,原来是用容斥原理来做的。还记得这道题目吗?求区间[1,r]中与p互质的数的个数,如果不会的话就先去做那题吧。现在这题是求区间[l,r]中与n互质的数的和

【IPV6从入门到起飞】5-1 IPV6+Home Assistant(搭建基本环境)

【IPV6从入门到起飞】5-1 IPV6+Home Assistant #搭建基本环境 1 背景2 docker下载 hass3 创建容器4 浏览器访问 hass5 手机APP远程访问hass6 更多玩法 1 背景 既然电脑可以IPV6入站,手机流量可以访问IPV6网络的服务,为什么不在电脑搭建Home Assistant(hass),来控制你的设备呢?@智能家居 @万物互联

计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~Java毕业设计项目~热门选题推荐《1000套》 目录 1.技术选型 2.开发工具 3.功能

hdu4407容斥原理

题意: 有一个元素为 1~n 的数列{An},有2种操作(1000次): 1、求某段区间 [a,b] 中与 p 互质的数的和。 2、将数列中某个位置元素的值改变。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.Inpu

hdu4059容斥原理

求1-n中与n互质的数的4次方之和 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWrit

C 语言的基本数据类型

C 语言的基本数据类型 注:本文面向 C 语言初学者,如果你是熟手,那就不用看了。 有人问我,char、short、int、long、float、double 等这些关键字到底是什么意思,如果说他们是数据类型的话,那么为啥有这么多数据类型呢? 如果写了一句: int a; 那么执行的时候在内存中会有什么变化呢? 橡皮泥大家都玩过吧,一般你买橡皮泥的时候,店家会赠送一些模板。 上

FreeRTOS-基本介绍和移植STM32

FreeRTOS-基本介绍和STM32移植 一、裸机开发和操作系统开发介绍二、任务调度和任务状态介绍2.1 任务调度2.1.1 抢占式调度2.1.2 时间片调度 2.2 任务状态 三、FreeRTOS源码和移植STM323.1 FreeRTOS源码3.2 FreeRTOS移植STM323.2.1 代码移植3.2.2 时钟中断配置 一、裸机开发和操作系统开发介绍 裸机:前后台系

寻迹模块TCRT5000的应用原理和功能实现(基于STM32)

目录 概述 1 认识TCRT5000 1.1 模块介绍 1.2 电气特性 2 系统应用 2.1 系统架构 2.2 STM32Cube创建工程 3 功能实现 3.1 代码实现 3.2 源代码文件 4 功能测试 4.1 检测黑线状态 4.2 未检测黑线状态 概述 本文主要介绍TCRT5000模块的使用原理,包括该模块的硬件实现方式,电路实现原理,还使用STM32类