经典的嵌入式基础硬件知识,搞嵌入式开发必备

总线(Bus)编程

在嵌入式系统中必定会有一块处理器芯片,此外,还有其它的芯片做为外部设备(后面简称外设),这些芯片与处理器协做实现产品的功能。复杂的产品每每是由大量的芯片组成的。那么不可避免的是咱们须要将全部的外设与处理器进行相连,最为简单的是将全部的外设都采用独立(注意是独立)的信号线链接至处理器,这样的好处是容易理解,但问题是:不可行。工具

  

由于处理器芯片须要引出太多的线了,从芯片的生产和产品的生产角度来看都不实际。加之,处理器(在此咱们假设处理器是单核的,而不是多核的)处理事务在微观上是串行的,也就是说在某一时刻若是要对外设进行读写操做,那只多是对大量外设中的一个进行,即多个外设不可能在微观上被处理器同时访问。ui

  

须要注意的是,这里提出了微观这一律念,这是为了区别于宏观。从宏观上来说,一个处理器中能够有多个任务同时运行,但这些任务在微观上倒是一个一个运行的(后面会用串行来描述这里所说的“一个一个”),多任务的串行运行实现是由操做系统扮演着重要的角色来实现的。操作系统

 

回到咱们的话题,即然将每一个外设采用独立的信号线连处处理器不可行,且处理器在单一时间内只会对一个外设进行访问,那咱们能不能采用共享的信号线将全部的芯片连在一块儿呢?这就是总线概念的由来。通俗的说,若是咱们周围有十个家庭,为了让这十个家庭每两个之间都能往来,咱们并不须要为每两个家庭修一条单独(注意是单独)的路(若是这样,要修45条路),而是能够修一条大路,而后,每一个家都与大路相连。调试

 

对于总线,咱们每每说总线是处理器的,而其它的外设是挂在总线上的。那有一个问题,咱们每一时间只能访问挂在总线上的一个外设,那如何区分这些外设呢?和咱们的路同样,咱们须要用地址来区分每个家庭,在总线上,也是采用地址来进行区分的。接口

 

这样,总线就根据其功能分为两类了。一类是地址总线,这一总线上的数据只会是从处理器向外设“流”,是单向的。另外一类则是数据总线,用来将数据从处理器传送到外设(从处理器的角度来讲是写操做)或者是将数据从外设传送处处理器(从处理器的角度来讲是读操做),显然,数据总线是双向的。也就是说,在咱们的嵌入式系统中同时存在地址总线和数据总线将全部须要与处理器进行通信的芯片连在一块儿的。事件

  

总线是有宽度的,正如咱们的路分为“三车道”或是“四车道”,咱们说32位处理器,是指其数据总线宽度是32位,也就是“有32辆车能同时跑”,显然,宽度越是宽咱们的处理器速度就越是快,由于咱们从外设芯片存取数据的速度会更快,这就是为何咱们的计算机向64位发展的缘由。一样的,地址总线也是有宽度的,对于32位处理器其最大宽度也就是32位。事务

 

总线的概念有了,那接下来的一个问题是,即便是每个外设都有一个地址,那这一地址记在哪里呢?是放在外设芯片上吗?若是这样的话,那就有一个问题,每一类外设的地址必须是不能重叠的,而当一个产品中须要两块同样的芯片的话,两块芯片的地址就没法区分了,看来这样操做存在问题。还有,若是这样的话每个外设也得与(好比,32根)数据总线彻底相连,并监听数据线以了解处理器是否是在“叫”本身,这样非常复杂。ip

  

