ARM接口编程
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.3 软件控制硬件方法

作为一个嵌入式软件开发人员,必须熟悉如何控制硬件。

首先从技术上要确定项目开发采用哪种CPU,这取决于项目人员的技术背景、产品、以前的经验、技术特点等。一般公司会尽可能采用同一种CPU来开发不同产品,这样可以最大可能节约成本,并且技术风险比较小。当确定了CPU后,研发人员就要研究CPU的相关文件、指令集和测试程序,这些都要在项目开始前完成。硬件IC的手机通常是PDF格式的,称为DataSheet。CPU的DataSheet相当于一本厚厚的技术词典,如S3C2440的DataSheet有596页。如果要控制比较复杂的外部设备,通常还需要阅读相应的手册。因此在开发前,最好阅读尽可能多的手册。

以S3C2440 CPU为例,首先要通过了解S3C2440 CPU的框图(如图1.6所示)来了解这款CPU的大致部件。

图1.6 S3C2440 CPU框图

由图1.6 可以看出,这一款CPU具备的基本硬件包括内存、LCD、串行端口、电源等,这些也是嵌入式系统中最常见的几项装置。另外这款CPU还提供了许多的GPIO(General Purpose I/O,通用I/O接口)引脚,让设计者可以根据自己的需求来控制这些外围设备,这是一个很典型的做法。如果这些外围还是不够的话,就要自己加控制芯片,拉到地址线(Address Line)及总线(Bus Line)上,通过这些线来控制外围,如SDRAM或Flash就是通过地址线与总线来存取数据的。

以下三个概念要分清楚:存储器、I/O端口、寄存器。

寄存器是指CPU和外设内部的存储单元,数量有限,但速度快,分通用寄存器和特殊功能寄存器(如PC,SP等)。不同CPU寄存器宽度是不一样的。8位单片机表示地址线和数据为8位大小,寄存器宽度也是8位,在C程序中正好可以用一个char数据类型来操作。主流32位CPU的寄存器就是32位宽度,正好用一个32位,在程序中可以用一个unsigned int来操作,CPU的寄存器或地址位的宽度称为WORD(字)。

通常说的存储器都是独立于CPU之外的,如内存、硬盘、光盘等。

CPU本身几乎每一种外设都是通过读写设备上的寄存器来进行操作的。外设寄存器也称为“I/O端口”,通常包括控制寄存器、状态寄存器和数据寄存器三大类,而且一个外设的寄存器通常被连续编址。CPU对外设I/O端口物理地址的编址方式有两种:一种是I/O映射方式(I/O-mapped),另一种是存储空间映射方式(Memory-mapped)。而具体采用哪一种则取决于CPU的体系结构。有些体系结构的CPU(如PowerPC、M68k等)通常只实现一个物理地址空间(RAM)。在这种情况下,外设I/O端口的物理地址就被映射到CPU的单一物理地址空间中,成为存储空间的一部分。此时,CPU可以像访问一个内存单元那样访问外设I/O端口,而不需要设立专门的外设I/O指令。这就是所谓的“存储空间映射方式”(Memory-mapped),ARM体系的CPU均采用这一模式。而另外一些体系结构的CPU(如X86)则为外设专门实现了一个单独的地址空间,称为“I/O地址空间”或“I/O端口空间”。这是一个与CPU的RAM物理地址空间不同的地址空间,所有外设的I/O端口均在这一空间中进行编址。CPU通过设立专门的I/O指令(如X86的IN和OUT指令)来访问这一空间中的地址单元(即I/O端口)。这就是所谓的“I/O映射方式”(I/O-mapped)。与RAM物理地址空间相比,I/O地址空间通常都比较小,如X86 CPU的I/O空间就只有64KB(0~0xffff),这是“I/O映射方式”的一个主要缺点,而且必须要专门的汇编语言才能处理。

Linux既在X86运行,也在ARM之类运行。为了简化操作,Linux在所有CPU上都采用I/O端口概念。像ARM这样的内存映射,也被模拟成端口。

提示:在非操作系统模式下,一般直接采用内存取读模式。

在ARM下,所有外设的寄存器都被映射到一个4G空间,并且是有固定的映射地址(注意要与操作系统下的映射2G地址空间分开,那是操作系统给每个进程模拟的空间,I/O地址实际映射物理地址空间),如图1.7所示为S3C2440的Nand/Nor空间映射图。

图1.7 S3C2440的Nand/Nor空间映射图

所有S3C2440 寄存器地址映射在S3C2440 DataSheet中有详细的描述,如表1.1所示为S3C2440内存控制器相关的寄存器地址设置。

表1.1 S3C2440内存控制器相关的寄存器地址设置