
本书由浅入深,全面、系统地介绍ARM9嵌入式开发。本书每章都提供大量有针对性的实例,供读者实战演练。另外,为了帮助读者高效、直观地学习,本书每章配有大量图片和表格。 本书对ARM9嵌入式开发做了全面介绍,全书共23章,分为5篇。基础篇介绍ARM9基础知识、ARM体系结构、ARM指令集、Thumb指令集,同时也介绍S3C2440的GPIO接口、处理器控制器、UART、SPI以及ADC和触摸屏接口等。提高篇介绍ARM9嵌入式开发环境的建立,ARM9嵌入式Linux系统移植。其中,嵌入式开发环境的建立详细介绍Linux操作系统开发环境的搭建和模拟软件SkyEye环境的搭建,系统移植介绍BootLoad移植、内核移植及构建Linux文件系统。实例篇介绍基于Qt的嵌入式GUI开发、基于ARM9与QTE4的数据采集图形界面设计、基于ARM9及QTE4的图像处理。
前 言 虽然嵌入式系统是近几年才兴盛起来的,但是这个概念并非新近才出现。从20世纪70年代单片机的出现到今天各式各样的嵌入式微处理器、微控制器的大规模应用,嵌入式系统已经有了近30年的发展历史。自20世纪90年代以来,以计算机技术、通信、技术和软件技术为核心的信息技术取得了迅速的发展,几乎所有的嵌入式产品都需要嵌入式软件来提供灵活多样、针对应用的功能。由于嵌入式系统的广泛应用,嵌入式软件在整个软件行业中占据了重要地位。 当前,嵌入式技术的应用越来越广泛,从民用产品到航天科技,嵌入式产品的身影无处不在,而这些嵌入式产品的核心(处理器)决定了产品的市场和性能。其中,应用最广泛的ARM处理器具有体积小、功耗低、成本低、性能高等特点,广泛应用在16/32位嵌入式RISC解决方案中,几乎占有嵌入式微处理器市场份额的75%。ARM处理器占有巨大的市场份额与其自身的特点密切相关。ARM 不仅是一个公司、一种技术,更是一种经营理念,即由ARM公司提供核心技术,只出售芯片中的IP授权,不参与生产,而是由合作厂商去生产具体的芯片和产品。 由于资源限制等原因,嵌入式软件开发有较大的困难,选取合适的平台就显得格外重要。自Linux出现以来,嵌入式软件技术得到迅猛的发展。Linux是开放源码的操作系统,吸引着全世界的程序员参与到发展和完善的工作中来,所以Linux保持了稳定而且卓越的性能。由于其源码可以修改、移植,选用Linux操作系统作为平台,可以根据需要自由地裁剪源码,打造适合目标平台的环境,编写出最有效率的应用程序。 ARM与Linux在未来将会更加壮大,在嵌入式产品市场上会占有越来越大的份额。在这种形势下,学习、研究ARM与Linux就非常有必要,这也是本书编写的目的。在新的科技浪潮来临之际,我国正在全力迎接机遇和挑战,嵌入式领域方兴未艾,Linux也越来越成熟,我们需要掌握更新的知识,实现自我价值,为祖国贡献力量。 三星公司推出的16/32位RISC并以ARM920T为内核的微处理器S3C2440,为手持设备和一般类型应用提供了低价格、低功耗、高性能小型微控制器的解决方案。S3C2440是ARM9系列中非常优秀的一款处理器,应用广泛。S3C2440不仅支持无操作系统开发,更支持带有Linux、Wince等嵌入式操作系统的开发。本书结合 S3C2440 的特点,并使用Micro2440开发板作为开发平台,阐述基于S3C2440的嵌入式开发方法和应用实例。 本书由浅入深,全面、系统地介绍ARM9基础知识、ARM9嵌入式开发系统开发基础、ARM9嵌入式开发环境的建立、ARM9嵌入式Linux系统移植等内容,并在最后一章中介绍几个新型实例。本书提供了大量的实例程序,以方便读者进行练习和学习。本书既注重基础知识,又非常注重实践,读者可以快速上手并迅速提高。通过学习本书内容,读者不仅可以全面掌握ARM9编程和开发技术,而且还可以学习带有Linux系统的ARM9嵌入式开发方法。同时,可以获得快速分析和解决实际问题的能力,从而能够在最短的时间内,以最好的效果来解决实际的工程和科学问题,提升工作效率。 本书的特点 1.部分章节提供对应的实例,学习高效、直观 为了便于读者高效、直观地学习本书中的内容,作者提供了对应的实例。 2.结构合理,内容全面、系统 本书详细介绍ARM9处理器基础知识、ARM9嵌入式系统基础、ARM9的Linux开发环境的建立,ARM9嵌入式Linux系统移植以及ARM9嵌入式Linux应用开发实例,将实际项目开发经验贯穿于全书,思想和内容都非常丰富。在内容的安排上,则根据读者的学习习惯和内容的梯度合理安排,更加适合读者学习。 3.叙述详实,例程丰富 本书有详细的例程,每个例子都经过精挑细选,有很强的针对性。书中的程序都有完整的代码,而且代码非常简洁和高效,便于读者学习和调试。读者也可以直接使用这些代码来解决自己的问题。 4.结合实际,编程技巧贯穿其中 ARM9编程非常灵活,所以本书写作时特意给出了大量的实用编程技巧,这些技巧的灵活使用,将会让你事半功倍。 5.语言通俗,图文并茂 对于本书给出的大量理论知识、运行效果的图片及表格,读者学习起来更加形象、直观。本书不仅注重基础知识,而且非常注重实践,让读者快速上手,迅速掌握ARM9知识。 本书内容体系 本书共23章,分为5篇,各篇对应的章节和具体内容如下。 第1篇包括第1~5章,主要介绍ARM处理器的基础知识,ARM处理器系列、体系结构、ARM指令集、Thumb指令集等基础知识。 第2篇包括第6~14章,主要介绍利用S3C2440的各种接口和控制器知识,包括GPIO接口、存储器控制器、MMC/SD/SDIO控制器、Nand Flash控制器、中断控制器、UART、SPI、ADC和触摸屏接口等,大部分结合实例讲解。 第3篇包括第15~17章,主要介绍建立ARM9嵌入式开发环境,包括无操作系统ARM9的开发方法,ARM嵌入式Linux开发环境的搭建,SkyEye环境搭建等。 第4篇包括第18~20章,主要介绍ARM9嵌入式Linux系统移植,包括BootLoader移植、Linux内核移植、构建Linux文件系统等。 第5篇包括第21~23章,主要介绍利用ARM9嵌入式Linux开发环境进行相关开发的实例,包括基于Qt的嵌入式GUI开发、基于ARM9与QTE4的数据采集图形界面设计、基于ARM9及QTE4的图像处理。 本书读者对象 ARM嵌入式开发的初学者。 想全面、系统地学习ARM9嵌入式开发的人员。 嵌入式开发技术爱好者。 使用ARM9作为开发平台的技术人员。 大中专院校的学生和老师。 相关培训学校的学员。 编著者
目 录 第1篇 ARM处理器基础知识 第1章 嵌入式系统开发介绍 2 1.1 嵌入式系统介绍 2 1.1.1 嵌入式系统概念 3 1.1.2 重要组成部分 3 1.2 嵌入式系统的组成 4 1.2.1 通用设备接口和I/O接口 6 1.2.2 中间层 7 1.2.3 系统软件层 8 1.3 嵌入式系统的优点及特点 8 1.3.1 嵌入式系统的优点 9 1.3.2 嵌入式系统的特点 9 1.4 嵌入式处理器 10 1.4.1 嵌入式微处理器 10 1.4.2 嵌入式微控制器 11 1.4.3 嵌入式DSP处理器 11 1.4.4 SOC片上系统 11 1.5 嵌入式操作系统 12 1.5.1 操作系统包含的功能 12 1.5.2 嵌入式操作系统的特点 13 1.5.3 嵌入式操作系统的分类 14 1.5.4 嵌入式技术应用及发展趋势 15 1.6 嵌入式技术发展趋势 16 1.7 小结 17 第2章 ARM处理器概述 18 2.1 ARM处理器介绍 18 2.2 ARM体系结构的版本和变量 19 2.2.1 ARM体系结构的版本 19 2.2.2 ARM体系结构的变量 24 2.2.3 ARM/Thumb体系结构版本命名 25 2.3 ARM处理器的命名规则 26 2.4 ARM处理器结构 28 2.4.1 RISC中的关键技术 29 2.4.2 ARM和Thumb状态 30 2.4.3 ARM寄存器 30 2.4.4 ARM指令集概述 31 2.4.5 Thumb指令集概述 31 2.5 ARM处理器系列 32 2.5.1 ARM7系列 32 2.5.2 ARM9系列 33 2.5.3 ARM9E系列 33 2.5.4 ARM10E系列 34 2.5.5 ARM11系列 35 2.5.6 SecurCore系列 35 2.5.7 XScale系列 36 2.5.8 StrongARM系列 37 2.5.9 Cortex系列 38 2.6 小结 39 第3章 ARM9处理器与编程模型 40 3.1 ARM9处理器产品 40 3.1.1 ARM9进步之处 40 3.1.2 操作指令 41 3.1.3 ARM9产品举例 42 3.1.4 ARM9E系列微处理器 44 3.2 ARM9编程模型 45 3.2.1 ARM9数据类型 45 3.2.2 ARM9体系结构的存储器格式 45 3.2.3 ARM9处理器的工作状态 46 3.2.4 ARM9处理器模式 47 3.2.5 ARM寄存器 47 3.2.6 异常 51 3.3 小结 54 第4章 ARM指令集与寻址方式 55 4.1 指令集编码 55 4.2 条件执行 55 4.3 指令分类及指令格式 57 4.3.1 数据处理指令 57 4.3.2 Load/Store指令 61 4.3.3 程序状态寄存器与通用寄存器之间的传送指令 66 4.3.4 转移指令 66 4.3.5 异常中断指令 67 4.3.6 协处理器指令 68 4.3.7 乘法指令 70 4.3.8 伪指令 71 4.4 ARM基本寻址方式 72 4.4.1 立即寻址 72 4.4.2 寄存器寻址 72 4.4.3 寄存器间接寻址 73 4.4.4 基址变址寻址 74 4.4.5 基址加偏址寻址 74 4.4.6 堆栈寻址 74 4.4.7 块复制寻址 75 4.4.8 相对寻址 76 4.5 小结 76 第5章 Thumb指令集 77 5.1 Thumb指令集概述 77 5.2 Thumb寄存器和ARM寄存器之间的关系 78 5.3 Thumb指令集分类介绍 79 5.3.1 存储器指令 79 5.3.2 数据处理指令 82 5.3.3 分支指令 86 5.3.4 中断和断点指令 88 5.4 小结 88 第2篇 S3C2440嵌入式系统基础 第6章 GPIO接口 90 6.1 GPIO硬件介绍 90 6.1.1 GPxCON寄存器 91 6.1.2 GPxDAT寄存器 92 6.1.3 GPxUP寄存器 92 6.2 软件访问硬件 92 6.2.1 访问单个引脚 92 6.2.2 以总线方式访问硬件 92 6.2.3 软件如何读写GPIO 93 6.3 LED的GPIO接口实例 95 6.4 小结 98 第7章 存储器控制器 99 7.1 概述 99 7.2 功能描述 101 7.2.1 bank0总线宽度设置 101 7.2.2 nWAIT引脚操作 102 7.2.3 nXBREQ/nXBACK引脚操作 103 7.3 存储器接口实例 103 7.3.1 ROM存储器接口实例 104 7.3.2 SRAM存储器接口实例 105 7.3.3 SDRAM存储器接口实例 106 7.3.4 可编程存储器访问周期 107 7.4 存储器控制寄存器 108 7.4.1 总线宽度和等待控制寄存器 108 7.4.2 bank控制寄存器 109 7.4.3 刷新控制寄存器 111 7.4.4 banksize寄存器 111 7.4.5 模式寄存器集寄存器 112 7.5 存储器实例 112 7.6 小结 116 第8章 MMC/SD/SDIO控制器 117 8.1 概述 117 8.2 SD操作 118 8.3 特殊寄存器 119 8.4 SD实例 127 8.5 小结 141 第9章 Nand Flash控制器 142 9.1 Nand Flash介绍及其控制器使用 142 9.1.1 Flash 142 9.1.2 Nand Flash的物理结构 144 9.1.3 Nand Flash的访问方法 148 9.2 S3C2440 Nand Flash 控制器 160 9.2.1 操作方法概述 161 9.2.2 寄存器介绍 161 9.3 Nand Flash 控制器实例 162 9.4 小结 182 第10章 系统时钟和定时器 183 10.1 S3C2440时钟体系和电源管理模块 183 10.1.1 功能描述 184 10.1.2 电源管理 189 10.1.3 特殊寄存器 195 10.2 PWM及定时器 200 10.2.1 特点 200 10.2.2 脉宽调制定时器特殊寄存器 206 10.3 实时时钟 211 10.3.1 特点 211 10.3.2 实时时钟操作 212 10.3.3 实时时钟特殊寄存器 213 10.4 看门狗定时器 219 10.4.1 特点 219 10.4.2 看门狗定时器操作 219 10.4.3 看门狗定时器特殊寄存器 220 10.5 小结 222 第11章 中断控制器 223 11.1 概述 223 11.2 中断控制器操作 223 11.3 中断控制器特殊寄存器 227 11.4 中断方式键盘扫描实例 235 11.5 小结 238 第12章 UART 239 12.1 概述 239 12.2 UART操作 241 12.3 特殊寄存器 246 12.4 UART实例 252 12.5 小结 258 第13章 串行外围设备接口 259 13.1 概述 259 13.1.1 SPI相关概念 259 13.1.2 S3C2440A的SPI 260 13.2 SPI操作方法 261 13.2.1 编程步骤 261 13.2.2 传输格式 262 13.3 SPI特殊寄存器 263 13.4 SPI使用实例 265 13.5 小结 276 第14章 ADC和触摸屏接口 277 14.1 概述 277 14.2 特点 277 14.3 ADC及触摸屏接口操作 278 14.4 功能描述 279 14.4.1 AD转换时间 279 14.4.2 触摸屏接口模式 279 14.4.3 编程细节 280 14.5 ADC及触摸屏接口特殊寄存器 281 14.5.1 ADC控制寄存器 281 14.5.2 ADC触摸屏控制寄存器 282 14.5.3 ADC开始延时寄存器 283 14.5.4 ADC转换数据寄存器0 283 14.5.5 ADC转换数据寄存器1 284 14.5.6 ADC触摸屏指针上下中断检测寄存器 284 14.6 ADC驱动程序及测试程序 284 14.6.1 三通道ADC驱动程序 285 14.6.2 三通道ADC采样测试程序 289 14.7 小结 291 第3篇 建立ARM9嵌入式开发环境 第15章 无操作系统的ARM9开发方法 294 15.1 硬件开发 294 15.2 软件开发 295 15.2.1 软件开发基础 295 15.2.2 软件开发方法 298 15.3 使用EWARM进行无操作系统开发 301 15.4 EWARM使用实例 305 15.5 小结 314 第16章 嵌入式Linux开发环境的搭建 315 16.1 嵌入式Linux概述 315 16.2 嵌入式Linux常用工具 319 16.2.1 交叉编译工具 319 16.2.2 vim编辑器 320 16.2.3 Linux编译器gcc及编译工具 322 16.2.4 Makefile和Make命令 324 16.2.5 GNU调试工具 326 16.2.6 Linux内核编译 327 16.3 建立micro2440开发板的Linux开发环境 328 16.3.1 Fedora 9.0安装步骤 329 16.3.2 解压安装源代码及其他工具 344 16.3.3 配置网络文件系统NFS服务 348 16.4 小结 350 第17章 SkyEye环境搭建 351 17.1 SkyEye概述 351 17.1.1 SkyEye的特点 351 17.1.2 SkyEye的配置 352 17.1.3 SkyEye的使用指南 353 17.2 环境搭建 354 17.2.1 Linux操作系统安装和配置 354 17.2.2 交叉编译环境安装 357 17.3 SkyEye测试 359 17.3.1 SkyEye-testsuite-1.3.0_rc1测试包 359 17.3.2 测试U-Boot 359 17.3.3 测试μClinux 361 17.3.4 测试μClinux的网络功能 364 17.3.5 手工编译μClinux内核 364 17.4 小结 371 第4篇 ARM9嵌入式Linux系统移植 第18章 BootLoader移植 374 18.1 BootLoader简介 374 18.1.1 BootLoader概述 375 18.1.2 BootLoader的安装媒介 375 18.1.3 BootLoader支持的体系结构 376 18.1.4 BootLoader的启动过程和操作模式 377 18.1.5 BootLoader的常见种类 378 18.2 U-Boot移植 381 18.2.1 U-Boot简介 381 18.2.2 U-Boot源码结构 381 18.2.3 U-Boot启动过程 382 18.2.4 U-Boot的编译过程 389 18.2.5 U-Boot移植 391 18.2.6 U-Boot移植实例 391 18.2.7 U-Boot常用命令 394 18.2.8 U-Boot命令启动Linux内核 401 18.3 小结 402 第19章 Linux内核移植 403 19.1 Linux内核的基本概念 403 19.1.1 Linux内核版本和分类 403 19.1.2 Linux的体系结构 406 19.2 内核启动 421 19.2.1 BootLoader启动过程 421 19.2.2 Linux启动过程 423 19.2.3 建立目标板Linux的基本步骤 424 19.2.4 Linux内核的配置和编译 426 19.2.5 Linux内核的Kconfig及Makfile分析 428 19.3 Linux内核移植实例 436 19.4 小结 443 第20章 构建Linux文件系统 444 20.1 Linux根文件系统概述 444 20.1.1 Linux文件系统的目录结构 444 20.1.2 嵌入式Linux文件系统的常见类型 453 20.2 BusyBox制作根文件系统 457 20.2.1 BusyBox安装 457 20.2.2 BusyBox工作原理 460 20.2.3 BusyBox制作文件系统 467 20.3 小结 468 第5篇 ARM9嵌入式应用开发实例 第21章 基于Qt的嵌入式GUI开发 470 21.1 嵌入式GUI概述 470 21.1.1 嵌入式GUI的发展状况 470 21.1.2 基于ARM处理器的嵌入式Linux开发方法 471 21.2 Qt程序移植 473 21.2.1 Linux操作系统 473 21.2.2 软件开发环境Qt4 473 21.2.3 软件平台建立 474 21.3 计算器实例 480 21.4 小结 491 第22章 基于ARM9与QTE4的数据采集图形界面设计 492 22.1 micro2440开发板概述 492 22.2 多通道AD驱动 494 22.2.1 Linux设备驱动 494 22.2.2 多通道AD驱动 495 22.2.3 AD驱动编译进内核 498 22.2.4 AD采样程序设计 499 22.3 图形界面设计及移植 500 22.3.1 主界面设计 500 22.3.2 曲线绘制的设计 503 22.3.3 整体工作流程及程序移植 504 22.3.4 测试 506 22.4 主界面控制程序 508 22.5 小结 515 第23章 基于ARM9及QTE4的图像处理 516 23.1 ARM9与图像处理 516 23.2 OpenCV库编译及移植 516 23.2.1 Linux下OpenCV编译安装 517 23.2.2 ARM版OpenCV编译安装 518 23.3 在Qt软件添加OpenCV连接库 522 23.3.1 动态连接库与静态连接库 522 23.3.2 Qt软件添加OpenCV库 523 23.3.3 OpenCV库中的IplImage类型与Qt的QImage类型转换 524 23.4 基于ARM9和OpenCV图像边缘提取实例 529 23.5 小结 531