1.4 8051架构的重要硬件和性能
从上面的列表中,我们要引出8051的其他元素了。P0~P3是8051和外界沟通的主渠道,除此之外,8051还有其他重要元件来丰富它的工作。
1.一个全双工串口(UART)
串口是8051、Cortex-m0/3这类低等单片机采用的不二调试手段,原因是它只需两根线,电脑上装个调试终端或其他串口软件,则可在C程序中使用printf语句来打印内部的信息。如果说单片机属于火星一样的异域世界,那么串口就是火星探测器发回来的电波,它有助于我们了解单片机内部的工作状态。我们的P3.0和P3.1即承担这样的重任,一个负责发送,一个负责接收。
为了串口的工作,我们还为它配备了两个寄存器:一个是SCON,地址编号是98H;一个是SBUF,地址编号是99H。SCON用来配备串口的工作模式和波特率,也就是操作串口如何工作的寄存器。SBUF放置接收和发送的字节数据。接收方和发送方都是以字节为基础进行交流的。硬件从P3.0收到一个字节,它就将其放入SBUF内,单片机知道后即从SBUF内取出该字节数据。同样,单片机想从串口送出1Byte数据,即把该字节数据写入SBUF内,硬件会为该字节数据加上头信息和奇偶校验位,然后再串行从P3.1送出。
P3接口既具有通用接口的功能,又有串口的发送、接收功能,但硬件根本不用去区分。如果往P3的地址位B0H写入某数据,那么该数据立即送到P3的对应位,此时P3就被用作通用接口;若往SBUF内写入一个字节,那么P3.1立即具有串行输出功能,该字节数据会在接下来的时间内被串行送出。
2.五个中断源,两个优先级
心急的读者可能会问,你说有五个中断源,为什么我只在P3.2和P3.3上发现了两个中断,其他三个呢?P3.2和P3.3确实是属于8051架构的五大中断之二,它们属于外部中断。也就是外界能够控制的中断,好比我们的眼睛和耳朵,外界的刺激能够让单片机立刻感知。但另外三个属于内部中断,比如我们下面会提到的计数器,它好比我们揣的怀表,你定好了时间,去忙其他事情了,怀表计时到头了总得通知你吧,那么会有两个定时器中断为这两个定时器专用。还剩下一个被前面的串口所用,好比串口接收到了一个字节数据了,单片机程序应该处理该字节数据。此时单片机程序按照指令池里有秩序的指令一条一条正在执行,但要让它知道硬件接收了1Byte数据,就会有一个中断强迫单片机程序进入它对应的中断向量。该中断向量里面存放着中断程序的地址,里面是已设定的串口处理程序。单片机的接收和发送共用一个中断,当往SBUF内写入一个字节后,硬件发送完毕,则立即触发中断,单片机程序知道该字节数据发送成功。
既然有五个中断,那就存在着竞争。就好比两个中断同时触发了,你该回答哪一个?一般来说它们五个之间有一个优先级秩序:
第一为外部中断0;
第二为定时器中断0;
第三为外部中断1;
第四为定时器中断1;
第五为串口中断。
排在前面的中断优先级高,后面依次递减。这就是它们同时到来时的判决依据,但也不是绝对的,这是因为8051的架构设计者们为我们安排了改变它们优先级的可能。这就是“两个优先级”:一个是高优先级,一个是低优先级。开发者可以为这五个中断设定所属的优先级。
当两个中断同时到来后,硬件将不再按照固有的秩序,而是先通过优先级做一次筛查。如果是一个高优先级,一个低优先级,那么毫无疑问,高优先级的先响应,而不管高优先级的秩序落后于低优先级。因此排名后面的还是有机会得到照顾。但如果两者同属于一个优先级,那么他们还是得按照预定的秩序来,谁在前,谁先得到响应。
用于中断配置的寄存器有:用于配置使能的IE,地址是A8H;用于配置优先级的IP,地址是B8H。
3.两个定时器/计数器
“定时器/计数器”虽然称为两“器”,但其实属于一样东西:16bit宽的寄存器。它充当定时器(timer)的时候,这16bit的寄存器会随着机器周期(1个机器周期等于12个外部晶振时钟)递增。它充当计数器(counter)的时候,这16bit的寄存器会随着P3.4或P3.5从变成0的时刻递增。再看表1-1,即可知道P3.4或P3.5的含义了——它是用来触发这两个计数器的。后面统称“定时器/计数器”为通俗化的计数器。
这两个16bit的计数器皆可通过地址访问。其中计数器0的对应地址为:8AH和8CH,一般标称为TL0和TH0,其分别表示低8bit和高8bit;计数器1的对应地址为:8BH和8DH,标称为TL1和TH1。这两个寄存器有四种工作模式,且都可通过地址为88H的TCON和89H的TMOD来配置它们的工作模式和中断方式。
这两个计数器配置起来颇为复杂,但在FPGA中,只需为这个计数器配备一个地址以让软核处理器能够访问到,那么它就能充当“定时器/计数器”了。因此,在这里用大篇幅来讲述这两个计数器的工作模式和操作方法实在是不太合适。读者如果有兴趣,可自行参照单片机的文档学习。