《电子技术应用》
您所在的位置:首页 > 嵌入式技术 > 解决方案 > ARM应用系统开发详解(入门资料)

ARM应用系统开发详解(入门资料)

2015-09-28
关键词: ARM 详解

  第1章 ARM微处理器概述
  本章简介ARM微处理器的一些基本概念、应用领域及特点,引导读者进入ARM技术的殿堂。
  本章主要内容:
  -    ARM及相关技术简介
  -    ARM微处理器的应用领域及特点
  -    ARM微处理器系列
  -    ARM微处理器的体系结构
  -    ARM微处理器的应用选型
  1.1  ARM-ADVANCED <http://www.dzsc.com/stock-ic/ADVANCED.html> RISC Machines
  ARM(ADVANCED <http://www.dzsc.com/stock-ic/ADVANCED.html> RISC Machines),既可以认为是一个公司的名字,也可以认为是对一类微处理器的通称,还可以认为是一种技术的名字。
  1991 <http://www.dzsc.com/stock-ic/1991.html>年 ARM公司成立于英国剑桥,主要出售芯片设计技术的授权。目前,采用ARM技术知识产权(IP)核的微处理器,即我们通常所说的ARM微处理器,已遍及工 业控制、消费类电子产品、通信系统、网络系统、无线系统等各类产品市场,基于ARM技术的微处理器应用约占据了32位RISC微处理器75%以上的市场份 额,ARM技术正在逐步渗入到我们生活的各个方面。
  ARM公司是专门从事基于RISC技术芯片设计开发的公司,作为知识产权供应商,本身不直接从 事芯片生产,靠转让设计许可由合作公司生产各具特色的芯片,世界各大半导体生产商从ARM公司购买其设计的ARM微处理器核,根据各自不同的应用领域,加 入适当的外围电路,从而形成自己的ARM微处理器芯片进入市场。目前,全世界有几十家大的半导体公司都使用ARM公司的授权,因此既使得ARM技术获得更 多的第三方工具、制造、软件的支持,又使整个系统成本降低,使产品更容易进入市场被消费者所接受,更具有竞争力。
  1.2  ARM微处理器的应用领域及特点
  1.2.1  ARM微处理器的应用领域
  到目前为止,ARM微处理器及技术的应用几乎已经深入到各个领域:
  1、工业控制领域:作为32的RISC架构,基于ARM核的微控制器芯片不但占据了高端微控制器市场的大部分市场份额,同时也逐渐向低端微控制器应用领域扩展,ARM微控制器的低功耗、高性价比,向传统的8位/16位微控制器提出了挑战。
  2、无线通讯领域:目前已有超过85%的无线通讯设备采用了ARM技术, ARM以其高性能和低成本,在该领域的地位日益巩固。
  3、网络应用:随着宽带技术的推广,采用ARM技术的ADSL <http://www.dzsc.com/stock-ic/ADSL.html>芯片正逐步获得竞争优势。此外,ARM在语音及视频处理上行了优化,并获得广泛支持,也对DSP的应用领域提出了挑战。
  4、消费类电子产品:ARM技术在目前流行的数字音频播放器、数字机顶盒和游戏机中得到广泛采用。
  5、成像和安全产品:现在流行的数码相机和打印机中绝大部分采用ARM技术。手机中的32位SIM智能卡也采用了ARM技术。
  除此以外,ARM微处理器及技术还应用到许多不同的领域,并会在将来取得更加广泛的应用。
  1.2.2  ARM微处理器的特点
  采用RISC架构的ARM微处理器一般具有如下特点:
  1、体积小、低功耗、低成本、高性能;
  2、支持Thumb(16位)/ARM(32位)双指令集,能很好的兼容8位/16位器件;
  3、大量使用寄存器,指令执行速度更快;
  4、大多数数据操作都在寄存器中完成;
  5、寻址方式灵活简单,执行效率高;
  6、指令长度固定;
  1.3  ARM微处理器系列
  ARM微处理器目前包括下面几个系列,以及其它厂商基于ARM体系结构的处理器,除了具有ARM体系结构的共同特点以外,每一个系列的ARM微处理器都有各自的特点和应用领域。
  -    ARM7系列
  -    ARM9系列
  -    ARM9E系列
  -    ARM10E系列
  -    SecurCore系列
  -    Inter的Xscale
  -    Inter的StrongARM
  其中,ARM7、ARM9、ARM9E和ARM10为4个通用处理器系列,每一个系列提供一套相对独特的性能来满足不同应用领域的需求。SecurCore系列专门为安全要求较高的应用而设计。
  以下我们来详细了解一下各种处理器的特点及应用领域。
  1.3.1  ARM7微处理器系列
  ARM7系列微处理器为低功耗的32位RISC处理器,最适合用于对价位和功耗要求较高的消费类应用。ARM7微处理器系列具有如下特点:
  -    具有嵌入式ICE-RT逻辑,调试开发方便。
  -    极低的功耗,适合对功耗要求较高的应用,如便携式产品。
  -    能够提供0.9MIPS/MHz的三级流水线结构。
  -    代码密度高并兼容16位的Thumb指令集。
  -    对操作系统的支持广泛,包括Windows CE、Linux、Palm OS等。
  -    指令系统与ARM9系列、ARM9E系列和ARM10E系列兼容,便于用户的产品升级换代。
  -    主频最高可达130MIPS,高速的运算处理能力能胜任绝大多数的复杂应用。
  ARM7系列微处理器的主要应用领域为:工业控制、Internet设备、网络和调制解调器设备、移动电话等多种多媒体和嵌入式应用。
  ARM7系列微处理器包括如下几种类型的核:ARM7TDMI、ARM7TDMI-S、
  ARM720T、ARM7EJ。其中,ARM7TMDI是目前使用最广泛的32位嵌入式RISC处理器,属低端ARM处理器核。TDMI的基本含义为:
  T:    支持16为压缩指令集Thumb;
  D:    支持片上Debug;
  M:内嵌硬件乘法器(Multiplier)
  I:    嵌入式ICE,支持片上断点和调试点;
  本书所介绍的SAMSUNG <http://www.dzsc.com/stock-ic/SAMSUNG.html>公司的S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>即属于该系列的处理器。
  1.3.2  ARM9微处理器系列
  ARM9系列微处理器在高性能和低功耗特性方面提供最佳的性能。具有以下特点:
  -    5级整数流水线,指令执行效率更高。
  -    提供1.1MIPS/MHz的哈佛结构。
  -    支持32位ARM指令集和16位Thumb指令集。
  -    支持32位的高速AMBA总线接口。
  -    全性能的MMU,支持Windows CE、Linux、Palm OS等多种主流嵌入式操作系统。
  -    MPU支持实时操作系统。
  -    支持数据Cache和指令Cache,具有更高的指令和数据处理能力。
  ARM9系列微处理器主要应用于无线设备、仪器仪表、安全系统、机顶盒、高端打印机、数字照相机和数字摄像机等。
  ARM9系列微处理器包含ARM920T、ARM922T和ARM940T三种类型,以适用于不同的应用场合。
  1.3.3  ARM9E微处理器系列
  ARM9E系列微处理器为可综合处理器,使用单一的处理器内核提供了微控制器、DSP、Java应用系统的解决方案,极大的减少了芯片的面积和系统的复杂程度。ARM9E系列微处理器提供了增强的DSP处理能力,很适合于那些需要同时使用DSP和微控制器的应用场合。
  ARM9E系列微处理器的主要特点如下:
  -    支持DSP指令集,适合于需要高速数字信号处理的场合。
  -    5级整数流水线,指令执行效率更高。
  -    支持32位ARM指令集和16位Thumb指令集。
  -    支持32位的高速AMBA总线接口。
  -    支持VFP9浮点处理协处理器。
  -    全性能的MMU,支持Windows CE、Linux、Palm OS等多种主流嵌入式操作系统。
  -    MPU支持实时操作系统。
  -    支持数据Cache和指令Cache,具有更高的指令和数据处理能力。
  -    主频最高可达300MIPS。
  ARM9系列微处理器主要应用于下一代无线设备、数字消费品、成像设备、工业控制、存储设备和网络设备等领域。
  ARM9E系列微处理器包含ARM926EJ-S、ARM946E-S和ARM966E-S三种类型,以适用于不同的应用场合。
  1.3.4  ARM10E微处理器系列
  ARM10E系列微处理器具有高性能、低功耗的特点,由于采用了新的体系结构,与同等的ARM9器件相比较,在同样的时钟频率下,性能提高了近50%,同时,ARM10E系列微处理器采用了两种先进的节能方式,使其功耗极低。
  ARM10E系列微处理器的主要特点如下:
  -    支持DSP指令集,适合于需要高速数字信号处理的场合。
  -    6级整数流水线,指令执行效率更高。
  -    支持32位ARM指令集和16位Thumb指令集。
  -    支持32位的高速AMBA总线接口。
  -    支持VFP10浮点处理协处理器。
  -    全性能的MMU,支持Windows CE、Linux、Palm OS等多种主流嵌入式操作系统。
  -    支持数据Cache和指令Cache,具有更高的指令和数据处理能力
  -    主频最高可达400MIPS。
  -    内嵌并行读/写操作部件。
  ARM10E系列微处理器主要应用于下一代无线设备、数字消费品、成像设备、工业控制、通信和信息系统等领域。
  ARM10E系列微处理器包含ARM1020E、ARM1022E和ARM1026EJ-S三种类型,以适用于不同的应用场合。
  1.3.5  SecurCore微处理器系列
  SecurCore系列微处理器专为安全需要而设计,提供了完善的32位RISC技术的安全解决方案,因此,SecurCore系列微处理器除了具有ARM体系结构的低功耗、高性能的特点外,还具有其独特的优势,即提供
  第2章 ARM微处理器的编程模型
  本章简介ARM微处理器编程模型的一些基本概念,包括工作状态切换、数据的存储格式、处理器异常等,通过对本章的阅读,希望读者能了解ARM微处理器的基本工作原理和一些与程序设计相关的基本技术细节,为以后的程序设计打下基础。
  本章的主要内容:
  -    ARM微处理器的工作状态
  -    ARM体系结构的存储器格式
  -    ARM微处理器的工作模式
  -    ARM体系结构的寄存器组织
  -    ARM微处理器的异常状态
  在开始本章之前,首先对字(Word)、半字(Half-Word)、字节(Byte)的概念作一个说明:
  字(Word):在ARM体系结构中,字的长度为32位,而在8位/16位处理器体系结构中,字的长度一般为16位,请读者在阅读时注意区分。
  半字(Half-Word):在ARM体系结构中,半字的长度为16位,与8位/16位处理器体系结构中字的长度一致。
  字节(Byte):在ARM体系结构和8位/16位处理器体系结构中,字节的长度均为8位。
  2.1  ARM微处理器的工作状态
  从编程的角度看,ARM微处理器的工作状态一般有两种,并可在两种状态之间切换:
  -    第一种为ARM状态,此时处理器执行32位的字对齐的ARM指令;
  -    第二种为Thumb状态,此时处理器执行16位的、半字对齐的Thumb指令。
  当 ARM微处理器执行32位的ARM指令集时,工作在ARM状态;当ARM微处理器执行16位的Thumb指令集时,工作在Thumb状态。在程序的执行过 程中,微处理器可以随时在两种工作状态之间切换,并且,处理器工作状态的转变并不影响处理器的工作模式和相应寄存器中的内容。
  状态切换方法:
  ARM指令集和Thumb指令集均有切换处理器状态的指令,并可在两种工作状态之间切换,但ARM微处理器在开始执行代码时,应该处于ARM状态。
  进 入Thumb状态:当操作数寄存器的状态位(位0)为1时,可以采用执行BX指令的方法,使微处理器从ARM状态切换到Thumb状态。此外,当处理器处 于Thumb状态时发生异常(如IRQ、FIQ、Undef、Abort、SWI等),则异常处理返回时,自动切换到Thumb状态。
  进入ARM状态:当操作数寄存器的状态位为0时,执行BX指令时可以使微处理器从Thumb状态切换到ARM状态。此外,在处理器进行异常处理时,把PC指针放入异常模式链接寄存器中,并从异常向量地址开始执行程序,也可以使处理器切换到ARM状态。
  2.2  ARM体系结构的存储器格式
  ARM体系结构将存储器看作是从零地址开始的字节的线性组合。从零字节到三字节放置第一个存储的字数据,从第四个字节到第七个字节放置第二个存储的字数据,依次排列。作为32位的微处理器,ARM体系结构所支持的最大寻址空间为4GB(232字节)。
  ARM体系结构可以用两种方法存储字数据,称之为大端格式和小端格式,具体说明如下:
  大端格式:
  在这种格式中,字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中,如图2.1所示:
  图2.1  以大端格式存储字数据
  小端格式:
  与大端存储格式相反,在小端存储格式中,低地址中存放的是字数据的低字节,高地址存放的是字数据的高字节。如图2.2所示:
  图2. 2 以小端格式存储字数据
  2.3  指令长度及数据类型
  ARM微处理器的指令长度可以是32位(在ARM状态下),也可以为16位(在Thumb状态下)。
  ARM微处理器中支持字节(8位)、半字(16位)、字(32位)三种数据类型,其中,字需要4字节对齐(地址的低两位为0)、半字需要2字节对齐(地址的最低位为0)。
  2.4  处理器模式
  ARM微处理器支持7种运行模式,分别为:
  ─ 用户模式(usr):        ARM处理器正常的程序执行状态
  ─ 快速中断模式(fiq):    用于高速数据传输或通道处理
  ─ 外部中断模式(irq):    用于通用的中断处理
  ─ 管理模式(svc):        操作系统使用的保护模式
  ─ 数据访问终止模式(abt):    当数据或指令预取终止时进入该模式,可用于虚拟存储及存储保护。
  ─ 系统模式(sys):        运行具有特权的操作系统任务。
  ─ 未定义指令中止模式(und):当未定义的指令执行时进入该模式,可用于支持硬件协处理器的软件仿真。
  ARM微处理器的运行模式可以通过软件改变,也可以通过外部中断或异常处理改变。
  大多数的应用程序运行在用户模式下,当处理器运行在用户模式下时,某些被保护的系统资源是不能被访问的。
  除用户模式以外,其余的所有6种模式称之为非用户模式,或特权模式(Privileged Modes);其中除去用户模式和系统模式以外的5种又称为异常模式(Exception Modes),常用于处理中断或异常,以及需要访问受保护的系统资源等情况。
  2.5  寄存器组织
  ARM 微处理器共有37个32位寄存器,其中31个为通用寄存器,6个为状态寄存器。但是这些寄存器不能被同时访问,具体哪些寄存器是可编程访问的,取决微处理 器的工作状态及具体的运行模式。但在任何时候,通用寄存器R14~R0、程序计数器PC、一个或两个状态寄存器都是可访问的。
  2.5.1  ARM状态下的寄存器组织
  通用寄存器:
  通用寄存器包括R0~R15,可以分为三类:
  ─    未分组寄存器R0~R7;
  ─     分组寄存器R8~R14
  ─    程序计数器PC(R15)
  未分组寄存器R0~R7:
  在所有的运行模式下,未分组寄存器都指向同一个物理寄存器,他们未被系统用作特殊的用途,因此,在中断或异常处理进行运行模式转换时,由于不同的处理器运行模式均使用相同的物理寄存器,可能会造成寄存器中数据的破坏,这一点在进行程序设计时应引起注意。
  分组寄存器R8~R14
  对于分组寄存器,他们每一次所访问的物理寄存器与处理器当前的运行模式有关。
  对于R8~R12来说,每个寄存器对应两个不同的物理寄存器,当使用fiq模式时,访问寄存器R8_fiq~R12_fiq;当使用除fiq模式以外的其他模式时,访问寄存器R8_usr~R12_usr。
  对于R13、R14来说,每个寄存器对应6个不同的物理寄存器,其中的一个是用户模式与系统模式共用,另外5个物理寄存器对应于其他5种不同的运行模式。
  采用以下的记号来区分不同的物理寄存器:
  R13_<mode>
  R14_<mode>
  其中,mode为以下几种模式之一:usr、fiq、irq、svc、abt、und。
  寄存器R13在ARM指令中常用作堆栈指针,但这只是一种习惯用法,用户也可使用其他的寄存器作为堆栈指针。而在Thumb指令集中,某些指令强制性的要求使用R13作为堆栈指针。
  由 于处理器的每种运行模式均有自己独立的物理寄存器R13,在用户应用程序的初始化部分,一般都要初始化每种模式下的R13,使其指向该运行模式的栈空间, 这样,当程序的运行进入异常模式时,可以将需要保护的寄存器放入R13所指向的堆栈,而当程序从异常模式返回时,则从对应的堆栈中恢复,采用这种方式可以 保证异常发生后程序的正常执行。
  R14也称作子程序连接寄存器(Subroutine LINK <http://www.dzsc.com/stock-ic/LINK.html> Register)或连接寄存器LR。当执行BL子程序调用指令时,R14中得到R15(程序计数器PC)的备份。其他情况下,R14用作通用寄存器。与 之类似,当发生中断或异常时,对应的分组寄存器R14_svc、R14_irq、R14_fiq、R14_abt和R14_und用来保存R15的返回 值。
  寄存器R14常用在如下的情况:
  在每一种运行模式下,都可用R14保存子程序的返回地址,当用BL或BLX指令调用子程序时,将PC的当前值拷贝给R14,执行完子程序后,又将R14的值拷贝回PC,即可完成子程序的调用返回。以上的描述可用指令完成:
  1、执行以下任意一条指令:
  MOV        PC,LR
  BX        LR
  2、在子程序入口处使用以下指令将R14存入堆栈:
  STMFD    SP!,{<Regs>,LR}
  对应的,使用以下指令可以完成子程序返回:
  LDMFD    SP!,{<Regs>,PC}
  R14也可作为通用寄存器。
  程序计数器PC(R15)
  寄 存器R15用作程序计数器(PC)。在ARM状态下,位[1:0]为0,位[31:2]用于保存PC;在Thumb状态下,位[0]为0,位[31:1] 用于保存PC;虽然可以用作通用寄存器,但是有一些指令在使用R15时有一些特殊限制,若不注意,执行的结果将是不可预料的。在ARM状态下,PC的0和 1位是0,在Thumb状态下,PC的0位是0。
  R15虽然也可用作通用寄存器,但一般不这么使用,因为对R15的使用有一些特殊的限制,当违反了这些限制时,程序的执行结果是未知的。
  由于ARM体系结构采用了多级流水线技术,对于ARM指令集而言,PC总是指向当前指令的下两条指令的地址,即PC的值为当前指令的地址值加8个字节。
  图2.3  ARM状态下的寄存器组织
  在ARM状态下,任一时刻可以访问以上所讨论的16个通用寄存器和一到两个状态寄存器。在非用户模式(特权模式)下,则可访问到特定模式分组寄存器,图2.3说明在每一种运行模式下,哪一些寄存器是可以访问的。
  寄存器R16:
  寄存器R16用作CPSR(Current Program Status Register,当前程序状态寄
  第3章 ARM微处理器的指令系统
  本章介绍ARM指令集、Thumb指令集,以及各类指令对应的寻址方式,通过对本章的阅读,希望读者能了解ARM微处理器所支持的指令集及具体的使用方法。
  本章的主要内容有:
  -    ARM指令集、Thumb指令集概述。
  -    ARM指令集的分类与具体应用。
  -    Thumb指令集简介及应用场合。
  3.1  ARM微处理器的指令集概述
  3.1.1  ARM微处理器的指令的分类与格式
  ARM微处理器的指令集是加载/存储型的,也即指令集仅能处理寄存器中的数据,而且处理结果都要放回寄存器中,而对系统存储器的访问则需要通过专门的加载/存储指令来完成。
  ARM微处理器的指令集可以分为跳转指令、数据处理指令、程序状态寄存器(PSR)处理指令、加载/存储指令、协处理器指令和异常产生指令六大类,具体的指令及功能如表3-1所示(表中指令为基本ARM指令,不包括派生的ARM指令)。
  表3-1   ARM指令及功能描述
  助记符    指令功能描述
  ADC    带进位加法指令
  ADD    加法指令
  AND    逻辑与指令
  B    跳转指令
  BIC    位清零指令
  BL    带返回的跳转指令
  BLX    带返回和状态切换的跳转指令
  BX    带状态切换的跳转指令
  CDP    协处理器数据操作指令
  CMN    比较反值指令
  CMP    比较指令
  EOR    异或指令
  LDC    存储器到协处理器的数据传输指令
  LDM    加载多个寄存器指令
  LDR    存储器到寄存器的数据传输指令
  MCR    从ARM寄存器到协处理器寄存器的数据传输指令
  MLA    乘加运算指令
  MOV    数据传送指令
  MRC    从协处理器寄存器到ARM寄存器的数据传输指令
  MRS    传送CPSR或SPSR的内容到通用寄存器指令
  MSR    传送通用寄存器到CPSR或SPSR的指令
  MUL    32位乘法指令
  MLA    32位乘加指令
  MVN    数据取反传送指令
  ORR    逻辑或指令
  RSB    逆向减法指令
  RSC    带借位的逆向减法指令
  SBC    带借位减法指令
  STC    协处理器寄存器写入存储器指令
  STM    批量内存字写入指令
  STR    寄存器到存储器的数据传输指令
  SUB    减法指令
  SWI    软件中断指令
  SWP    交换指令
  TEQ    相等测试指令
  TST    位测试指令
  3.1.2  指令的条件域
  当处理器工作在ARM状态时,几乎所有的指令均根据CPSR中条件码的状态和指令的条件域有条件的执行。当指令的执行条件满足时,指令被执行,否则指令被忽略。
  每 一条ARM指令包含4位的条件码,位于指令的最高4位[31:28]。条件码共有16种,每种条件码可用两个字符表示,这两个字符可以添加在指令助记符的 后面和指令同时使用。例如,跳转指令B可以加上后缀EQ变为BEQ表示“相等则跳转”,即当CPSR中的Z标志置位时发生跳转。
  在16种条件标志码中,只有15种可以使用,如表3-2所示,第16种(1111 <http://www.dzsc.com/stock-ic/1111.html>)为系统保留,暂时不能使用。
  表3-2    指令的条件码
  条件码    助记符后缀    标 志    含 义
  0000    EQ    Z置位    相等
  0001    NE    Z清零    不相等
  0010    CS    C置位    无符号数大于或等于
  0011 <http://www.dzsc.com/stock-ic/0011.html>    CC    C清零    无符号数小于
  0100    MI    N置位    负数
  0101    PL    N清零    正数或零
  0110    VS    V置位    溢出
  0111    VC    V清零    未溢出
  1000 <http://www.dzsc.com/stock-ic/1000.html>    HI    C置位Z清零    无符号数大于
  1001 <http://www.dzsc.com/stock-ic/1001.html>    LS    C清零Z置位    无符号数小于或等于
  1010 <http://www.dzsc.com/stock-ic/1010.html>    GE    N等于V    带符号数大于或等于
  1011 <http://www.dzsc.com/stock-ic/1011.html>    LT    N不等于V    带符号数小于
  1100 <http://www.dzsc.com/stock-ic/1100.html>    GT    Z清零且(N等于V)    带符号数大于
  1101 <http://www.dzsc.com/stock-ic/1101.html>    LE    Z置位或(N不等于V)    带符号数小于或等于
  1110 <http://www.dzsc.com/stock-ic/1110.html>    AL    忽略    无条件执行
  3.2  ARM指令的寻址方式
  所谓寻址方式就是处理器根据指令中给出的地址信息来寻找物理地址的方式。目前ARM指令系统支持如下几种常见的寻址方式。
  3.2.1  立即寻址
  立即寻址也叫立即数寻址,这是一种特殊的寻址方式,操作数本身就在指令中给出,只要取出指令也就取到了操作数。这个操作数被称为立即数,对应的寻址方式也就叫做立即寻址。例如以下指令:
  ADD    R0,R0,#1            ;R0←R0+1
  ADD    R0,R0,#0x3f        ;R0←R0+0x3f
  在以上两条指令中,第二个源操作数即为立即数,要求以“#”为前缀,对于以十六进制表示的立即数,还要求在“#”后加上“0x”或“&”。
  3.2.2  寄存器寻址
  寄存器寻址就是利用寄存器中的数值作为操作数,这种寻址方式是各类微处理器经常采用的一种方式,也是一种执行效率较高的寻址方式。以下指令:
  ADD    R0,R1,R2            ;R0←R1+R2
  该指令的执行效果是将寄存器R1和R2的内容相加,其结果存放在寄存器R0中。
  3.2.2  寄存器间接寻址
  寄存器间接寻址就是以寄存器中的值作为操作数的地址,而操作数本身存放在存储器中。例如以下指令:
  ADD R0,R1,[R2]            ;R0←R1+[R2]
  LDR    R0,[R1]                ;R0←[R1]
  STR    R0,[R1]                ;[R1]←R0
  在第一条指令中,以寄存器R2的值作为操作数的地址,在存储器中取得一个操作数后与R1相加,结果存入寄存器R0中。
  第二条指令将以R1的值为地址的存储器中的数据传送到R0中。
  第三条指令将R0的值传送到以R1的值为地址的存储器中。
  3.2.3  基址变址寻址
  基址变址寻址就是将寄存器(该寄存器一般称作基址寄存器)的内容与指令中给出的地址偏移量相加,从而得到一个操作数的有效地址。变址寻址方式常用于访问某基地址附近的地址单元。采用变址寻址方式的指令常见有以下几种形式,如下所示:
  LDR R0,[R1,#4]            ;R0←[R1+4]
  LDR R0,[R1,#4]!            ;R0←[R1+4]、R1←R1+4
  LDR R0,[R1] ,#4            ;R0←[R1]、R1←R1+4
  LDR R0,[R1,R2]                ;R0←[R1+R2]
  在第一条指令中,将寄存器R1的内容加上4形成操作数的有效地址,从而取得操作数存入寄存器R0中。
  在第二条指令中,将寄存器R1的内容加上4形成操作数的有效地址,从而取得操作数存入寄存器R0中,然后,R1的内容自增4个字节。
  在第三条指令中,以寄存器R1的内容作为操作数的有效地址,从而取得操作数存入寄存器R0中,然后,R1的内容自增4个字节。
  在第四条指令中,将寄存器R1的内容加上寄存器R2的内容形成操作数的有效地址,从而取得
  第4章 ARM程序设计基础
  ARM编译器一般都支持汇编语言的程序设计和C/C++语言的程序设计,以及两者的混合编程。本章介绍ARM程序设计的一些基本概念,如ARM汇编语言的伪指令、汇编语言的语句格式和汇编语言的程序结构等,同时介绍C/C++和汇编语言的混合编程等问题。
  本章的主要内容:
  -    ARM编译器所支持的伪指令
  -    汇编语言的语句格式
  -    汇编语言的程序结构
  -    相关的程序示例
  4.1  ARM汇编器所支持的伪指令
  在 ARM汇编语言程序里,有一些特殊指令助记符,这些助记符与指令系统的助记符不同,没有相对应的操作码,通常称这些特殊指令助记符为伪指令,他们所完成的 操作称为伪操作。伪指令在源程序中的作用是为完成汇编程序作各种准备工作的,这些伪指令仅在汇编过程中起作用,一旦汇编结束,伪指令的使命就完成。
  在ARM的汇编程序中,有如下几种伪指令:符号定义伪指令、数据定义伪指令、汇编控制伪指令、宏指令以及其他伪指令。
  4.1.1  符号定义(Symbol Definition)伪指令
  符号定义伪指令用于定义ARM汇编程序中的变量、对变量赋值以及定义寄存器的别名等操作。常见的符号定义伪指令有如下几种:
  -    用于定义全局变量的GBLA、GBLL和GBLS。
  -    用于定义局部变量的LCLA、LCLL和LCLS。
  -    用于对变量赋值的SETA、SETL、SETS。
  -    为通用寄存器列表定义名称的RLIST。
  1、    GBLA、GBLL和GBLS
  语法格式:
  GBLA(GBLL或GBLS)    全局变量名
  GBLA、GBLL和GBLS伪指令用于定义一个ARM程序中的全局变量,并将其初始化。其中:
  GBLA伪指令用于定义一个全局的数字变量,并初始化为0;
  GBLL伪指令用于定义一个全局的逻辑变量,并初始化为F(假);
  GBLS伪指令用于定义一个全局的字符串变量,并初始化为空;
  由于以上三条伪指令用于定义全局变量,因此在整个程序范围内变量名必须唯一。
  使用示例:
  GBLA    TEST1 <http://www.dzsc.com/stock-ic/TEST1.html>                    ;定义一个全局的数字变量,变量名为TEST1 <http://www.dzsc.com/stock-ic/TEST1.html>
  TEST1 <http://www.dzsc.com/stock-ic/TEST1.html>    SETA    0xaa            ;将该变量赋值为0xaa
  GBLL    TEST2 <http://www.dzsc.com/stock-ic/TEST2.html>                    ;定义一个全局的逻辑变量,变量名为TEST2 <http://www.dzsc.com/stock-ic/TEST2.html>
  TEST2 <http://www.dzsc.com/stock-ic/TEST2.html>    SETL    {TRUE}            ;将该变量赋值为真
  GBLS    test3 <http://www.dzsc.com/stock-ic/test3.html>                    ;定义一个全局的字符串变量,变量名为test3 <http://www.dzsc.com/stock-ic/test3.html>
  test3 <http://www.dzsc.com/stock-ic/test3.html>    SETS    “Testing”        ;将该变量赋值为“Testing”
  2、    LCLA、LCLL和LCLS
  语法格式:
  LCLA(LCLL或LCLS)    局部变量名
  LCLA、LCLL和LCLS伪指令用于定义一个ARM程序中的局部变量,并将其初始化。其中:
  LCLA伪指令用于定义一个局部的数字变量,并初始化为0;
  LCLL伪指令用于定义一个局部的逻辑变量,并初始化为F(假);
  LCLS伪指令用于定义一个局部的字符串变量,并初始化为空;
  以上三条伪指令用于声明局部变量,在其作用范围内变量名必须唯一。
  使用示例:
  LCLA    test4 <http://www.dzsc.com/stock-ic/test4.html>                    ;声明一个局部的数字变量,变量名为test4 <http://www.dzsc.com/stock-ic/test4.html>
  test3 <http://www.dzsc.com/stock-ic/test3.html>    SETA    0xaa            ;将该变量赋值为0xaa
  LCLL    TEST5 <http://www.dzsc.com/icstock/224/TEST5.html>                    ;声明一个局部的逻辑变量,变量名为TEST5 <http://www.dzsc.com/icstock/224/TEST5.html>
  test4 <http://www.dzsc.com/stock-ic/test4.html>    SETL    {TRUE}            ;将该变量赋值为真
  LCLS    TEST6 <http://www.dzsc.com/stock-ic/TEST6.html>                    ;定义一个局部的字符串变量,变量名为TEST6 <http://www.dzsc.com/stock-ic/TEST6.html>
  TEST6 <http://www.dzsc.com/stock-ic/TEST6.html>    SETS    “Testing”        ;将该变量赋值为“Testing”
  3、    SETA、SETL和SETS
  语法格式:
  变量名    SETA(SETL或SETS)    表达式
  伪指令SETA、SETL、SETS用于给一个已经定义的全局变量或局部变量赋值。
  SETA伪指令用于给一个数学变量赋值;
  SETL伪指令用于给一个逻辑变量赋值;
  SETS伪指令用于给一个字符串变量赋值;
  其中,变量名为已经定义过的全局变量或局部变量,表达式为将要赋给变量的值。
  使用示例:
  LCLA    test3 <http://www.dzsc.com/stock-ic/test3.html>                    ;声明一个局部的数字变量,变量名为test3 <http://www.dzsc.com/stock-ic/test3.html>
  test3 <http://www.dzsc.com/stock-ic/test3.html>    SETA    0xaa            ;将该变量赋值为0xaa
  LCLL    test4 <http://www.dzsc.com/stock-ic/test4.html>                    ;声明一个局部的逻辑变量,变量名为test4 <http://www.dzsc.com/stock-ic/test4.html>
  test4 <http://www.dzsc.com/stock-ic/test4.html>    SETL    {TRUE}            ;将该变量赋值为真
  4、    RLIST
  语法格式:
  名称     RLIST    {寄存器列表}
  RLIST伪指令可用于对一个通用寄存器列表定义名称,使用该伪指令定义的名称可在ARM指令LDM/STM中使用。在LDM/STM指令中,列表中的寄存器访问次序为根据寄存器的编号由低到高,而与列表中的寄存器排列次序无关。
  使用示例:
  RegList    RLIST    {R0-R5,R8,R10}    ;将寄存器列表名称定义为RegList,可在ARM指令LDM/STM中通过该名称访问寄存器列表。
  4.1.2  数据定义(Data Definition)伪指令
  数据定义伪指令一般用于为特定的数据分配存储单元,同时可完成已分配存储单元的初始化。常见的数据定义伪指令有如下几种:
  -    DCB            用于分配一片连续的字节存储单元并用指定的数据初始化。
  -    DCW(DCWU)    用于分配一片连续的半字存储单元并用指定的数据初始化。
  -    DCD(DCDU)    用于分配一片连续的字存储单元并用指定的数据初始化。
  -    DCFD(DCFDU)用于为双精度的浮点数分配一片连续的字存储单元并用指定的数据初始化。
  -    DCFS(DCFSU)    用于为单精度的浮点数分配一片连续的字存储单元并用指定的数据初始化。
  -    DCQ(DCQU)    用于分配一片以8字节为单位的连续的存储单元并用指定的数据初始化。
  -    SPACE            用于分配一片连续的存储单元
  -    MAP            用于定义一个结构化的内存表首地址
  -    FIELD            用于定义一个结构化的内存表的数据域
  1、    DCB
  语法格式:
  标号        DCB    表达式
  DCB伪指令用于分配一片连续的字节存储单元并用
  第5章 应用系统设计与调试
  本章主要介绍基于S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>的硬件系统的详细设计步骤、实现细节、硬件系统的调试方法等,通过对本章的阅读,可以使绝大多数的读者具有根据自身的需求、设计特定应用系统的能力。
  尽管本章所描述的内容为基于S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>的应用系统设计,但由于ARM体系结构的一致性、以及外围电路的通用性,本章的所有内容对设计其他基于ARM内核芯片的应用系统,也具有很大的参考价值。
  本章的主要内容包括:
  -    嵌入式系统设计的基本方法。
  -    S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>概述。
  -    S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>的基本工作原理
  -    基于S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>的硬件系统设计详述
  -    硬件系统的调试方法
  5.1  系统设计概述
  根 据用户需求,设计出特定的嵌入式应用系统,是每一个嵌入式系统设计工程师应该达到的目标。嵌入式应用系统的设计包含硬件系统的设计和软件系统设计两个部 分,并且这两部分的设计是互相关联、密不可分的,嵌入式应用系统的设计经常需要在硬件和软件的设计之间进行权衡与折中。因此,这就要求嵌入式系统设计工程 师具有较深厚的硬件和软件基础,并具有熟练应用的能力。这也是嵌入式应用系统设计与其他的纯粹的软件设计或硬件设计最大的区别。
  本章以北京微芯力 科技有限公司(www.winsilicon.com)设计生产的ARM Linux评估开发板为原型,详细分析系统的软、硬件设计步骤、实现细节以及调试技巧等。ARM Linux评估开发板的设计以学习与应用兼顾为出发点,在保证用户完成ARM技术的学习开发的同时,考虑了系统的扩展、电路板的面积、散热、电磁兼容性以 及安装等问题,因此,该板也可作为嵌入式系统主板,直接应用在一些实际系统中。
  图5.1.1是ARM Linux评估开发板的结构框图,各部分基本功能描述如下:
  -    串行接口电路用于S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>系统与其他应用系统的短距离双向串行通讯;
  -    复位电路可完成系统上电复位和在系统工作时用户按键复位;
  -    电源电路为5V到3.3V <http://www.dzsc.com/icstock/508/3.3V.html>的DC-DC转换器,给S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>及其他需要3.3V <http://www.dzsc.com/icstock/508/3.3V.html>电源的外围电路供电;
  -    10MHZ <http://www.dzsc.com/icstock/609/10MHZ.html>有源晶振为系统提供工作时钟,通过片内PLL电路倍频为50MHZ <http://www.dzsc.com/icstock/619/50MHZ.html>作为微处理器的工作时钟;
  -    FLASH <http://www.dzsc.com/stock-ic/FLASH.html>存储器可存放已调试好的用户应用程序、嵌入式操作系统或其他在系统掉电后需要保存的用户数据等;
  -    SDRAM <http://www.dzsc.com/icstock/613/SDRAM.html>存储器作为系统运行时的主要区域,系统及用户数据、堆栈均位于SDRAM <http://www.dzsc.com/icstock/613/SDRAM.html>存储器中;
  -    10M/100M以太网接口为系统提供以太网接入的物理通道,通过该接口,系统可以10M或100Mbps的速率接入以太网;
  -    JTAG接口可对芯片内部的所有部件进行访问,通过该接口可对系统进行调试、编程等;
  -    IIC存储器可存储少量需要长期保存的用户数据;
  -    系统总线扩展引出了数据总线、地址总线和必须的控制总线,便于用户根据自身的特定需求,扩展外围电路。
  图5.1.1   ARM Linux评估开发板的结构框图
  5.2  S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>概述
  5.2.1  S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>及片内外围简介
  在进行系统设计之前,有必要对ARM Linux评估开发板上的ARM芯片S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>及其工作原理进行比较详细的介绍,读者只有对该微处理器的工作原理有了较详细的了解,才能进行特定应用系统的设计。
  SAMSUNG <http://www.dzsc.com/stock-ic/SAMSUNG.html>公司的S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>是基于以太网应用系统的高性价比16/32位RISC微控制器,内含一个由ARM公司设计的16/32位ARM7TDMI RISC处理器核,ARM7TDMI为低功耗、高性能的16/32核,最适合用于对价格及功耗敏感的应用场合。
  除了ARM7TDMI核以外,S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>比较重要的片内外围功能模块包括:
  -    2个带缓冲描述符(Buffer Descriptor)的HDLC通道
  -    2个UART通道
  -    2个GDMA通道
  -    2个32位定时器
  -    18个可编程的I/O口。
  片内的逻辑控制电路包括:
  -    中断控制器
  -    DRAM/SDRAM <http://www.dzsc.com/icstock/613/SDRAM.html>控制器
  -    ROM/SRAM和FLASH <http://www.dzsc.com/stock-ic/FLASH.html>控制器
  -    系统管理器
  -    一个内部32位系统总线仲裁器
  -    一个外部存储器控制器。
  S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>结构框图如图5.2.1所示。
  图 5.2.1  S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>结构框
  S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>的特性描述如下:
  体系结构
  -    用于嵌入式以太网应用的集成系统
  -    全16/32的RISC架构
  -    支持大、小端模式。内部架构为大端模式,外部存储器可为大、小端模式
  -    内含效率高、功能强的ARM7TDMI处理器核
  -    高性价比、基于JTAG接口的调试方案
  -    边界扫描接口
  系统管理器
  -    支持ROM/SRAM <http://www.dzsc.com/icstock/221/SRAM.html>、FLASH <http://www.dzsc.com/stock-ic/FLASH.html>、DRAM和外部I/O以8/16/32位的方式操作
  -    带总线请求/应答引脚的外部总线控制器
  -    支持EDO/常规或SDRAM <http://www.dzsc.com/icstock/613/SDRAM.html>存储器
  -    可编程的访问周期(可设定0~7个等待周期)
  -    4字的写缓冲
  -    高性价比的从存储器到外围的DMA接口
  一体化的指令/数据Cache
  -    一体化的8K Cache
  -    支持LRC(近期最少使用)替换算法
  -    Cache可配置为内部SRAM <http://www.dzsc.com/icstock/221/SRAM.html>
  IIC接口
  -    仅支持主控模式
  -    串行时钟由波特率发生器生成
  Ethernet控制器
  -    带猝发模式的DMA引擎
  -    DMA发送/接收缓冲区(256字节发送,256字节接收)
  -    MAC发送/接收FIFO缓冲区(80字节发送,16字节接收)
  -    数据对准逻辑
  -    支持端模式变换
  -    100M/10Mbps的工作速率
  -    与IEEE802.3标准完全兼容
  -    提供MII和7线制10Mbps接口
  -    站管理信号生成
  -    片内CAM(可达21个目的地址)
  -    带暂停特性的全双工模式
  -    支持长/短包模式
  -    包拆装PDA生成
  HDLC (High-Level Data LINK <http://www.dzsc.com/stock-ic/LINK.html> CONTROL <http://www.dzsc.com/stock-ic/CONTROL.html>) 高层数据链路协议
  -    HDLC协议特征:标志检测与同步;零插入与删除;空闲检测和发送;FCS生成和检测(16位);终止检测与发送
  -    地址搜索模式(可扩展到四字节)
  -    可选择CRC模式或非CRC模式
  -    用于时钟恢复的数字PLL模块
  -    波特率生成器
  -    发送和接收支持NRZ/NRZI/FM/曼切斯特数据格式
  -    回环与自动回波模式
  -    8字的发送和接收FIFO
  -    可选的1字或4字数据传送方式
  -    数据对准逻辑
  -    可编程中断
  -    MODEM <http://www.dzsc.com/stock-ic/MODEM.html>接口
  -    高达10Mbps的工作速率
  -    基于8位位组的HDLC帧长度
  -    每个HDLC有2通道DMA缓冲描述符用于发送和接收
  DMA控制器
  -    用于存储器到存储器、存储器到UATR、UATR到存储器数据传送的2通道通用DMA控制器,不受CPU干预
  -    可由程序或外部DMA请求启动
  -    可增减源地址或目的地址,无论8位、16位或32位数据传输
  -    4种数据猝发模式
  UART
  -    2个可工作于DMA方式或中断方式的UART模块
  -    支持5、6、7、8位的串行数据发送和接收
  -    波特率可编程
  -    1位或2位停止位
  -    奇/偶校验
  -    间隔信号的生成与检测
  -    奇偶校验、覆盖和帧错误检测
  -    ×16时钟模式
  -    支持红外发送和接收
  定时器
  -    2个可编程32位定时器
  -    间隔模式或触发模式工作
  可编程I/O口
  -    18个可编程I/O口
  -    可分别配置为输入模式、输出模式或特殊功能模式
  中断控制器
  -    21个中断源,包括4个外部中断源
  -    正常中断或快速中断模式(IRQ、FIQ)
  -    基于优先级的中断处理
  PLL
  -    外部时钟可由片内PLL倍频以提高系统时钟
  -    输入频率范围:10~40MHZ <http://www.dzsc.com/icstock/580/40MHZ.html>
  -    输出频率可以是输入时钟的5倍
  工作电压
  -    3.3V <http://www.dzsc.com/icstock/508/3.3V.html>,偏
  5.2.2  S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>的引脚分布及信号描述
  图5.2.2是S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>的引脚分布图
  图5.2.2  S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>的引脚分布图
  各引脚信号描述如下:
  表5-2-1 S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>的引脚信号描述
  信  号    引脚号    类 型    描      述
  XCLK    80    I    S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>的系统时钟源。如果CLKSEN为低电平,通过PLL倍频的输出时钟作为S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>的内部系统时钟。如果CLKSEN为高电平,XCLK直接作为S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>的内部系统时钟。
  MCLKO/SDCLK      77    O    系统时钟输出。SDCLK为SDRAM <http://www.dzsc.com/icstock/613/SDRAM.html>提供时钟信号
  CLKSEL    83    I    时钟选择。如果CLKSEL为低电平,PLL输出时钟作为S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>的内部系统时钟。如果CLKSEL为高电平,XCLK直接作为S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>的内部系统时钟。
  nRESET    82    I    复位信号。nRESET为S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>的复位信号,要使系统可靠复位,nRESET必须至少保持64个主时钟周期的低电平。
  CLKOEN    76    I    时钟输出允许/禁止。高电平允许系统时钟信号输出,低电平禁止。
  TMODE    63    I    测试模式选择。低电平为正常工作模式,高电平为芯片测试模式。
  FILTER <http://www.dzsc.com/stock-ic/FILTER.html>    55    AI    如果使用PLL,应在该引脚和数字地之间接820pF的陶瓷电容。
  TCK    58    I    JTAG测试时钟。JTAG测试时钟信号用于切换状态信息和检测数据的输入输出。该引脚在片内下拉。
  TMS    59    I    JTAG测试模式选择。该信号控制S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>的JTAG测试操作。该引脚在片内上拉。
  TDI    60    I    JTAG测试数据输入。在JTAG测试操作的过程中,该信号将指令和数据串行送入S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>。该引脚在片内上拉。
  TDO    61    O    JTAG测试数据输出。在JTAG测试操作的过程中,该信号将指令和数据串行送出S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>。
  nTRST    62    I    JTAG复位信号,低电平复位。异步复位JTAG逻辑。该引脚在片内上拉。
  ADDR[21:0]/
  ADDR[10]/AP    117-110
  129-120
  135-132    O    地址总线。22位的地址总线可寻址每一个ROM/ SRAM <http://www.dzsc.com/icstock/221/SRAM.html>组、FLASH <http://www.dzsc.com/stock-ic/FLASH.html>存储器组、DRAM组和外部I/O组的4M字(64M字节)的地址范围。
  XDATA[31:0]    141-136
  154-144
  166-159
  175-169    I/O    外部数据总线(双向、32位)。S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>支持外部8位,16位,32位的数据宽度。
  nRAS[3:0]/
  nSDCS[3:0]    94,91,
  90,89    O    DRAM行地址锁存信号。S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>支持最多4个DRAM组,每个nRAS输出控制一组。nSDCS[3:0]用作SDRAM <http://www.dzsc.com/icstock/613/SDRAM.html>的片选信号。
  nCAS[3:0]
  nCAS[0]
  /nSDRAS
  nCAS[1]
  /nSDCAS
  nCAS[2]/CKE    98,97,
  96,95    O    DRAM列地址锁存信号。无论访问哪一个DRAM组,4个nCAS输出信号均表示字节选择。nSDRAS作为SDRAM <http://www.dzsc.com/icstock/613/SDRAM.html>的行地址锁存信号,nSDCAS作为SDRAM <http://www.dzsc.com/icstock/613/SDRAM.html>的列地址锁存信号,CKE作为SDRAM <http://www.dzsc.com/icstock/613/SDRAM.html>的时钟使能信号。
  nDWE    99    O    DRAM写使能信号。该引脚为DRAM组提供写操作信号。(nWBE[3:0]用于为ROM/SRAM <http://www.dzsc.com/icstock/221/SRAM.html>/FLASH <http://www.dzsc.com/stock-ic/FLASH.html>存储器组提供写操作信号。)
  nECS[3:0]     70,69,
  68,67    O    外部I/O片选信号。可以有4个外部I/O组映射到存储空间,每一个外部I/O组的地址范围最大为16KB。nECS提供每一个外部I/O组的片选信号。
  nEWAIT    71    I    外部等待信号。该信号用于在访问外部I/O设备时,由外设插入等待周期。
  nRCS[5:0]    88-84,75    O    ROM/SRAM <http://www.dzsc.com/icstock/221/SRAM.html>/FLASH <http://www.dzsc.com/stock-ic/FLASH.html>片选信号。S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>可访问多达6个的外部ROM/SRAM <http://www.dzsc.com/icstock/221/SRAM.html>/FLASH <http://www.dzsc.com/stock-ic/FLASH.html>组。
  B0SIZE[1:0]    74,73    I    ROM/SRAM <http://www.dzsc.com/icstock/221/SRAM.html>/FLASH <http://www.dzsc.com/stock-ic/FLASH.html>存储器组0的数据总线宽度设定。ROM/SRAM/FLASH <http://www.dzsc.com/stock-ic/FLASH.html>存储器组0常用于程序的启动。‘01’=字节(8位);‘10’=半字(16位);‘11’=字(32位);‘00’=保留
  nOE    72    O    输出使能。当对存储器进行访问的时候,该信号控制存储器的输出使能。
  nWBE[3:0]/
  DQM[3:0]    107,
  102-100    O    写字节使能。当对存储器进行写操作时,该信号控制存储器(DRAM除外)的写使能。对于DRAM存储器组,由nCAS[3:0]和nDWE控制写操作。DQM用于SDRAM <http://www.dzsc.com/icstock/613/SDRAM.html>数据输入/输出的屏蔽信号。
  ExtMREQ    108    I    外部总线控制器请求信号。外部总线控制器通过该引脚请求控制外部总线,当该信号有效时,S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>将外部总线置为高阻状态,以便外部总线控制器取得对外部总线的控制。当ExtMACK信号为的电平时,S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>重新取得对外部总线的控制权。
  ExtMACK    109    O    外部总线应答信号。
  MDC    50    O    管理数据时钟。该引脚产生MDIO数据输入输出时所需的时钟信号。
  MDIO    48    I/O    管理数据输入/输出。当执行一个读数据的命令时,该引脚输入由物理层产生的数据,当执行一个写数据的命令时,由该引脚输出数据到物理层(PHY)。
  LITTLE    49    I    小端模式选择引脚。当该引脚为高电平时,S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>工作在小端模式,当该引脚为低电平时,工作在大端模式。该引脚在片内已下拉,因此,S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>缺省工作在大端模式。
  COL/COL_10M    38    I    冲突检测/10M冲突检测。该引脚显示是否检测到冲突。
  TX_CLK/
  TXCLK_10M    46    I    发送时钟/10M发送时钟。S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>在TX_CLK的上升沿驱动TXD[3:0]和TX_EN,当工作在MII模式时,PHY在TX_CLK的上升沿采样TXD[3:0]和TX_EN。在发送数据时,TXCLK_10M由10M的PHY产生。
  TXD[3:0]
  LOOP_10M
  TXD_10M    44,43,
  40,39    O    发送数据/10M发送数据/10M回环测试。TXD[3:0]为发送数据引脚,TXD_10M为10M的PHY的发送数据引脚,LOOP_10M由控制寄存器的回环测试位驱动。
  TX_EN/
  TXEN_10M    47    O    发送使能/10M发送使能。
  TX_ERR/
  PCOMP_10M    45    O    发送错误/10M包压缩使能。
  CRS/CRS_10M    28    I    载波侦听/10M载波侦听。
  RX_CLK/
  RXCLK_10M    37    I    接收时钟/10M接收时钟。RX_CLK为连续的时钟信号,当其频率为25MHZ <http://www.dzsc.com/icstock/240/25MHZ.html>时,数据传输速率为100M <http://www.dzsc.com/stock-ic/100M.html>,当其频率为2.5MHz时,数据传输速率为10M。在接收数据时,RXCLK_10M由10M的PHY产生。
  RXD[3:0]
  RXD_10M    35,34,
  33,30    I    接收数据/10M接收数据。
  RX_DV/
  LINK10M    29    I     接收数据有效/10M连接状态。
  RX_ERR    36    I     接收错误。
  TXDA    9    O    HDLC Ch-A发送数据。
  RXDA    7    I     HDLC Ch-A接收数据。
  nDTRA    6    O     HDLC Ch-A终端准备就绪。nDTRA引脚指示数据终端设备准备发送或接收。
  nRTSA    8    O    HDLC Ch-A传送请求。
  nCTSA     10    I    HDLC Ch-A传送清除。
  nDCDA    13  &nb
  5.2.4  S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>的系统管理器(SYSTEM <http://www.dzsc.com/stock-ic/SYSTEM.html> Manager)
  概述
  S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html> 微处理器的系统管理器(SYSTEM <http://www.dzsc.com/stock-ic/SYSTEM.html> Manager)在整个系统工作中起至关重要作用,只有清楚的了解系统管理器在系统中的作用及工作原理,才能进行程序设计和系统开发,但同时,相对于8位或16位微处理器而言,S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>系统管理器的工作原理又是比较复杂的,因此需要读者认真细致的阅读该部分内容,并通过编程实践加以掌握。
  S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html> 微处理器的系统管理器具有以下功能:
  -    基于固定的优先级,仲裁来自几个主功能模块的系统总线访问请求。
  -    为访问外部存储器提供必需的存储器控制信号。例如DMA控制器或CPU要访问DRAM <http://www.dzsc.com/stock-ic/DRAM.html>组的某地址,则系统管理器的DRAM <http://www.dzsc.com/stock-ic/DRAM.html>控制器就会产生必需的normal/EDO 或SDRAM <http://www.dzsc.com/stock-ic/DRAM.html>访问信号。可由SYSCFG[31]设定访问normal/EDO或SDRAM <http://www.dzsc.com/stock-ic/DRAM.html>的信号。
  -    为S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>和ROM/SRAM,以及外部I/O组之间的总线通信提供必需的信号。
  -    为外部存储器的数据总线和内部数据总线之间的数据流协调总线宽度的差别。
  -    对外部存储器和I/O设备,S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>同时支持小端模式和大端模式的访问方式。
  通过产生外部总线请求信号,外设可访问S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>的外部总线。另外,S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>可通过插入等待周期(WAIT信号)访问低速外设。WAIT信号由外设产生,可延长CPU的存储器访问周期。
  系统管理器寄存器(SYSTEM <http://www.dzsc.com/stock-ic/SYSTEM.html> Manager Registers)
  系统管理器使用一组专用的特殊功能寄存器来控制外部存储器的读/写操作,通过对该组特殊功能寄存器编程,可以设定:
  -    存储器的类型
  -    外部数据总线宽度及访问周期
  -    定时的控制信号(例如RAS和CAS)
  -    存储器组的定位
  -    存储器组的大小
  在标准系统配置中访问外设必需的控制信号、地址信号和数据信号,系统管理器通过设置特殊功能寄存器的值来控制其产生和处理。特殊功能寄存器也被用于控制对ROM/SRAM/Flash组的访问,同时还能控制对多达四个DRAM <http://www.dzsc.com/stock-ic/DRAM.html> 组和四个外部I/O组以及一个特殊功能寄存器映射区域的访问。
  每个存储器组在组内通过基指针(Base Pointer)寻址,其寻址范围是64KB <http://www.dzsc.com/icstock/721/64KB.html>(16位),而基指针本身为10位。因此S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>的最大可寻址范围是226=64MB <http://www.dzsc.com/stock-ic/64MB.html>(或16M字)。
  在进行系统存储器映射时,注意两个相连的存储器组的地址空间决不能重叠。图5.2.4 为S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>系统存储器映射。
  图5.2.4  S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>系统存储器映射
  系统存储器映射(SYSTEM <http://www.dzsc.com/stock-ic/SYSTEM.html> MEMORY <http://www.dzsc.com/icstock/933/MEMORY.html> Map)
  关于S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>系统存储器映射,以下是几个应当注意的重点:
  -    S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>采用统一编址的方式,将系统的片外存储器、片内存储器、特殊功能寄存器和外部的I/O设备,都映射到64MB <http://www.dzsc.com/stock-ic/64MB.html>的 地址空间,同时,为便于管理,又将地址空间分为如图5.2.4所示的若干个存储器组,可以通过配置包含基指针(Base Pointer)和尾指针(End Pointer)的特殊功能寄存器,设定每个存储器组的大小和位置。用户可利用基指针和尾指针设置连续的存储器映射。具体操作如下:即把某个存储器组的基 指针的地址设置为前一个存储器组的尾指针的地址。请注意在设定存储器组的控制寄存器时,每两个相连的存储器组的地址空间决不能重叠,即使这些组被禁用。
  -    四 个外部I/O组被定义在一个连续的地址空间中。只需要将基指针分配给外部I/O组0,外部I/O组1的起始地址就等于外部I/O组0的起始地 址+16KB,同理,外部I/O组2的起始地址就等于外部I/O组0的起始地址+32KB,外部I/O组3的起始地址就等于外部I/O组0的起始地 址+48KB。因此,四个外部组的总的连续的可寻址范围被定义在外部I/O组0的起始地址+64KB <http://www.dzsc.com/icstock/721/64KB.html>的地址空间。在整个可寻址的地址空间中,外部I/O组的起始地址并没有被固定。通过设定组的基指针,可以设定一个具体的组起始地址,但总的地址空间是连续的64KB <http://www.dzsc.com/icstock/721/64KB.html>。
  -    每个组的起始物理地址为“基指针左移16位”, 每组末尾的物理地址为“尾指针左移16位 - 1”。
  在 上电或系统复位后,所有组的地址指针寄存器都被初始化到其缺省值。这时,所有的组指针(ROM/SRAM/Flash组0和特殊功能寄存器组除外)都被清 零。这意味着:除ROM/SRAM/Flash组0和特殊功能寄存器组以外,所有其它组在系统启动时都是未被定义的。这一点很重要,用户在进行程序设计 时,一般总是要首先通过配置相应寄存器,定义系统的存储空间。
  ROM/SRAM/Flash组0的尾指针和基指针的复位值分别为0x200和0x0。这意味着系统复位后将自动定义ROM/SRAM/Flash组0的地址空间为32MB <http://www.dzsc.com/stock-ic/32MB.html>, 实际地址范围为0x0000,0000~0x0200,0000-1。ROM/SRAM/Flash组0的这种初始化定义使得系统在上电或复位后,将系统 的控制权交给了由用户编写的启动代码,当然这些启动代码应存放在外部ROM中的,并映射到ROM/SRAM/Flash组0。当起动代码执行时,它执行各 种系统初始化任务,并根据应用系统的外部存储器和设备的实际情况来重新配置系统的存储器映射。
  特殊功能寄存器组的基址针在系统复位时被初始化为0x3FF0000,一般不再改动。
  图5.2.5是在系统启动或复位时的系统存储器映射。
  图5.2.5   系统复位时的存储器映射
  表5-2-4为系统管理器对应的寄存器,系统的存储器映射可通过对这些寄存器的配置来完成。
  表5-2-4 系统管理器对应的寄存器
  寄存器    偏移量    操作    描    述    复位值
  SYSCFG    0x0000    读/写    系统配置寄存器    0x37FFFF91
  CLKCON    0x3000    读/写    时钟控制寄存器    0x00000000
  EXTACON0    0x3008    读/写    外部I/O时序寄存器1    0x00000000
  EXTACON1    0x300C    读/写    外部I/O时序寄存器2    0x00000000
  EXTDBWTH    0x3010    读/写    分组数据总线的宽度设置寄存器    0x00000000
  ROMCON0    0x3014    读/写    ROM/ARAM/FLASH组0控制寄存器    0x20000060
  ROMCON1    0x3018    读/写    ROM/ARAM/FLASH组1控制寄存器    0x00000060
  ROMCON2    0x301C    读/写    ROM/ARAM/FLASH组2控制寄存器    0x00000060
  ROMCON3    0x3020    读/写    ROM/ARAM/FLASH组3控制寄存器    0x00000060
  ROMCON4    0x3024    读/写    ROM/ARAM/FLASH组4控制寄存器    0x00000060
  ROMCON5    0x3028    读/写    ROM/ARAM/FLASH组5控制寄存器    0x00000060
  DRAM <http://www.dzsc.com/stock-ic/DRAM.html>CON0    0x302C    读/写    DRAM <http://www.dzsc.com/stock-ic/DRAM.html>组0控制寄存器    0x00000000
  DRAM <http://www.dzsc.com/stock-ic/DRAM.html>CON1    0x3030    读/写    DRAM <http://www.dzsc.com/stock-ic/DRAM.html>组1控制寄存器    0x00000000
  DRAM <http://www.dzsc.com/stock-ic/DRAM.html>CON2    0x3034    读/写    DRAM <http://www.dzsc.com/stock-ic/DRAM.html>组2控制寄存器    0x00000000
  DRAM <http://www.dzsc.com/stock-ic/DRAM.html>CON3    0x3038    读/写    DRAM <http://www.dzsc.com/stock-ic/DRAM.html>组3控制寄存器    0x00000000
  REFEXTCON    0x303C    读/写    刷新与外部I/O控制寄存器    0x000083FD
  根据外部存储器的宽度决定外部地址译码方法(External Address Translation Method Depends on the Width of External MEMORY <http://www.dzsc.com/icstock/933/MEMORY.html>)
  与某些ARM芯片不同,S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>应 用系统的地址总线的连接方式相对简单。由于ARM7TDMI采用32位地址总线,所有的地址都可以看作字节地址,地址总线提供4GB的线性寻址空间,当发 出字访问信号时,存储系统忽略低2位A[1:0],当发出半字访问信号时,存储系统忽略低位A[0],基于以上原因,某些ARM系统在与存储器接口时,地 址总线的连接需要错开,而S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>则通过一个片内的地址总线生成部件,隐藏该过程,用户在设计系统时,只需将S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>的地址总线与存储器的地址总线一一对应连接即可(即S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>的A[0]与外部存储器的A[0]对齐)。表5-2-5和图5.2.6说明了该过程。
  表5-2-5  地址总线生成
  数据总线宽度    外部地址引脚,ADDR[21:0]    可访问的存储空间
  8位    A21-A0(内部)    4M字节
  16位    A21-A1(内部)    4M半字
  32位   &
  5.3      系统的硬件选型与单元电路设计
  从这一节开始,将详细描述系统的硬件选型与设计,希望通过对这些章节的阅读,能使读者具有初步设计特定系统的能力。
  尽管硬件选型与单元电路设计部分的内容是基于S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>的系统,但由于ARM体系结构的一致性和常见外围电路的通用性,只要读者能真正理解本部分的设计方法,从而设计出基于其他ARM微处理器的系统,应该也是比较容易的。
  需要说明,以下的应用电路可能不是最佳的,但经验证是可以正常工作的。
  5.3.1    S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>芯片及引脚分析
  S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>共有208只引脚,采用QFP封装,这对于那些常使用8位/16位DIP封装微控制器的读者来说,可能会觉得有点复杂,然而,尽管S3C4510B引脚较多,但根据各自的功能,分布很有规律。
  首 先,电源和接地引脚有近50根,再除去地址总线、数据总线和通用I/O口,以及其他的专用模块如HDLC、UART、IIC、MAC等的接口,真正需要仔 细研究的引脚数就不是很多了,但这些引脚主要是控制信号,需要认真对待,在此先进行简单的分析,其后的单元电路设计里,会有更再详细的说明。
  在硬件系统的设计中,应当注意芯片引脚的类型,S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>(也包括其他的微处理器)的引脚主要分为三类,即:输入(I)、输出(O)、输入/输出(I/O)。
  输出类型的引脚主要用于S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>对外设的控制或通信,由S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>主动发出,这些引脚的连接不会对S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>自身的运行有太大的影响。
  输入/输出类型的引脚主要是S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>与外设的双向数据传输通道。
  而某些输入类型的引脚,其电平信号的设置是S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>本身正常工作的前提,在系统设计时必须小心处理。
  S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>的主要控制信号如下:
  LITTLE(Pin49):大、小端模式选择引脚。高电平 = 小端模式;低电平 = 大端模式;该引脚在片内下拉,系统默认为大端模式,但在实际系统中一般使用小端模式,更符合我们的使用习惯,因此该引脚可上拉或接电源。
  FILTER <http://www.dzsc.com/stock-ic/FILTER.html>(Pin55):如果使用PLL倍频电路,应在该引脚和地之间接820pF的陶瓷电容。在实际系统中,一般应使用PLL电路,因此,该电容应连接。
  TCK、TMS、TDI、TDO、nTRST(Pin58~Pin62):JTAG接口引脚。根据IEEE标准,TCK应下拉,TMS、TDI和nTRST应上拉。S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>已按此标准在片内连接,只需要与JTAG插座直接相连即可,但某些ARM芯片并未做相应的处理,在设计电路时应注意。
  TMODE(Pin63):测试模式。高电平 = 芯片测试模式;低电平 = 正常工作模式;用户一般不作芯片测试,该引脚下拉或接地,使芯片处于正常工作模式。
  nEWAIT(Pin71):外部等待请求信号。该引脚应上拉。
  B0SIZE[1:0](Pin74,Pin73):BANK0数据宽度选择。’01’ = 8位;’10’ = 16位;’11’ = 32位;’00’ = 系统保留。
  CLKOEN(Pin76):时钟输出允许/禁止。高电平 = 允许;低电平 = 禁止。一些外围器件(如SDRAM <http://www.dzsc.com/icstock/613/SDRAM.html>)需要CPU的时钟输出作为自身的时钟源,该引脚一般接高电平,使时钟输出为允许状态。
  XCLK(Pin80):系统时钟源。接有源晶振的输出。
  nRESET(Pin82):系统复位引脚。低电平复位,当系统正常工作时,该引脚应处于高电平状态。
  CLKSEL(Pin83):时钟选择。高电平 = XCLK直接作为系统的工作时钟;低电平 = XCLK经过PLL电路倍频后作为系统的工作时钟。
  ExtMREQ(Pin108):外部主机总线请求信号。该引脚应下拉。
  S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>的其余引脚为电源线、接地线、数据总线、地址总线以及其他功能模块地输入/输出线,对CPU自身地运行地影响相对较小,其连接方式也比较简单,在此不作详述。
  5.3.2    电源电路
  在该系统中,需要使用5V和3.3V <http://www.dzsc.com/icstock/508/3.3V.html>的直流稳压电源,其中,S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>及部分外围器件需3.3V <http://www.dzsc.com/icstock/508/3.3V.html>电源,另外部分器件需5V电源,为简化系统电源电路的设计,要求整个系统的输入电压为高质量的5V的直流稳压电源。系统电源电路如下图所示:
  图5.3.1     系统的电源电路
  有很多DC-DC转换器可完成5V到3.3V <http://www.dzsc.com/icstock/508/3.3V.html>的转换,在此选用LINEAR <http://www.dzsc.com/icstock/385/LINEAR.html> TECHNOLOGY <http://www.dzsc.com/stock-ic/TECHNOLOGY.html>的LT108X系列。常见的型号和对应的电流输出如下:
  LT1083 <http://www.dzsc.com/icstock/403/LT1083.html>         7.5A
  LT1084 <http://www.dzsc.com/stock-ic/LT1084.html>         5A
  LT1085 <http://www.dzsc.com/icstock/403/LT1085.html>         3A
  LT1086 <http://www.dzsc.com/icstock/403/LT1086.html>         1.5A
  设计者可根据系统的实际功耗,选择不同的器件。
  5.3.3    晶振电路与复位电路
  晶振电路用于向CPU及其他电路提供工作时钟。在该系统中,S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>使用有源晶振。不同于常用的无源晶振,有源晶振的接法略有不同。常用的有源晶振的接法如下图所示:
  图5.3.2  系统的晶振电路
  根据S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>的最高工作频率以及PLL电路的工作方式,选择10MHZ <http://www.dzsc.com/icstock/609/10MHZ.html>的有源晶振,10MHZ <http://www.dzsc.com/icstock/609/10MHZ.html>的晶振频率经过S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>片内的PLL电路倍频后,最高可以达到50MHZ <http://www.dzsc.com/icstock/619/50MHZ.html>。片内的PLL电路兼有频率放大和信号提纯的功能,因此,系统可以以较低的外部时钟信号获得较高的工作频率,以降低因高速开关时钟所造成的高频噪声。
  有源晶振的1脚接5V电源,2脚悬空,3脚接地,4脚为晶振的输出,可通过一个小电阻(此处为22欧姆)接S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>的XCLK引脚。
  在系统中,复位电路主要完成系统的上电复位和系统在运行时用户的按键复位功能。复位电路可由简单的RC电路构成,也可使用其他的相对较复杂,但功能更完善的电路。
  本系统采用较简单的RC复位电路,经使用证明,其复位逻辑是可靠的。复位电路如图5.3.3所示:
  图5.3.3  系统的复位电路
  该复位电路的工作原理如下:在系统上电时,通过电阻R1向电容C1充电,当C1两端的电压未达到高电平的门限电压时,Reset端输出为低电平,系统处于复位状态;当C1两端的电压达到高电平的门限电压时,Reset端输出为高电平,系统进入正常工作状态。
  当用户按下按钮S1时,C1两端的电荷被泻放掉,Reset端输出为低电平,系统进入复位状态,再重复以上的充电过程,系统进入正常工作状态。
  两级非门电路用于按钮去抖动和波形整形;nReset端的输出状态与Reset端相反,以用于高电平复位的器件;通过调整R1和C1的参数,可调整复位状态的时间。
  5.3.4    FLASH <http://www.dzsc.com/stock-ic/FLASH.html>存储器接口电路
  FLASH <http://www.dzsc.com/stock-ic/FLASH.html>存 储器是一种可在系统(In-System)进行电擦写,掉电后信息不丢失的存储器。它具有低功耗、大容量、擦写速度快、可整片或分扇区在系统编程(烧 写)、擦除等特点,并且可由内部嵌入的算法完成对芯片的操作,因而在各种嵌入式系统中得到了广泛的应用。作为一种非易失性存储器,FLASH <http://www.dzsc.com/stock-ic/FLASH.html>在系统中通常用于存放程序代码、常量表以及一些在系统掉电后需要保存的用户数据等。常用的FLASH <http://www.dzsc.com/stock-ic/FLASH.html>为8位或16位的数据宽度,编程电压为单3.3V <http://www.dzsc.com/icstock/508/3.3V.html>。主要的生产厂商为ATMEL <http://www.dzsc.com/icstock/151/ATMEL.html>、AMD、HYUNDAI <http://www.dzsc.com/stock-ic/HYUNDAI.html>等,他们生产的同型器件一般具有相同的电气特性和封装形式,可通用。
  以该系统中使用的FLASH <http://www.dzsc.com/stock-ic/FLASH.html>存储器HY29LV160 <http://www.dzsc.com/icstock/123/HY29LV160.html>为例,简要描述一下FLASH <http://www.dzsc.com/stock-ic/FLASH.html>存储器的基本特性:
  图5.3.4  HY29LV160 <http://www.dzsc.com/icstock/123/HY29LV160.html>的逻辑框图
  HY29LV160 <http://www.dzsc.com/icstock/123/HY29LV160.html>的单片存储容量为16M位(2M字节),工作电压为2.7V <http://www.dzsc.com/icstock/189/2.7V.html>~3.6V <http://www.dzsc.com/stock-ic/3.6V.html>,采用48脚TSOP封装或48脚FBGA封装,16位数据宽度,可以以8位(字节模式)或16位(字模式)数据宽度的方式工作。
  HY29LV160 <http://www.dzsc.com/icstock/123/HY29LV160.html>仅需单3V电压即可完成在系统的编程与擦除操作,通过对其内部的命令寄存器写入标准的命令序列,可对FLASH <http://www.dzsc.com/stock-ic/FLASH.html>进行编程(烧写)、整片擦除、按扇区擦除以及其他操作。
  HY29LV160 <http://www.dzsc.com/icstock/123/HY29LV160.html>的逻辑框图、引脚分布及信号描述分别如图5.3.4、图5.3.5和表5-3-1所示:
  图5.3.5  HY29LV160 <http://www.dzsc.com/icstock/123/HY29LV160.html>引脚分布(TSOP48 <http://www.dzsc.com/stock-ic/TSOP48.html>封装)
  表5-3-1 HY29LV160 <http://www.dzsc.com/icstock/123/HY29LV160.html>的引脚信号描述
  引 脚    类型    描       述
  A[19:0]    I    地址总线。在字节模式下,DQ[15]/A[-1]用作21位字节地址的最低位。
  DQ[15]/A[-1]
  DQ[14:0]    I/O
  三态    数据总线。在读写操作时提供8位或16位的数据宽度。在字节模式下,DQ[15]/A[-1]用作21位字节地址的最低位,而DQ[14:8]处于高阻状态。
  BYTE#    I    模式选择。低电平选择字节模式,高电平选择字模式
  CE#    I    片选信号,低电平有效。在对HY29LV160 <http://www.dzsc.com/icstock/123/HY29LV160.html>进行读写操作时,该引脚必须为低电平,当为高电平时,芯片处于高阻旁路状态
  OE#    I    输出使能,低电平有效。在读操作时有效,写操作时无效。
  WE#    I    写使能,低电平有效。在对HY29LV160 <http://www.dzsc.com/icstock/123/HY29LV160.html>进行编程和擦除操作时,控制相应的写命令。
  RESET#    I    硬件复位,低电平有效。对HY29LV160 <http://www.dzsc.com/icstock/123/HY29LV160.html>进行硬件复位。当复位时,HY29LV160 <http://www.dzsc.com/icstock/123/HY29LV160.html>立即终止正在进行的操作。
  RY/BY#    O    就绪/忙 状态指示。用于指示写或擦除操作是否完成。当HY29LV160 <http://www.dzsc.com/icstock/123/HY29LV160.html>正在进行编程或擦除操作时,该引脚位低电平,操作完成时为高电平,此时可读取内部的数据。
  VCC    --    3.3V <http://www.dzsc.com/icstock/508/3.3V.html>电源
  VSS    --    接地
  以上为一款常见的FLASH <http://www.dzsc.com/stock-ic/FLASH.html>存储器HY29LV160 <http://www.dzsc.com/icstock/123/HY29LV160.html>的简介,更具体的内容可参考HY29LV160 <http://www.dzsc.com/icstock/123/HY29LV160.html>的用户手册。其他类型的
  5.4  硬件系统的调试
  通过5.3节对S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>应用系统设计方法的阅读,具有一定系统开发经验的读者就可以设计开发自己的特定应用系统,上节所介绍的内容实际上可理解为一个基于S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>的最小系统,读者可根据自己的实际需要做适当的增减。
  当 系统设计制作完成时,必须经过仔细的调试,才能保证系统按照设计意图正常工作。尽管系统的调试与个人对电路工作原理的理解和实际的电路调试经验有很大的关 系,但一定的调试方法也是必不可少的。掌握正确的调试方法可使调试工作变得容易,大大缩短系统的开发时间,反之,可能会使整个系统的开发前功尽弃,以失败 告终。
  本节以单元电路为单位,并结合笔者自身在系统调试时所遇到的一些具有代表性的问题,循序渐进的介绍整个系统的调试过程。在此,笔者建议:当 用户的印制电路板制作完毕后,不要急于焊接元器件,请首先对照原理图仔细检查印制电路板的连线,确保无误后方可焊接。同时,尽可能的以各单元电路为单位, 一个个焊接调试,以便在调试过程中遇到困难时缩小故障范围,在系统上电后,应先检查电路工作有无异常,芯片在工作时有一定的发热是正常的,但如果有芯片特 别发烫,则一定有故障存在,需断电检查确认无误后方可继续通电调试。
  调试工具需要示波器、万用表等,同时需要ARM调试开发软件ADS或SDT及相应的仿真器,本系统在调试时使用ADS1.2及由北京微芯力科技有限公司开发的ARM JTAG仿真器。关于ADS的使用方法在以后的章节有详细的叙述。
  5.4.1    电源、晶振及复位电路
  电源电路、晶振电路和复位电路相对比较简单,按图5.3.1、图5.3.2和图5.3.3连接后应该就可以正常工作,此时电源电路的输出因为DC 3.3V <http://www.dzsc.com/icstock/508/3.3V.html>。
  用示波器观测,有源晶振的输出应为10MHZ <http://www.dzsc.com/icstock/609/10MHZ.html>;
  复位电路的RESET端在未按按钮时输出应为高电平(3.3V),按下按钮后变为低电平,按钮松开后应恢复到高电平。
  电源电路、晶振电路和复位电路是整个系统正常工作的基础,应首先保证他们的正常工作。
  5.4.2    S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>及JTAG接口电路
  在保证电源电路、晶振电路和复位电路正常工作的前提下,可通过JTAG接口调试S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>,在系统上电前,首先应检测JTAG接口的TMS、TCK、TDI、TDO信号是否已与S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>的对应引脚相连,其次应检测S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>的nEWAIT引脚(Pin71)是否已上拉,ExtMREQ引脚(Pin108)是否已下拉,对这两只引脚的处理应注意,作者遇到多起S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>不能正常工作或无法与JTAG接口通信,均与没有正确处理这两只引脚有关。
  给系统上电后,可通过示波器查看S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>对应引脚的输出波形,判断是否已正常工作,若S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>已正常工作,在使能片内PLL电路的情况下,SDCLK/MCLKO引脚(Pin77)应输出频率为50MHZ <http://www.dzsc.com/icstock/619/50MHZ.html>的波形,同时,MDC引脚(Pin50)和其他一些引脚也应有波形输出。
  在保证S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>已正常工作的情况下,可使用ADS或SDT通过JTAG接口对片内的部件进行访问和控制。
  在此,首先通过对片内控制通用I/O口的特殊功能寄存器的操作,来点亮连接在P3~P0口上的4只LED,用以验证ADS或SDT调试环境是否已正确设置,以及与JTAG接口的连接是否正常。
  ADS和SDT均为ARM公司为方便用户在ARM芯片上进行应用开发而推出的一整套集成开发工具,其中,ADS为SDT的升级版本。该系统的调试以ADS为例,同时也适合于SDT开发环境。图5.4.1为调试系统的硬件连接。
  图5.4.1  调试系统的硬件连接
  按图5.4.1连接好硬件后,打开AXD Debugger,建立与目标板(待调试的系统板)的连接,AXD Debugger有软件仿真方式和带目标系统的调试方式,此时应工作在带目标系统的调试方式。
  选择菜单SYSTEM <http://www.dzsc.com/stock-ic/SYSTEM.html> Views→Command LINE <http://www.dzsc.com/stock-ic/LINE.html> Interface功能,该选项为AXD Debugger的一个命令行窗口,可在该窗口内输入各种调试命令,使用非常方便。在命令行窗口输入:
  >setmem  0x3FF5000, 0xFFFF, 32
  >setmem  0x3FF5008, 0xFFFF, 32
  setmem命令用于对特定的地址设置特定的值,待设定的值可以是8位、16位或32位,在此,对通用I/O口的模式寄存器和数据寄存器设置相应的值,点亮LED。
  S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>在 复位后,特殊功能寄存器的基地址为0x3FF0000, 由表5-2-3可知,I/O口的模式寄存器偏移地址为0x5000,因此,I/O口的模式寄存器的物理地址为0x3FF5000,设定该寄存器的值为 0xFFFF,将I/O口置为输出方式。I/O口的数据寄存器的物理地址为0x3FF5008,设定该寄存器的值为0xFFFF,将I/O口的输出置为高 电平。
  在执行完以上两条命令后,连接在通用I/O口的4只LED应被点亮,表示调试系统的软、硬件连接完好,可进行下一步的调试工作,否则,应重新检查调试系统。
  用户若使用SDT作为调试工具,操作方法类似。按图5.4.1连接好硬件后,打开ARM Debugger for Windows,建立与目标板(待调试的系统板)的连接,选择菜单View→Command功能,即可显示命令行窗口,在命令行窗口输入:
  Debug:let 0x3FF5000 = 0xFFFF
  Debug:let 0x3FF5008 = 0xFFFF
  执行完以上两条命令后,连接在通用I/O口的4只LED应被点亮。
  关于通用I/O口更具体的工作原理和使用方法,可参考S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>用户手册。
  用户系统若能正常完成上述操作并成功点亮连接在P3~P0口上的LED显示器,则表明S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>已在正常工作,且调试环境也已正确建立,以后的调试工作就相对简单。笔者曾遇到多个用户系统因为不能完成这步工作,使开发者失去信心而最终放弃。
  5.4.3  SDRAM <http://www.dzsc.com/icstock/613/SDRAM.html>接口电路的调试
  在系统的两类存储器中,SDRAM <http://www.dzsc.com/icstock/613/SDRAM.html>相对于FLASH <http://www.dzsc.com/stock-ic/FLASH.html>存储器控制信号较多,似乎调试应该困难一些,但由于SDRAM的所有刷新及控制信号均由S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>片内的专门部件控制,无需用户干预,在S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>正常工作的前提下,只要连线无误,SDRAM <http://www.dzsc.com/icstock/613/SDRAM.html>就应能正常工作,反之,FLASH <http://www.dzsc.com/stock-ic/FLASH.html>存储器的编程、擦除操作均需要用户编程控制,且程序还应在SDRAM <http://www.dzsc.com/icstock/613/SDRAM.html>中运行,因此,应先调试好SDRAM <http://www.dzsc.com/icstock/613/SDRAM.html>存储器系统,再进行FLASH <http://www.dzsc.com/stock-ic/FLASH.html>存储器系统的调试。
  在进行存储器系统调试之前,用户必须深入了解S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>系统管理器关于存储器映射的工作原理。
  基于S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>系统的最大可寻址空间为64MB <http://www.dzsc.com/stock-ic/64MB.html>,采用统一编址的方式,将系统的SDRAM <http://www.dzsc.com/icstock/613/SDRAM.html>、SRAM <http://www.dzsc.com/icstock/221/SRAM.html>、ROM、FLASH <http://www.dzsc.com/stock-ic/FLASH.html>、外部I/O以及片内的特殊功能寄存器和8K一体化SRAM <http://www.dzsc.com/icstock/221/SRAM.html>均映射到该地址空间。为便于使用与管理,S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>又将64MB <http://www.dzsc.com/stock-ic/64MB.html>的地址空间分为若干个组,分别由相应的特殊功能寄存器进行控制:
  -    ROM/SRAM <http://www.dzsc.com/icstock/221/SRAM.html>/FLASH <http://www.dzsc.com/stock-ic/FLASH.html>组0~ROM/SRAM <http://www.dzsc.com/icstock/221/SRAM.html>/FLASH <http://www.dzsc.com/stock-ic/FLASH.html>组5,用于配置ROM、SRAM <http://www.dzsc.com/icstock/221/SRAM.html>或FLASH <http://www.dzsc.com/stock-ic/FLASH.html>,分别由特殊功能寄存器ROMCON0~ROMCON5控制;
  -    DRAM/SDRAM <http://www.dzsc.com/icstock/613/SDRAM.html>组0~DRAM/SDRAM <http://www.dzsc.com/icstock/613/SDRAM.html>组3用于配置DRAM或SDRAM <http://www.dzsc.com/icstock/613/SDRAM.html>,分别由特殊功能寄存器DRAMCON0~DRAMCON3控制;
  -    外部I/O组0~外部I/O组3用于配置系统的其他外扩接口器件,由特殊功能寄存器REFEXTCON控制;
  -    特殊功能寄存器组用于配置S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>片内特殊功能寄存器的基地址以及片内的8K一体化SRAM <http://www.dzsc.com/icstock/221/SRAM.html>,由特殊功能寄存器SYSCFG控制;
  在该系统中,使用了FLASH <http://www.dzsc.com/stock-ic/FLASH.html>存储器和SDRAM <http://www.dzsc.com/icstock/613/SDRAM.html>,分别配置在ROM/SRAM <http://www.dzsc.com/icstock/221/SRAM.html>/FLASH <http://www.dzsc.com/stock-ic/FLASH.html>组0和DRAM/SDRAM <http://www.dzsc.com/icstock/613/SDRAM.html>组0,暂未使用外扩接口器件。
  参照表5-2-4和5.2.4节对应特殊功能寄存器的相关描述可知,当系统复位时,只有ROM/SRAM <http://www.dzsc.com/icstock/221/SRAM.html>/FLASH <http://www.dzsc.com/stock-ic/FLASH.html>组0被映射到地址空间为0x0000,0000~0x0200,0000的位置,特殊功能寄存器的基地址被映射到0x03FF,0000,片内8K一体化SRAM <http://www.dzsc.com/icstock/221/SRAM.html>的起始地址被映射到0x03FE,0000,它们是可访问的,而其他的存储器组均未被映射,是不可访问的。
  因此,要调试SDRAM <http://www.dzsc.com/icstock/613/SDRAM.html>存储器系统,首先应配置相关的特殊功能寄存器,使系统中的SDRAM <http://www.dzsc.com/icstock/613/SDRAM.html>能被访问。表5-4-1为针对该系统的与系统管理器相关的特殊功能寄存器的配置,以下详细说明该系统所使用的相关特殊功能寄存器的配置方法。
  表5-4-1  系统管理器相关特殊功能寄存器的配置
  寄存器    偏移量    配置值
  SYSCFG    0x0000    0xE7FF,FF82
  EXTDBWTH    0x3010    0x0000,3000 <http://www.dzsc.com/stock-ic/3000.html>
  ROMCON0    0x3014    0x0200,0060
  DRAMCON0    0x302C    0x1401,0380
  REFEXTCON    0x303C    0xCE33,83FD
  SYSCFG = 0xE7FF,FF82;其含义为:
  为4个DRAM组选择SDRAM <http://www.dzsc.com/icstock/613/SDRAM.html>;特殊功能寄存器组的基地址为0x03FF,0000;片内SRAM <http://www.dzsc.com/icstock/221/SRAM.html>基地址为0x03FE,0000;4KB配置为SRAM <http://www.dzsc.com/icstock/221/SRAM.html>,另外4KB配置为Cache;使能Cache操作。
  EXTDBWTH = 0x0000,3000 <http://www.dzsc.com/stock-ic/3000.html>;其含义为:
  4个外部I/O组禁用;DRAM/SDRAM <http://www.dzsc.com/icstock/613/SDRAM.html>组0配置为32位数据宽度,其余的DRAM/SDRAM <http://www.dzsc.com/icstock/613/SDRAM.html>组禁用;ROM/SRAM/FLASH <http://www.dzsc.com/stock-ic/FLASH.html>组0由B0SIZE[1:0]的状态配置,其余ROM/SRAM <http://www.dzsc.com/icstock/221/SRAM.html>/FLASH <http://www.dzsc.com/stock-ic/FLASH.html>组禁用。
  ROMCON0 = 0x0200,0060;其含义为:
  该系统共有2MB的FLASH <http://www.dzsc.com/stock-ic/FLASH.html>存储器,映射到地址空间的0x0000,0000~(0x0020,0000-1)处。
  DRAMCON0 = 0x1401,0380;其含义为:
  该系统共有16MB的SDRAM <http://www.dzsc.com/icstock/613/SDRAM.html>,映射到地址空间的0x0040,0000~(0x0140,0000-1)处。
  用户也可将FLASH <http://www.dzsc.com/stock-ic/FLASH.html>存储器和SDRAM <http://www.dzsc.com/icstock/613/SDRAM.html>映射到地址空间的其他位置,但注意组与组之间的地址不要发生重叠。
  DRAMCON0 = 0xCE33,83FD;其含义为:
  配置SDRAM <http://www.dzsc.com/icstock/613/SDRAM.html>的刷新计数值,刷新时间、刷新使能等。
  系统管理器对应的其他特殊功能寄存器使用其复位值,用户也可根据自身系统的特定情况,对相关特殊功能寄存器进行配置。
  在C:\下建立文本文件memmap.txt,其内容为:
  第6章 部件工作原理与编程示例
  本章主要以S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>的几个常用功能部件为编程对象,介绍基于S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>的系统的程序设计与调试,同时简介BootLoader的基本原理和编程方法,通过对本章的阅读,可以使读者了解S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>各功能部件的工作原理及基本编程方法。
  本章的主要内容包括:
  -    嵌入式系统应用程序设计的基本方法。
  -    S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>通用I/O口的工作原理与编程示例。
  -    S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>串行通信控制器的工作原理与编程示例。
  -    S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>中断控制器的工作原理与编程示例。
  -    S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>定时器的工作原理与编程示例。
  -    S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html> DMA控制器的工作原理与编程示例。
  -    S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html> IIC总线控制器的工作原理。
  -    S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html> 以太网控制器的工作原理。
  -    FLASH <http://www.dzsc.com/stock-ic/FLASH.html>存储器的工作原理与编程示例。
  -    BootLoader简介
  6.1  嵌入式系统的程序设计方法
  一 般说来,对于一个完整的嵌入式应用系统的开发,硬件的设计与调试工作仅占整个工作量的一半,应用系统的程序设计也是嵌入式系统设计一个非常重要的方面,程 序的质量直接影响整个系统功能的实现,好的程序设计可以克服系统硬件设计的不足,提高应用系统的性能,反之,会使整个应用系统无法正常工作。
  本章从应用的角度出发,以S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>的 各个功能模块为编程对象,介绍一些实用的程序段,读者既可按自己的需要修改,也可吸收其设计思想和方法,以便设计出适合于自己特定应用系统的实用程序。同 时,由于ARM体系结构的一致性,尽管以下的应用程序段是针对特定硬件平台开发的,其编程思路同样适合于其他类型的ARM微处理器。
  不同于基于PC平台的程序开发,嵌入式系统的程序设计具有其自身的特点,程序设计的方法也会因系统或因人而异,但其程序设计还是有其共同的特点及规律的。在编写嵌入式系统应用程序时,可采取如下几个步骤:
  (1)    明确所要解决的问题:根据问题的要求,将软件分成若干个相对独立的部分,并合理设计软件的总体结构。
  (2)    合理配置系统资源:与基于8位或16位微控制器的系统相比较,基于32位微控制器的系统资源要丰富得多,但合理的资源配置可最大限度的发挥系统的硬件潜能,提高系统的性能。对于一个特定的系统来说,其系统资源,如FLASH <http://www.dzsc.com/stock-ic/FLASH.html> 、EEPROM <http://www.dzsc.com/stock-ic/EEPROM.html>、SDRAM <http://www.dzsc.com/icstock/613/SDRAM.html>、中断控制等,都是有限的,应合理配置系统资源。
  (3)    程序的设计、调试与优化:根据软件的总体结构编写程序,同时采用各种调试手段,找出程序的各种语法和逻辑错误,最后应使各功能程序模块化,缩短代码长度以节省存储空间并减少程序执行时间。
  此外,由于嵌入式系统一般都应用在环境比较恶劣的场合,易受各种干扰,从而影响到系统的可靠性,因此,应用程序的抗干扰技术也是必须考虑的,这也是嵌入式系统应用程序不同于其他应用程序的一个重要特点。
  6.2  部件工作原理与编程示例
  6.2.1  通用I/O口工作原理与编程示例
  S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>提供了18个可编程的通用I/O端口,用户可将每个端口配置为输入模式、输出模式或特殊功能模式,由片内的特殊功能寄存器IOPMOD和IOPCON控制。
  端 口0~端口7的工作模式仅由IOPMOD寄存器控制,但通过设置IOPCON寄存器,端口8~端口11可用作外部中断请求INTREQ0~INTREQ3 的输入,端口12、端口13可用作外部DMA请求XDREQ0、XDREQ1的输入,端口14、端口15可作为外部DMA请求的应答信号XDACK0、 XDACK1,端口16可作为定时器0的溢出TOUT0,端口17可作为定时器1的溢出TOUT1。
  I/O端口的功能模块如图6.2.1所示:
  图6.2.1    通用I/O口的功能模块
  控制I/O口的特殊功能寄存器一共有3个:IOPMOD、IOPCON和IOPDATA,简要描述如下:
  I/O口模式寄存器(IOPMOD):
  I/O口模式寄存器IOPMOD用于配置P17~P0。
  寄存器    偏移地址    操作    功能描述    复位值
  IOPMOD    0x5000    读/写    I/O口模式寄存器    0x0000,0000
  [0]P0口的I/O模式位
  0=输入
  1=输出
  [1]P1口的I/O模式位
  0=输入
  1=输出
  [2]P2口的I/O模式位
  0=输入
  1=输出
  [3~17]P3~P17口的I/O模式位
  0=输入
  1=输出
  I/O口控制寄存器(IOPCON):
  I/O口控制寄存器IOPCON用于配置端口P8~P17的特殊功能,当这些端口用作特殊功能(如外部中断请求、外部中断请求应答、外部DMA请求或应答、定时器溢出)时,其工作模式由IOPCON寄存器控制,而不再由IOPMOD寄存器。
  对于特殊功能输入端口,S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>提供了一个滤波器用于检测特殊功能信号的输入,如果输入信号电平宽度等于三个系统时钟周期,该信号被认为是诸如外部中断请求或外部DMA请求等特殊功能信号。
  寄存器    偏移地址    操作    功能描述    复位值
  IOPCON    0x5004    读/写    I/O口控制寄存器    0x0000,0000
  [4:0]控制端口8的外部中断请求信号0(xIRQ0)输入
  [4]端口8用作外部中断请求信号0
  0 = 禁止            1 = 使能
  [3]     0 = 低电平有效    1 = 高电平有效
  [2]     0 = 滤波器关        1 = 滤波器开
  [1:0]     00 = 电平检测    01 = 上升沿检测
  10 = 下降沿检测    11 = 上升、下降沿均检测
  [9:5]控制端口9的外部中断请求信号1(xIRQ1)输入
  使用方法同端口8。
  [14:10]控制端口10的外部中断请求信号2(xIRQ2)输入
  使用方法同端口8。
  [19:15]控制端口11的外部中断请求信号3(xIRQ3)输入
  使用方法同端口8。
  [22:20]控制端口12的外部DMA请求信号0(DRQ0)输入
  [22]端口12用作外部DMA请求信号0(nXDREQ0)
  0 = 禁止            1 = 使能
  [21]    0 = 滤波器关        1 = 滤波器开
  [20]    0 = 低电平有效    1 = 高电平有效
  [25:23]控制端口13的外部DMA请求信号1(DRQ1)输入
  [25]端口13用作外部DMA请求信号1(nXDREQ1)
  0 = 禁止            1 = 使能
  [24]    0 = 滤波器关        1 = 滤波器开
  [23]    0 = 低电平有效    1 = 高电平有效
  [27:26]控制端口14的外部DMA应答信号0(DAK0)输出
  [27]端口14用作外部DMA信号0(nXDACK0)
  0 = 禁止            1 = 使能
  [26]    0 = 低电平有效    1 = 高电平有效
  [29:28]控制端口15的外部DMA应答信号1(DAK1)输出
  [29]端口15用作外部DMA信号1(nXDACK1)
  0 = 禁止            1 = 使能
  [28]    0 = 低电平有效    1 = 高电平有效
  [30]控制端口16作为定时器0溢出信号(TOEN0)
  0 = 禁止            1 = 使能
  [31]控制端口17作为定时器1溢出信号(TOEN1)
  0 = 禁止            1 = 使能
  I/O口数据寄存器(IOPDATA):
  当配置为输入模式时,读取I/O口数据寄存器IOPDATA的每一位对应输入状态,当配置为输出模式时,写每一位对应输出状态。位[17:0]对应于18个I/O引脚P17~P0。
  寄存器    偏移地址    操作    功能描述    复位值
  IOPDATA    0x5008    读/写    I/O口数据寄存器    未定义
  [17:0]对应I/O口P17~P0的读/写值。I/O口数据寄存器的值反映对应引脚的信号电平。
  以上简述了S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>的通用I/O口的基本工作原理,更详细的内容可参考S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>的用户手册。
  作为本章的第一个例子,将比较详细的描述建立项目、编写程序的过程,同时可参考第八章关于ADS集成编译调试环境的使用方法。
  打开CodeWarrior for ARM Developer Suite(或ARM Project Manager),新建一个项目,并新建一个文件,名为Init.s,具体内容如下:
  6.2.3  中断控制器工作原理与编程示例
  中断是计算机的一种基本工作方式,几乎所有的CPU都支持中断,S3C4510B的支持多达21个中断源,中断请求可由内部功能模块和外部引脚信号产生。
  ARM7TDMI核可以识别两种类型的中断:正常中断请求(Normal Interrupt Request,IRQ)和快速中断请求(FAST <http://www.dzsc.com/icstock/272/FAST.html> Interrupt Request,FIQ),因此,S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>的所有中断都可以归类为IRQ或FIQ。S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>的中断控制器对每一个中断源都有一个中断悬挂位(Interrupt Pending Bit)。
  S3C4510B用如下四个寄存器控制中断的产生和对中断进行处理:
  -    中断优先级寄存器(Interrupt Priority Register):每一个中断源的索引号写入一个预定义的中断优先级寄存器,以获得特定的优先级。中断优先级预定义为从0~20。
  -    中断模式寄存器(Interrupt Mode Register):为每一个中断源定义中断模式,是IRQ还是FIQ。
  -    中 断悬挂寄存器(Interrupt Pending Register):指示中断请求处于悬挂状态(未处理)。如果中断悬挂位被置位,则中断悬挂状态会一直保存,直到CPU通过写‘1’到中断悬挂寄存器的 相应位清除(注意是写‘1’清除,而不是写‘0’)。当中断悬挂位被置位时,无论中断屏蔽寄存器是否为‘0’,中断服务程序都开始执行。在中断服务程序 中,必须通过向中断悬挂寄存器的相应位写‘1’来清除中断悬挂标志,以避免由于同一个中断悬挂位导致中断服务程序的反复执行。
  -    中断屏蔽寄存器(Interrupt Mask Register):如果中断屏蔽位为‘1’
  则对应的中断会被禁止,如果中断屏蔽位为‘0’,则对应的中断请求能正常响应。但如果全局中断屏蔽位(位21)为‘1’,则所有的中断都会被禁止。当有中断请求产生时,对应的中断悬挂位会被置为‘1’,在全局中断屏蔽位和对应的中断屏蔽位为‘0’时,中断请求就会被响应。
  S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>的中断源(Interrupt Sources)
  S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>可支持21个中断源,如表6-2-7所示:
  表6-2-7     S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>的中断源
  索引号    中断源
  [20]    IIC总线中断
  [19]    以太网控制器MAC接收中断
  [18]    以太网控制器MAC发送中断
  [17]    以太网控制器BDMA接收中断
  [16]    以太网控制器BDMA发送中断
  [15]    HDLC通道B接收中断
  [14]    HDLC通道B发送中断
  [13]    HDLC通道A接收中断
  [12]    HDLC通道A发送中断
  [11]    定时器1中断
  [10]    定时器0中断
  [9]    GDMA通道1中断
  [8]    GDMA通道0中断
  [7]    UART1接收与错误中断
  [6]    UART1发送中断
  [5]    UART0接收与错误中断
  [4]    UART0发送中断
  [3]    外部中断3
  [2]    外部中断2
  [1]    外部中断1
  [0]    外部中断0
  中断控制器的特殊功能寄存器(Interrupt Controller Special Registers)
  中断模式寄存器(Interrupt Mode Register)
  中断模式寄存器INTMOD通过每一位的设置决定每一种中断是按快速中断(FIQ)还是按正常中断(IRQ)响应。
  寄存器    偏移地址    操作    功能描述    复位值
  INTMOD    0x4000    读/写    中断模式寄存器    0x0000,0000
  [20:0]中断模式位
  INTMOD的21个位分别对应于表6-2-7中所描述的21个中断源,当中断模式位被置为‘1’时,ARM7TDMI核按FIQ方式处理对应的中断,否则按IRQ方式处理中断。21个中断源映射如下:
  [20]        IIC中断
  [19]        以太网控制器MAC接收中断
  [18]        以太网控制器MAC发送中断
  [17]        以太网控制器BDMA接收中断
  [16]        以太网控制器BDMA发送中断
  [15]        HDLC通道B接收中断
  [14]        HDLC通道B发送中断
  [13]        HDLC通道A接收中断
  [12]        HDLC通道A发送中断
  [11]        定时器1中断
  [10]        定时器0中断
  [9]        GDMA通道1中断
  [8]        GDMA通道0中断
  [7]        UART1接收与错误中断
  [6]        UART1发送中断
  [5]        UART0接收与错误中断
  [4]        UART0发送中断
  [3]        外部中断3
  [2]        外部中断2
  [1]        外部中断1
  [0]        外部中断0
  中断悬挂寄存器(Interrupt Pending Register)
  中断悬挂寄存器INTPND保持每一个中断源的中断悬挂位。该寄存器对应的中断悬挂位应在中断服务程序中首先清除,以避免由于同一个中断悬挂位导致中断服务程序的反复执行。
  寄存器    偏移地址    操作    功能描述    复位值
  INTPND    0x4004    读/写    中断悬挂寄存器    0x0000,0000
  [20:0]中断悬挂位
  INTPND的21个位分别对应于表6-2-7中所描述的21个中断源,当中断请求产生时,对应的中断悬挂位被置为‘1’,在中断服务程序中应通过向对应位写入‘1’的方式清除中断悬挂位。21个中断源映射如下:
  [20]        IIC中断
  [19]        以太网控制器MAC接收中断
  [18]        以太网控制器MAC发送中断
  [17]        以太网控制器BDMA接收中断
  [16]        以太网控制器BDMA发送中断
  [15]        HDLC通道B接收中断
  [14]        HDLC通道B发送中断
  [13]        HDLC通道A接收中断
  [12]        HDLC通道A发送中断
  [11]        定时器1中断
  [10]        定时器0中断
  [9]        GDMA通道1中断
  [8]        GDMA通道0中断
  [7]        UART1接收与错误中断
  [6]        UART1发送中断
  [5]        UART0接收与错误中断
  [4]        UART0发送中断
  [3]        外部中断3
  6.2.6    IIC总线控制器工作原理
  S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>片内的IIC总线控制器具有如下重要特性:
  -    仅需要两根传输线。一根为串行数据线(Serial Data LINE <http://www.dzsc.com/stock-ic/LINE.html>,SDA),另一根为串行时钟线(Serial Clock LINE <http://www.dzsc.com/stock-ic/LINE.html>,SCL)。当IIC总线处于空闲状态时,两根传输线均为高电平。
  -    连接到总线上的每一个设备都可以通过一个主控器使用唯一的地址进行软件寻址。总线主控器既可以是一个主发送器,也可以是一个主接收器。但S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>的IIC总线控制器仅支持单主控器模式。
  -     支持8位、双向,串行数据传输。
  -    连接到IIC总线的器件数目仅受到最大总线电容(400PF)的限制。
  图6.2.6为S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html> IIC总线控制器的功能模块。
  图6.2.6 S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html> IIC总线控制器的功能模块图
  功能描述(Functional DESCRIPTION <http://www.dzsc.com/stock-ic/DESCRIPTION.html>)
  S3C4510B <http://www.dzsc.com/icstock/597/S3C4510B.html>的IIC总线控制器为一个串行IIC总线主控器。可通过设置预分频寄存器(Prescaler Register,IICPSR)对串行时钟频率进行编程。串行时钟频率可由下式计算:
  MCLK/(16×(预分频寄存器的值+1)+3)
  可通过对控制状态寄存器(IICCON)的位[5:4]写入“01”发送启动码初始化串行IIC总线,然后总线控制器发送7位的从设备地址并通过移位缓冲寄存器发送读/写控制位,接收器则在主控器的SCL脉冲期间通过将SDA线从高电平下拉到低电平作为应答信号。
  写数据的操作:先设置控制状态寄存器的BF位,然后写入数据到移位缓冲寄存器。移位缓冲寄存器无论是被读还是写,BF位均会自动清零。若要进行连续的读/写操作,必须设置控制状态寄存器的ACK位。
  读数据的操作:在设置控制状态寄存器的BF位以后,可以进行读数据的操作,当读/写完最后一个字节时,可对ACK位进行复位通知发送器/接收器读数据操作的结束。
  在读/写操作完成以后,可通过设置IICCON[5:4]=“10”生成结束码。
  IIC总线概念(IIC-BUS Concepts)
  基本操作(Basic Operation):IIC总线通过两根传输线,一根串行数据线SDL,一根串行时钟线SCL,在连接到总线上的IC器件之间传递信息,每一个IC器件通过唯一的地址进行识别,根据其特性,可作为发送器或接收器工作。
  IIC总线是一种多主控器总线,有多个IC器件具有控制总线的能力。
  IIC总线的数据传输过程描述如下:
  第一种情况,一个主IC器件要传送数据到其他的从IC器件,可分为如下三个步骤:
  1、    主IC器件寻址从IC器件。
  2、    主IC器件发送数据到从IC器件(此时,主器件为发送器,从器件为接收器)。
  3、    主IC器件终止数据的传输。
  第二种情况,一个主IC器件要从其他的从IC器件获取数据,可分为如下三个步骤:
  1、    主IC器件寻址从IC器件。
  2、    主IC器件从从IC器件接收数据(此时,主器件为接收器,从器件为发送器)。
  3、主IC器件终止数据的传输。
  即使是在第二种情况,也由主IC器件产生时序信号并终止数据的传输。
  通 用特性(General Characteristics):SDL和SCL均为双向传输线,各通过一个上拉电阻连接到电源正端,当IIC总线空闲时,SDL和SCL传输线均为高 电平,连接在总线上的IIC接口在输出阶段通过漏极开路(Open-drain)或集电极开路(Open-collector)的方式完成线与 (Wired-AND)功能。IIC总线的数据传输速率最高可达到100Kb/S。可连接到总线上的IC器件数目仅受到总线电容的限制(400PF)。
  位传输(Bit Transfers):由于连接到IIC总线上的器件各不相同(如有CMOS <http://www.dzsc.com/stock-ic/CMOS.html>器件,NMOS器件,TTL器件等),逻辑0或逻辑1的电平会根据电源电压的高低发生变化,因此,每传输一个位就产生一个时钟脉冲。
  数据有效性(Data Validity):在时钟信号的高电平期间,SDA传输线上的电平必须稳定,只有在SCL传输线上的时钟信号为低电平时,数据线上的高低电平才允许发生变化。
  开始与停止条件(Start and Stop Conditions):开始和停止条件总是由主器件产生。在开始条件产生后,总线被认为处于忙状态,在完成数据传输产生停止条件后,总线被认为处于空闲状态。
  -    开始条件:当SCL为高电平时,SDA产生由高电平到低电平的跳变。
  -    停止条件:当SCL为高电平时,SDA产生由低电平到高电平的跳变。
  图6.2.7为开始与停止条件:
  图6.2.7 开始与停止条件
  数据传输操作(Data Transfer Operations)
  数据字节格式(Data Byte Format):每一个写到SDA传输线上的数据字节必须为8位的长度,每一次传输的字节数没有限制,每传输一个字节必须跟一个应答位ACK(如图6.2.7),传输字节时最高位在前(MSB-first)。
  如果接收器因为执行其他功能(如中断服务)而不能接收其他剩余的数据字节时,接收器就保持时钟线SCL为低电平强制发送器进入等待状态,只有当接收器准备接收其他字节并释放SCL传输线时,数据传输才会继续进行。
  应 答过程(Acknowledge Procedure):在数据的传输过程中必须带有应答信号,与应答信号相关的时钟脉冲必须由总线主控器产生。在应答时钟脉冲期间,发送器释放SDA传输 线(为高电平),但此时接收器必须下拉SDA传输线,以便在时钟脉冲的高电平期间SDA能够保持稳定的低电平。
  通常,被寻址的接收器在接收到每一个字节后必须产生一个应答信号,当从接收器不能产生应答信号时,必须释放数据线,然后由主控器产生停止条件中止数据传输。
  数据传输格式(Data Transfer Format):图6.2.8显示传输数据的格式。当产生开始条件后,首先发送7位的从器件地址,第八位为数据方向位(R/W),“0”表示发送数据(写),“1”表示请求数据(读)。
  图6.2.8 数据传输的格式
  数据传输一般总是在主控器产生停止条件后中止。但当主控器还要利用总线进行通讯时,主控器可以在不产生前一个停止条件的情况下,再产生开始条件并寻址另一个从器件,该特性可用于支持不同数据传输读/写格式的联合使用。
  IIC总线寻址(IIC-Bus Addressing):IIC总线的寻址过程为在开始条件后发送的第一个字节,该字节地址决定主控器选择哪一个从器件。通常,第一个字节总是紧跟在开始过程之后。
  还可以通过“广播”寻址方式同时寻址所有的IC器件,当使用广播寻址时,理论上所有的IC器件都应该返回应答信号,但器件也可以忽略这个这个地址。广播寻址的第二个字节决定其后的操作。
  第一个数据字节的位定义(Definition of Bits in the First Data Byte
  第一个数据字节的前7位为从器件地址,第8位为方向位,决定数据的传输方向(读/写)。
  当地址字节发出以后,总线上的每一个IC器件将该地址与自己的地址进行比较,若地址匹配,则这个IC器件就认为自身被主控器寻址为一个从发送器或从接收器。
  广播寻址(General Call Address):广播寻址方式可用于寻址连接在IIC总线上的每一个IC器件,但当某个IC器件不需要进行数据传输时,将忽略广播寻址而不作任何应答。
  如果某个IC器件需要获取数据,将发出应答信号并作为一个从接收器。
  开始字节(Start Byte):在每一次的数据传输之前都有一个开始过程,描述如下:
  -    一个开始条件,S
  -    一个开始字节,“00000001”
  -    一个应答时钟脉冲
  -    一个重复开始条件,Sr
  当 需要访问总线的主控器在发送完开始条件S后,接着发送开始字节(“00000001”),总线上其余的IC器件以较低的采样率对SDA传输线进行采样,一 直到检测到开始字节中七个零中的某一个。当检测到SDA传输线上的低电平时,IC器件就切换到较高的采样率检测重复开始条件Sr用于同步,接收器在检测到 重复开始条件Sr后复位,忽略该开始字节。
  在开始字节发送完毕之后产生一个应答时钟脉冲。
  IIC总线特殊功能寄存器(IIC Bus Special Registers)
  IIC总线控制器由三个特殊功能寄存器:一个控制状态寄存器(IICON),一个预分频寄存器(IICPS)和一个移位缓冲寄存器(IICBUF)。
  控制状态寄存器(CONTROL <http://www.dzsc.com/stock-ic/CONTROL.html> Status Register,IICON):
  寄存器    偏移地址    操作    功能描述    复位值
  IICCON    0xF000    读/写    控制状态寄存器    0x0000,0000
  IIC总线的控制状态寄存器描述如表6-2-10。
  表6-2-10  IICCON寄存器描述
  位    位名    功能描述
  [0]    缓冲标志(BF)    在发送模式下缓冲区空时,或在接收模式下缓冲区满时,BF置位。
  通过对该位写“0”可以清除缓冲区。
  IICBUF寄存器无论是被读还是写,BF位都自动清零。
  如果将该位置为“1”,IIC总线停止工作,要激活IIC总线,应将该位清零。
  [1]&nMAC功能模块
  以太网控制器MAC层的功能模块描述如表6-2-13和图6.2.10。
  表6-2-13  MAC功能模块描述
  功能模块    描     述
  媒体独立接口(MII)    MII为物理层和发送/接收模块之间的接口
  发送模块    将要发送的数据从发送缓冲区移到MII。发送模块包括CRC生成电路、奇偶校验电路、前导与后缀生成电路。发送模块同时还包含用于  处理冲突后的回退和数据帧间间隔的定时器。
  接 收模块    从MII接收数据并存入接收FIFO。接收模块完成逻辑功能:计算与校验CRC值;对从MII接收的数据进行奇偶生成和检测最大与最小数据 包长度。接收模块同时还包含一个匹配地址存储器(CAM)模块,用于存储网络目的地址,根据该目的地址决定接收或丢弃数据包。
  流控模块    辨别MAC控制包,并支持用于全双工连接的暂停操作。流控模块同时支持生成暂停控制包,并提供用于暂停控制的定时器和计数器。
  MAC控制(命令)与状态寄存器    控制可编程选项,包括禁止或使能当某条件发生时通知系统的各种信号。状态寄存器保持各种用于错误处理的状态信息,以及用于网络管理的错误计数器累加统计信息等。
  回环电路    提供独立于MII和物理层的MAC层测试。
  图6.2.10   MAC层流控功能模块
  媒体独立接口(Media Independent Interface,MII)
  发送和接收模块均通过MII进行操作,其接口特性描述如下:
  -    独立于传输媒体。
  -    支持多生产商互操作。
  -    支持到MAC层和到物理层接口设备的连接。
  -     支持10M或100M <http://www.dzsc.com/stock-ic/100M.html>的数据传输能力。
  -    数据与分隔符的传输和参考时钟同步。
  -    提供独立的4位数据宽度发送与接收通道。
  -    使用TTL电平信号,与通用数字CMOS <http://www.dzsc.com/stock-ic/CMOS.html> ASIC处理器电平兼容。
  -    支持到物理层和到站管理设备的连接。
  -    提供简单的管理接口。
  -    具有驱动有限长度屏蔽电缆的能力。
  物理层(Physical Layer Entity,PHY)
  物 理层完成发送与接收数据的编码/解码。其编码/解码(用于10BASE-T的曼切斯特编码、用于100BASE-X的4B/5B编码以及用于 100BASE-T4的8B/6T编码)方式对MII无影响。MII对原始数据进行接收时,以前导字段开始,到CRC字段结束。同时,MII对原始数据进 行发送时,也以前导字段开始,到CRC字段结束。MAC层可生成填充数据并传送到PHY。
  带缓冲的DMA接口(Buffered DMA Interface,BDI)
  带 缓冲的DMA接口支持通过系统总线的读/写操作,带有两个8位的总线数据收发器,同时可选择奇偶校验功能。数据收发器通过系统接口进行初始化。MAC层控 制器通过响应BDI的准备好信号从BDI接收数据并发送出去,或将接收到的数据发送给BDI,由帧结束信号标识各数据包的边界。
  MAC发送模块(MAC Transmit Block)
  MAC发送模块负责数据发送,与802.3标准的CSMA/CD协议兼容。MAC发送模块由如下几部分构成:
  -    发送FIFO和发送控制器。
  -    前导与后缀发生器。
  -    填充发生器。
  -    并行CRC发生器。
  -    开始逻辑与计数器。
  -    回退与重发定时器。
  -    发送状态机。
  图6.2.11为MAC发送功能模块图。
  图6.2.11  MAC发送功能模块图
  发 送FIFO与读/写控制器(Transmit FIFO and Read/Write Controllers):发送FIFO的大小为80字节,每一个字节数据附加一个奇偶校验位,即每个字节为9位长度,其中,前64个字节数据可以被打包 存储和发送,并在发生碰撞时进行重发,无需系统更多的干预。如果没有碰撞发生,则进行数据包发送,剩余的16个字节由系统处理,以避免因为FIFO不发送 而丢失。
  当系统接口设置了相应控制寄存器的发送使能位时,发送状态机就从BDI请求数据,然后由系统控制器从系统存储器中获取数据。
  FIFO 控制器将数据存储在发送FIFO中,然后通过一个握手信号通知发送状态机,FIFO中的数据有效,可以开始发送操作。如果FIFO未满,FIFO控制器向 BDI请求更多的数据。发送状态机连续的发送数据,直到检测到最后一个字节的帧结束信号,然后追加经过计算的CRC值到数据包的末尾(若发送控制寄存器的 CRC除去位被置位,则不追加),状态寄存器的包发送位被置位,若中断使能同时产生中断。
  模块中的写FIFO控制器与计数器和发送状态机的读FIFO控制器与计数器根据各自的计数值协同工作,尽管他们由不同的时钟源驱动。
  FIFO控制器将数据和校验位存储在FIFO中,并对数据进行奇偶校验,如果校验错误,FIFO控制器就设置一个错误状态位,若对应的中断使能同时产生中断。
  前导与后缀发生器(Preamble and Jam Generator):一旦控制寄存器中的发送使能位被置位,且FIFO中有8个字节的数据,发送状态机发出Tx_en信号启动发送,开始发送前导与起始帧分隔符。
  填充发生器(PAD Generator):如果发送一个短的数据包,MAC会生成填充字节将短数据包扩展到64字节的最小限制,填充字节由“0”组成。有一个控制位可以禁止填充字节的生成。
  并 行CRC发生器(Parallel CRC Generator):数据包中所有要发送的数据,从目的地址域到其后的所有数据域都可以生成CRC。用户也可通过设置发送控制寄存器的对应位禁止CRC 生成。该功能可以用于测试,例如,为测试接收器的错误检测功能,可强制发送CRC错误的数据。该功能也可用在某些需要端到端CRC校验的网桥与交换机应用 场合。
  回退与重发定时器(Back-off and Retransmit Timers):当检测到网络上有碰撞时,发送器模块就停止数据的发送并向网络发送一个特定的阻塞信号,通知所有的节点网络有碰撞。之后,发送器等待一段 时间后再重发数据,如果连续16次的重发失败,发送状态机就置错误标志位,并在中断使能的情况下产生中断通知系统由于网络的过渡阻塞使数据包发送失败。发 送状态机清除FIFO,MAC准备下一个数据包的发送。
  发送数据奇偶校验器(Transmit Data Parity Checker):FIFO中的数据要进行奇校验检测。当数据准备发送时,发送状态机进行奇偶校验,如果检测到奇偶错误,发送数据奇偶校验器作如下操作:
  -    停止数据的发送。
  -    设置发送状态寄存器中的奇偶错误位。
  -    如果中断使能则产生中断。
  发送状态机(Transmit State Machine):发送状态机是发送模块的中央控制逻辑,控制着各种信号的传输、定时器、处理状态寄存器中的错误。
  MAC接收模块(MAC RECEIVE BLOCK)
  MAC接收模块负责数据的接收,与802.3标准的CSMA/CD协议兼容。
  当接收到一个数据包时,接收模块首先检测诸如CRC错误、对齐错误、长度错误等错误条件,也可以通过设置控制寄存器的相应位禁止错误检查。接收模块根据CAM的状态和目的地址,决定接收或拒绝数据包。MAC接收模块由以下几个部分构成:
  -    接收FIFO,FIFO控制器和计数器。
  -    接收BDI状态机。
  -    开始逻辑与计数器。
  -    用于地址识别的CAM块。
  -    并行CRC校验器。
  -    接收状态机。
  接收模块的主要部件如图6.2.12所示。
  图6.2.12  MAC接收功能模块
  接 收FIFO控制器(Receive FIFO Controller):接收FIFO控制器一次接收一个字节的数据,并根据接收到的字节数更新计数器的值。在FIFO接收数据时,CAM模块根据自身存 储的地址对数据包的目的地址进行检测,如果CAM能识别该地址,FIFO就继续接收数据包,如果CAM不能识别,接收模块就丢弃数据包并清除FIFO。
  地 址CAM和地址识别(Address CAM and Address Recognition):CAM模块完成地址识别。它将接收到的数据包的目的地址与自身存储的地址进行比较,如果地址匹配,接收状态机就继续接收数据。 CAM模块按6个字节存储一个地址的方式组织,共有32字(128字节)的大小,最多可存储21个地

本站内容除特别声明的原创文章之外,转载内容只为传递更多信息,并不代表本网站赞同其观点。转载的所有的文章、图片、音/视频文件等资料的版权归版权所有权人所有。本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如涉及作品内容、版权和其它问题,请及时通过电子邮件或电话通知我们,以便迅速采取适当措施,避免给双方造成不必要的经济损失。联系电话:010-82306118;邮箱:aet@chinaaet.com。