做嵌入式系统开拓,常常要打仗硬件,须要对数字电路和仿照电路要有一定的理解,这样才能深入的研究下去。下面我们大略地先容一下嵌入式开拓中的一些硬件干系的观点。
在数字电路中,分为高电平和低电平,分别用1和0表示。一个数字电路的管脚,总是存在一个电平的,要么高要么低,或者说要么1要到0(实在,还有另一种状态,后面会提到)。

总线(Bus)
在嵌入式系统中一定会有一块处理器芯片,此外,还有其它的芯片作为外部设备(后面简称外设),这些芯片与处理器协作实现产品的功能。繁芜的产品每每是由大量的芯片组成的。那么不可避免的是我们须要将所有的外设与处理器进行相连,最为大略的是将所有的外设都采取独立(把稳是独立)的旗子暗记线连接至处理器,这样的好处是随意马虎理解,但问题是:不可行。
由于处理器芯片须要引出太多的线了,从芯片的生产和产品的生产角度来看都不实际。加之,处理器(在此我们假设处理器是单核的,而不是多核的)处理事务在微不雅观上是串行的,也便是说在某一时候如果要对外设进行读写操作,那只可能是对大量外设中的一个进行,即多个外设不可能在微不雅观上被处理器同时访问。须要把稳的是,这里提出了微不雅观这一观点,这是为了差异于宏不雅观。
从宏不雅观上来讲,一个处理器中可以有多个任务同时运行,但这些任务在微不雅观上却是一个一个运行的(后面会用串行来描述这里所说的“一个一个”),多任务的串走运行实现是由操作系统扮演着重要的角色来实现的。回到我们的话题,即然将每个外设采取独立的旗子暗记线连到处理器不可行,且处理器在单一韶光内只会对一个外设进行访问,那我们能不能采取共享的旗子暗记线将所有的芯片连在一起呢?这便是总线观点的由来。
普通的说,如果我们周围有十个家庭,为了让这十个家庭每两个之间都能往来,我们并不须要为每两个家庭修一条单独(把稳是单独)的路(如果这样,要修45条路),而是可以修一条大路,然后,每个家都与大路相连。
对付总线,我们每每说总线是处理器的,而其它的外设是挂在总线上的。那有一个问题,我们每一韶光只能访问挂在总线上的一个外设,那如何区分这些外设呢?和我们的路一样,我们须要用地址来区分每一个家庭,在总线上,也是采取地址来进行区分的。这样,总线就根据其功能分为两类了。一类是地址总线,这一总线上的数据只会是从处理器向外设“流”,是单向的。
另一类则是数据总线,用来将数据从处理器传送到外设(从处理器的角度来说是写操作)或者是将数据从外设传送到处理器(从处理器的角度来说是读操作),显然,数据总线是双向的。也便是说,在我们的嵌入式系统中同时存在地址总线和数据总线将所有须要与处理器进行通讯的芯片连在一起的。
总线是有宽度的,正如我们的路分为“三车道”或是“四车道”,我们说32位处理器,是指其数据总线宽度是32位,也便是“有32辆车能同时跑”,显然,宽度越是宽我们的处理器速率就越是快,由于我们从外设芯片存取数据的速率会更快,这便是为什么我们的打算机向64位发展的缘故原由。同样的,地址总线也是有宽度的,对付32位处理器其最大宽度也便是32位。
总线的观点有了,那接下来的一个问题是,纵然是每一个外设都有一个地址,那这一地址记在哪里呢?是放在外设芯片上吗?如果这样的话,那就有一个问题,每一类外设的地址必须是不能重叠的,而当一个产品中须要两块一样的芯片的话,两块芯片的地址就无法区分了,看来这样操作存在问题。还有,如果这样的话每一个外设也得与(比如,32根)数据总线完备相连,并监听数据线以理解处理器是不是在“叫”自己,这样很是繁芜。
此外,地址也有可能由于外设种类的增多而用光。总的来说地址不能存放在外设芯片,那如何让外设知道,此时它是被处理器招换从而须要进行读写访问的呢?答案便是芯片的片选(CS, chip select)旗子暗记,或者又叫使能(ENable)旗子暗记。
片选(CS 或EN)
片选旗子暗记对付外设芯片来讲,便是一个(也是一根)关照旗子暗记,见告芯片“嘿,请开门,我要放些东西进来,或是拿些东西走”,这里的东西只能是数据,不可能是玉米棒什么的。那有个问题,这个旗子暗记源从哪里来呢?显然,只能从处理器来。那是不是也是像总线那样,每一个芯片都共用一根线连在一起呢?如果这样,可能处理器“一叫开门”所有的芯片都将“门”打开了。如果是处理器写数据,那可能所有的芯片都被写入同样的数据。
而取数据时,每个外设芯片都向外“扔”数据,这一定会造成数据总线冲突,由于有的芯片向总线上“扔”1,有的则“扔”0,这种情形下处理器一定会“发疯”的,由于它不知道应该得到1还是0。
既然这样,显然不能将所有的片选旗子暗记连在一起了,只能是各芯片的片选旗子暗记独立。前面提到了地址总线,我们是采取一根地址线连一个外设芯片呢?还是采取其它的方法。如果采取一根地址线连一个外设芯片,那可能最多只能挂接32个芯片了,这显然弗成。实在,在现实中,是采取32位的数字来表示一个外设芯片的地址的,比如1可以表示芯片A,而6534可以表示其余一个芯片B,
等等。由此看来,理论上我们可以表示2的32次方(4294967296)个设备,之以是说理论上,是由于有的设备要占用大量的地址。即然这样,那还有一个问题,如果将32位的地址总线转换成芯片的一根片选旗子暗记呢?这须要引入译码(器)的观点。
译码(器)
译码器将一个数据转换成一根旗子暗记线上的旗子暗记,比如3/8译码器,可以将一个位宽是3位的数据转换成8根(2的3次方)完备独立的旗子暗记线,当向数据侧写入二进制的011时,对应的是8根线的第3根,当输入二进制的111时,对应的是8根线中的末了一根。有了译码器,处理器的地址线就简化了,只要32根地址线加上表面的译码器,就可以访问大量的外设芯片了。外部设备的选择问题,我们已经办理了,现在还得转头看一看数据总线。
图1 3/8译码器
在嵌入式系统中,所有芯片的数据总线可以理解成是直接相连的。之以是用了“可以理解”一词,是由于为了提高总线的负载能力,个中会加入总线驱动器。为了理解,我们看一看我们生活中的自来水,比如,在北京理论上可能所有的水管是连在一起的,但中间可能为了提高水压,存在很多小的水站用来增加供水压力,而不可能全北京所有的自来水自接来自一个水厂。
既然所有的数据总线是连在一起的,那就可能会有问题。当向外部设备写数据时,处理器先向地址总线运送目标外设的地址,地址译码器将其转换成一根旗子暗记的片选旗子暗记送到了目标外设,目标外设收到这一旗子暗记后,将“门”打开。接下来处理器将要传送到外设的数据往数据总线上一放,由于只有目标外设芯片打开了“门”,以是数据只会进入到目标外设,而其它的外设什么也不会收到。
很好!
处理器向外写数据应该没有问题,我们接下来看一看读。读的话,由于数据是从外设运送到处理器的,只管我们采取和写一样的方法打开目标外设的“门”,但此时,其它的外设也在数据总线上,它们有可能处于1也可能处于0,是不是会影响处理器读取目标外设的数据呢?结果当然不会,但我们得引入另一个观点:高阻态。
高阻态
很显然,当处理器从目标外设读数据时,我们希望其它没有当选上的芯片的数据总线不会对目标外设所要传送的数据有影响,那怎么办呢?实际上,当芯片没有当选中时,其数据总线都处于高阻态。所谓的高阻态,我们可以理解成这一管脚在外设芯片内部是断开的,如此一来,显然不会对处理器从目标外设读取数据造成任何的影响了。
我们说当一个芯片没有当选中或是没有被使能时,其数据总线一定是处于高阻态的。前面用了“门”的开和关来打比方,那“门”是指什么呢?是指外设的数据总线,片选旗子暗记的浸染便是掌握将外设的数据总线与处理器的数据总线相连或是断开。
驱动
总线上的数据是谁放上去的我们就说谁是那一时候的驱动者。也便是说,当处理器向外设写数据时,它是在驱动数据总线的,而当处理器从目标外设读取数据时,目标外设是在驱动数据总线的。对付地址总线,由于只可能从处理器向目标外设写,以是地址总线永久是由处理器驱动的。当一个芯片没有当选中时,我们说它并不驱动数据总线。
三态门
前面我们说到外设芯片的数据总线在没有当选中时其处于高阻态,当当选中时,其电平可能是高(1)或是低(0)。如此一来,我们说外设的数据总线其芯片管脚是属于三态门的,即存在高电平、低电平和高阻态,三个状态。
电平的有效性
前面我们理解了什么是片选旗子暗记,也讲到了三态门,须要指出的是片选旗子暗记常日不是三态门,其只存在两个状态,即高电平或是低电平。前面我们也说了,片选旗子暗记是用来“开门”的,而片选旗子暗记又有高和低电平,那到底是高电平表示“开门”呢?还是低电平?对付这一问题,我们称如果一个电平对付一个片选旗子暗记表示“开门”那么它便是这一旗子暗记的有效电平。
比如,对付一个片选旗子暗记,如果低电平表示“开门”,那么我们说这个片选旗子暗记是低电平有效的。虽然,在这里我们用片选旗子暗记来阐明电平的有效性,但是很多旗子暗记都存在有效性的问题,比如,后面我们将要谈的读旗子暗记和写旗子暗记都存在有效性问题。
时序
在前面我们说到当处理器要向外设芯片写数据时,须要先将所需访问的外设的地址放在地址总线上,然后,由译码器将地址总线上的数据转换成片选旗子暗记,片选旗子暗记则使能目标外设芯片,接下来处理器写数据到数据总线上,从而完成一个写操作。显然,在处理器将数据写到数据总线之前地址线上的数据必须一贯保留一段韶光,否则的话译码器不能永劫光的使片选旗子暗记有效。
当完成了数据的写操作后,处理器就不须要担保地址总线上的地址有效了。我们可以看出,这一系列的操作都有一定严格的韶光顺序的,这称之为时序。时序描述了处理器与外部设备的交互旗子暗记 “规程”,大家只有按照这一“规程”来操作,才能担保处理器与外部设备之间能正常的通讯。
这好比,我们的道路上的红绿灯,如果我们行人和车辆不按照其指示来通畅的话,就会涌现事件。常日,采取时序图来描述芯片之间通讯的旗子暗记“规程”。
图2 读时序图
图3 读时序图
从图中我们可以看出ADDRESS是表示地址总线的,DQ是表示数据总线的,CE是片选旗子暗记,且是低电平有效,其宽度要担保在进行读操作时总是有效的。学会看时序图对付做嵌入式系统开拓非常有帮助,由于我们不可避免的要与芯片打交道。在时序图中,常日会标识很多的韶光需求信息。
在写启动代码时须要初始化各地址空间的片选地址寄存器和读写时序,时序的配置依据便是来自于外设芯片的韶光需求,这是芯片手册很主要的一部分内容。当一个地址空间中存在多个外设芯片时,我们须要考虑到个中最慢的外设芯片的韶光需求,否则的话有的芯片就不能正常事情。
读旗子暗记
当处理器须要从外设芯片读取信号时,除了须要产生片选旗子暗记外,还须要见告外设芯片这是一个读操作,而不是一个写操作,这是通过读旗子暗记来实现的。
写旗子暗记
前面讲了读旗子暗记,我想对付写旗子暗记也就不难明得了,这个旗子暗记用于见告外设芯片,这是一个向外设芯片写数据的操作。
I/O端口
前面提到了外设(芯片)),现在是对外设进行分类的时候了。大体上外设分为两类,一类是存储器外设,而另一类是非存储器外设,后者常被称之为I/O设备,这里的I/O是Input/Output的简写,即输入、输出。可见,I/O外设是一个非常宽泛的观点。对付存储器外设,其特点是,它所占用的空间是连续的一片。比如,SDRAM内存便是属于存储器外设,如果其容量是8M字节,那么其占用的地址空间也会是8M的。
与存储器外设所不同的是,I/O外设所点用的地址一样平常都很少。比如一个I/O外设可能存在多个掌握寄存器,这些掌握寄存器从处理器来看便是多个I/O端口(地址),向这个地址写数据便是向外设所对应的寄存器写数据,反之,也可以是读。
比如,一个串口芯片可能存在多个寄存器,一个用来查询芯片的状态,一个用来设置芯片的功能,另一个用来读取芯片从串口线所收到的数据,末了,还有一个用来向芯片写数据以向串口线上发送数据。对付这一串口芯片的寄存器,从处理器的角度来看,都是独立的I/O端口。
I/O端口存在读、写性问题,有的端口是只读的,有的端口是只写的,还有的端口是即可读也可写,其读写性是由外设芯片的寄存器所决定的,在芯片的数据手册中能找到。须要指出的是,有些存储器外设也存在I/O端口,以对其进行一定的掌握。从I/O端口这一名字来看,对付处理器来说,便是对从表面读入数据或是向表面输出数据的一个接口总称。
中断
中断从硬件的角度来看便是一个能产生高、低电平的一根旗子暗记线,但理解它须要从处理器的角度出发。我们说过了,处理器从微不雅观上看,所做的事情是按顺序进行的,其对程序的处理只能是一条指令一条指令的实行。如果存在须要对外设芯片进行访问,而有可能从处理器发出读、写命令后,由于外设常日比处理器慢很多,以是外设芯片须要一些韶光来准备好所需的数据。
在这种情形下,如果处理器一贯等外设芯片的返回数据再实行后续的指令的话,将耗费宝贵的韶光,这些韶光完备可以用来做其它的事情。别忘了,从宏不雅观上看来处理器常常是多任务的,任务是指操作系统所供应的调度单位。当一个任务由于等待外设芯片的数据而壅塞时,我们可以切换到其余的任务,从而提高处理效率。
这就有一个问题,当处理器去处理另一个任务时,如果外设芯片的数据好了的话,如果见告处理器呢?对了!
便是通过中断旗子暗记。中断旗子暗记的高、低电平可以用来表示是否有中断须要处理器把稳以处理特定的事宜(比如,外设数据准备好了的事宜)。
由此看来,中断的引入能大大的提高处理器的利用效率。为了利用处理器上的中断,一开始我们须要初始化好处理器的中断掌握器,比如安装好所需的中断做事程序或称之为ISR(Interrupt Service Routine),然后,打开中断屏蔽位。中断做事程序中须要做如下的操作:
从外设读入或向外设写数据。读还是写常日须要读取外设的中断状态寄存器来决定。
打消外设的中断旗子暗记。我们知道,中断旗子暗记是由外设芯片驱动的,为了见告外设芯片,处理器已经处理完了所需做的事情,那么处理器须要通过一定的办法关照外设芯片。这种办法便是向外设芯片的寄存器中的某一位写入一个数据,比如,可能是写入1表示清中断,也可能是写入0表示清中断,这常日在外设的数据手册中能查到。
收到了处理器的清中断要求后,其就会驱动中断线使其无效。比如,一个外设的中断线是当其为低电平表示有中断,将其从低电平变为高电平便是驱动为无效。
打消处理器的中断旗子暗记标识。处理器中每每也会保存外部中断旗子暗记是否发生过,当我们处理完了外设芯片的中断时,我们也须要打消处理器上的标识,从而为下一次中断做准备。须要把稳的是,清外设的中断必须发生在请处理器中断标识之前!
中断还存在一个触发办法问题。有两种触发办法 ,一种是电平触发,另一种是沿触发。电平触发是指电平的高低表示外设是否有中断,而沿触发则是能过中断线上的电平的升或降来表示的,显然,存在两种沿触发办法。
一种是中断线从低电平变为高电平,我们称之为上升沿触发,另一处是中断线从高电平转换为低电平,我们称之为低落沿触发。总的来说中断的触发办法有电平触发、上升沿触发和低落沿触发。电平触发办法中处理中中断设置很主要的一个步骤。
万用表
万用表常日是用来查看电平的高低、电阻的大小等的,是常用且必不可少的工具之一。在嵌入式系统开拓中,我们常用的是数字万用表。
示波器
在嵌入式系统开拓中,我们不可避免的要与外设芯片打交道。调试驱动程序时,除了须要完备看明白芯片的数据手册,且在软件高度的过程中,还须要看我们所期望的旗子暗记电平是否发生在芯片上。比如,我们在写驱动程序时,须要通过写I/O端口来对外设芯片进行操作,当写相应的I/O端口时,我们知道所对应芯片的片选旗子暗记应该有效,有时,我们须要验证是否按预期发生了,这就须要用到示波器。
一样平常的示波器是能同时不雅观测两个旗子暗记线的旗子暗记状态的。示波器都供应一定的功能,比如设置旗子暗记扑捉的办法等等。示波器很主要的一个参数据是其采集频率,根据Nyquist采集定理,如果我们想用示波器查看频率是100M赫兹的旗子暗记,那么其采样频率必须至少是其两倍,即200M赫兹。有人可能会问:为什么不用万用表来看呢?由于万用表的采集频率很底,无法采集到很快的旗子暗记变革。
逻辑剖析仪
大略的说逻辑剖析器便是具有很多旗子暗记通道的示波器。通过逻辑剖析仪,我们可以看到地址总线和数据总线上的数据。逻辑剖析仪都供应一定的编程能力,用于编程什么时候开始对总线上的数据进行采集。
免责声明:本文系网络转载,版权归原作者所有。如涉及作品版权问题,请与我们联系,我们将根据您供应的版权证明材料确认版权并支付稿酬或者删除内容。
理解更多