此外,地址也有可能由于外设种类的增多而用光。总的来讲地址不能存放在外设芯片,那如何让外设知道,此时它是被处理器招换从而须要进行读写访问的呢?答案就是芯片的片选(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也可能处于0,是否是会影响处理器读取目标外设的数据呢?结果固然不会,但咱们得引入另外一个概念:高阻态。  

 

 

高阻态

很显然,当处理器从目标外设读数据时,咱们但愿其它没有被选上的芯片的数据总线不会对目标外设所要传送的数据有影响,那怎么办呢?实际上,当芯片没有被选中时,其数据总线都处于高阻态。

 

所谓的高阻态,咱们能够理解成这一管脚在外设芯片内部是断开的,如此一来,显然不会对处理器从目标外设读取数据形成任何的影响了。咱们说当一个芯片没有被选中或是没有被使能时,其数据总线必定是处于高阻态的。前面用了“门”的开和关来打比方,那“门”是指什么呢?是指外设的数据总线,片选信号的做用就是控制将外设的数据总线与处理器的数据总线相连或是断开。

 

 

驱动

总线上的数据是谁放上去的咱们就说谁是那一时刻的驱动者。也就是说,当处理器向外设写数据时,它是在驱动数据总线的,而当处理器从目标外设读取数据时,目标外设是在驱动数据总线的。对于地址总线,由于只可能从处理器向目标外设写,因此地址总线永远是由处理器驱动的。当一个芯片没有被选中时,咱们说它并不驱动数据总线。  

 

 

三态门

前面咱们说到外设芯片的数据总线在没有被选中时其处于高阻态,当被选中时,其电平多是高(1)或是低(0)。如此一来,咱们说外设的数据总线其芯片管脚是属于三态门的,即存在高电平、低电平和高阻态,三个状态。

  

 

电平的有效性

前面咱们了解了什么是片选信号,也讲到了三态门,须要指出的是片选信号一般不是三态门,其只存在两个状态,即高电平或是低电平。前面咱们也说了,片选信号是用来“开门”的,而片选信号又有高和低电平,那究竟是高电平表示“开门”呢?仍是低电平?

 

对于这一问题,咱们称若是一个电平对于一个片选信号表示“开门”那么它就是这一信号的有效电平。好比,对于一个片选信号,若是低电平表示“开门”,那么咱们说这个片选信号是低电平有效的。虽然,在这里咱们用片选信号来解释电平的有效性,可是不少信号都存在有效性的问题,好比,后面咱们将要谈的读信号和写信号都存在有效性问题。

 

 

时序

在前面咱们说到当处理器要向外设芯片写数据时,须要先将所需访问的外设的地址放在地址总线上,而后,由译码器将地址总线上的数据转换成片选信号,片选信号则使能目标外设芯片,接下来处理器写数据到数据总线上,从而完成一个写操做。显然,在处理器将数据写到数据总线以前地址线上的数据必须一直保留一段时间,不然的话译码器不能长时间的使片选信号有效。

 

当完成了数据的写操做后,处理器就不须要保证地址总线上的地址有效了。咱们能够看出,这一系列的操做都有必定严格的时间顺序的,这称之为时序。时序描述了处理器与外部设备的交互信号 “规程”,你们只有按照这一“规程”来操做,才能保证处理器与外部设备之间能正常的通信。这比如,咱们的道路上的红绿灯,若是咱们行人和车辆不按照其指示来通行的话,就会出现事故。一般,采用时序图来描述芯片之间通信的信号“规程”。

  

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. 从外设读入或向外设写数据。读仍是写一般须要读取外设的中断状态寄存器来决定。

  

2. 清除外设的中断信号。咱们知道,中断信号是由外设芯片驱动的,为了告诉外设芯片,处理器已经处理完了所需作的工做,那么处理器须要经过必定的方式通知外设芯片。这种方式就是向外设芯片的寄存器中的某一位写入一个数据,好比,多是写入1表示清中断,也多是写入0表示清中断,这一般在外设的数据手册中能查到。当外设收到了处理器的清中断请求后,其就会驱动中断线使其无效。好比,一个外设的中断线是当其为低电平表示有中断,将其从低电平变为高电平就是驱动为无效。

  

3. 清除处理器的中断信号标识。处理器中每每也会保存外部中断信号是否发生过,当咱们处理完了外设芯片的中断时,咱们也须要清除处理器上的标识,从而为下一次中断作准备。须要注意的是,清外设的中断必须发生在请处理器中断标识以前。

 

中断还存在一个触发方式问题。有两种触发方式 ,一种是电平触发,另外一种是沿触发。电平触发是指电平的高低表示外设是否有中断,而沿触发则是能过中断线上的电平的升或降来表示的,显然,存在两种沿触发方式。一种是中断线从低电平变为高电平,咱们称之为上升沿触发,另外一处是中断线从高电平转换为低电平,咱们称之为降低沿触发。总的来讲中断的触发方式有电平触发、上升沿触发和降低沿触发。电平触发方式中处理中中断设置很重要的一个步骤。

 

 

万用表

万用表一般是用来查看电平的高低、电阻的大小等的,是经常使用且必不可少的工具之一。在嵌入式系统开发中,咱们经常使用的是数字万用表。

 

 

电平(Level)

在数字电路中,分为高电平和低电平,分别用1和0表示。一个数字电路的管脚,老是存在一个电平的,要么高要么低,或者说要么1要到0(其实,还有另外一种状态)。

 

 

示波器

在嵌入式系统开发中,咱们不可避免的要与外设芯片打交道。调试驱动程序时,除了须要彻底看明白芯片的数据手册,且在软件高度的过程当中,还须要看咱们所指望的信号电平是否发生在芯片上。好比,咱们在写驱动程序时,须要经过写I/O端口来对外设芯片进行操做,当写相应的I/O端口时,咱们知道所对应芯片的片选信号应当有效,有时,咱们须要验证是否按预期发生了,这就须要用到示波器。通常的示波器是能同时观测两个信号线的信号状态的。

 

示波器都提供必定的功能,好比设置信号扑捉的方式等等。示波器很重要的一个参数据是其采集频率,根据Nyquist采集定理,若是咱们想用示波器查看频率是100M赫兹的信号,那么其采样频率必须至少是其两倍,即200M赫兹。有人可能会问:为何不用万用表来看呢?由于万用表的采集频率很底,没法采集到很快的信号变化。  

 

逻辑分析仪

 

简单的说逻辑分析器就是具备不少信号通道的示波器。经过逻辑分析仪,咱们能够看到地址总线和数据总线上的数据。逻辑分析仪都提供必定的编程能力,用于编程何时开始对总线上的数据进行采集。

相关文章
相关标签/搜索