内容简介目录本书是一本讲述如何基于ARM7内核处理器进行嵌入式系统设计和开发的实用书籍。本书提供的实例全面涉及各种底层硬件驱动(如Flash ROM、SDRAM、Nandflash存储器、通用I/O、UART、定时器、LCD、I2C接口、A/D转换器、触摸屏及USB等)、μC/OSⅡ嵌入式操作系统、图形用户界面系统、文件系统和TCP/IP协议栈等嵌入式系统体系结构中的组成部件。书中通过28个实例对相关知识进行了有针对性的深入分析和详细解说,并为读者提供了可遵循的实践步骤,使读者能够在实际应用中深入掌握和实现这些技术和技巧。本书内容丰富,深入浅出,实用性强,不仅适合作为高等学校嵌入式系统相关专业的实验、培训教材或教师参考用书,也适合从事嵌入式系统设计和开发工作的专业技术人士使用。随着计算机技术逐渐渗透到各类电子产品当中,一种实用、高效的计算机系统:嵌入式系统不断展现出它独特的魅力。与桌面计算机不同,嵌入式计算机系统专门服务于特定需求,一般要求低成本、低耗费、轻型、高性能、高可靠性及可配置性。嵌入式系统日益广泛的应用也让人们看到了这项技术所蕴涵的巨大的市场潜力。市场的需求带动了对技术人才的需求,今天,大批的技术人员和学者的目光都被吸引到嵌入式系统的设计与开发这门技术上。但是,嵌入式系统的设计与开发作为一项实践性很强的专业技术,光有理论知识是无法真正深刻理解和掌握的。而今,市场上一些有关嵌入式系统的书籍,多是理论的堆积和外文资料的翻译,这对于希望获得快速而有效的知识技能的嵌入式系统技术人员来说,无法通过对这些书籍的阅读,获得更有效的资讯,从而难以尽快地进入角色、建立起设计思路。本书则试图打破这种状况,为读者提供直观、易懂且深入浅出的形式和内容。书中采用了列举实例的方式,深入浅出地揭示嵌入式系统技术在一些具体项目中的应用。这些实例都是可供实践和快速掌握的。每个实例相当于一个小型项目。"实例内容和目标"类似于实际应用开发中的"功能需求"或"技术指标",它首先为实例明确了一个具体的实现目标;之后,依据应用开发中的步骤,面对设计要求进行"实例分析":采用什么样的设计思路,主要的知识有哪些,要进行哪几项工作等等;最后在"实现方法和步骤"中,则进行具体的工作:电路设计和编程。本书是由在嵌入式系统领域中工作多年的工程师依据自身经验编写而成,因此,在跟随本书实践的过程中,读者将感到有如亲身参与了实际的设计与开发。书中不仅详细说明了如何验证各个实例,附带光盘中还包含了完整的可运行的实例源代码。通过对实例的运行,读者可以清楚地看到运行的现象或结果,从而留下直观和深刻的印象。书中的实例以业界表现出色的ARM处理器(采用ARM7TDMI内核的、三星公司推出的S3C44B0X)及其外围电路为硬件基础,以简明内核式的μC/OSⅡ作为嵌入式操作系统进行介绍,同时对嵌入式系统开发中常用的GUI系统、文件系统、TCP/IP协议栈等都进行了全面的揭示,尽可能完整地讲述嵌入式系统设计与开发中运用到的知识和技术。(1) 书中提供了哪些实例本书提供了28个实例,这些实例涉及面较广,遵循着先总体、后具体,先硬件、后软件,先模块、后系统的思路编写。这样,方便了初学者从前往后顺序阅读,依次对每个实例进行学习和实践,循序渐进地掌握嵌入式系统开发技术。同时,本书的每一个实例又是相对独立的,建议具备一定专业技术和经验的读者,可以首先通过阅读实例2了解目标系统的构架,然后挑选自己感兴趣的实例进行研读。实例1是一个概括性的实例,提出在进行一个典型嵌入式系统产品的开发中所涉及的基本组成元素和应采用的设计思路,建议读者首先阅读该实例,从而对嵌入式系统的设计与开发形成一个总体和直观的认识。实例2对常用开发工具及书中实例所依托的目标系统进行了详细的介绍。通过阅读该实例,读者能够了解到如何开始进行与ARM处理器相关的嵌入式系统的开发,如何构建或运用目标系统平台。由于每个实例都是在一定的目标系统上运行的,因此建议读者仔细阅读本实例的相关部分,了解目标系统的基本硬件配置。该例还通过Hello World程序实例,引导初学者开始嵌入式系统探索的第一步。从实例3开始,以三星公司的S3C44B0X处理器为例,介绍处理器内部功能部件的应用、基本外围电路设计与应用以及常用通讯接口的设计和应用。由于嵌入式系统产品都是紧密依托于硬件系统的,因此,对硬件系统有一个深刻的了解十分有助于产品的设计和开发。从实例13开始,详细分析了扩展触摸屏、USB接口和以太网接口等外围部件及其接口的设计方法,其中以太网接口是作为后面TCP/IP协议栈应用实践的基础,触摸屏的驱动知识也与后面的GUI系统相关。实例16到19深入探讨了μC/OSⅡ在ARM处理器系统中的应用,主要围绕3个内容进行应用举例:操作系统移植、多任务管理和通讯以及中断处理程序设计。实例20到24围绕GUI(图形用户界面)进行应用举例,内容包括移植、图形文字显示、汉字显示、视窗控件和动画显示等。实例25讲述如何将文件系统加入到系统中,并运用文件系统API函数对数据进行文件管理操作。实例26到28,以以太网接口作为硬件基础,依次是TCP/IP协议栈中的ARP地址解析应用实例、IP和ICMP网络诊断应用实例及UDP数据传输应用实例。(2) 如何调试和运行这些实例本书中的28个实例都经过了严格验证,它们是在一款ARM7处理器开发平台:"ARMSys"上通过测试的[关于ARMSys开发平台的详细信息,可以从杭州立宇泰(原名立泰)电子有限公司的网站www.HZLitai.com.cn上获得]。经过适当的修改,这些实例也能够在其他典型的ARM7开发板上运行(以S3C44B0X为处理器)。建议读者拥有一个自己的开发平台,这样就可以对书中的实例进行实践了。本书的实例2中详细介绍了ARMSys的体系结构,在对实例电路的讲述中也会采用ARMSys的电路结构。为了更好地学习本书的内容,建议读者通过这套开发平台,或通过自行设计和制作开发板来验证实例,作者在本书的附带光盘中提供了S3C44B0X开发板的原理图实例(光盘目录\\SCH\\)。除了目标板,还需要一套ARM处理器专用的开发软件,例如ARM公司提供的ARM Software Development Toolkit 2.5(简称SDT2.5),就是一个集成开发环境。每一个实例的源代码都放在本书附带光盘中的Source\\目录下,包括可以在SDT2.5下打开的工程文件和可进行程序固化的*.bin文件。在SDT2.5下,利用一个简易的并口转JTAG口电路模块就可以实现代码的下载与调试,这种方式的速度较慢,但是简易而且价格低。同样可以在光盘的SCH\\目录下找到JTAG板的电路原理图。关于具体的开发环境的组建和开发步骤,在本书的实例2中将有详细的指导说明。(3) 光盘资料介绍Tools\\目录下包括ARM处理器开发工具软件包,内容有:IDE Trial\\集成开发环境软件试用版JTAG\\JTAG协议转换程序USB\\USB程序下载器安装程序Programmer\\烧录工具Source\\目录下包括28个实例的工程文件、源程序文件、库文件和工程模板:ADCtestS3C44B0X内置A/D转换器应用实例ARPscanARP地址解析应用实例ColorLCDtest彩色LCD驱动实例EINTtestS3C44B0X外部中断实例Ethernet以太网底层函数编写实例FAT16testFAT16文件系统应用实例FlashtestFlash ROM读写实例guiHelloworld GUI软件包Hello World应用实例guiHZKGUI与汉字库的应用实例guiMemDevGUI动画显示应用实例guiScaleGUI绘制图形应用实例guiWMGUI窗口控件应用实例HelloworldHello World程序IICtestI2C接口应用实例IOtestI/O应用实例:矩阵式键盘扫描Nandflashtest非线性Flash ROM读写应用实例PDAtest模拟PDA应用实例PingtestPING诊断工具应用实例RTCtestS3C44B0X内置RTC应用实例SDRAMtestSDRAM接口应用实例Timertest 定时器应用实例Touchtest触摸屏应用实例UARTtestUART串行口应用实例ucos_ex1μC/OSⅡ应用之一:多任务ucos_ex2 μC/OSⅡ应用之二:任务间通讯ucos_ex3μC/OSⅡ应用之三:中断服务程序UDPtestUDP数据传输应用实例USBN9603demoUSBN9603控制器的固件程序编写范例USBtestUSB接口固件编程实例template.apjSDT工程模板PCSoftware\\目录下包括上述实例中使用到的PC机软件或驱动程序:GUI Trial\\GUI库文件和字体转换工具TCPLean\\运行在主机上的TCP/IP服务程序可执行文件(配合实例26~28)USB\\运行在主机上的USB文本文件下载器(配合实例15)SCH\\目录下包括S3C44B0X处理器系统参考电路图(PDF格式)。(4) 适合什么样的读者本书的主要目的是向社会推广与嵌入式系统有关的知识和技术,内容编排是由浅入深的,适合不同程度的读者。入门的读者可以很快地掌握一些常用的技术并积累开发经验,专业读者则可从对某个专题实例的阅读和练习中,掌握相应的开发技术和技巧。对本书有任何意见和建议,欢迎来信与作者联系:xujinggg120@263.net。(5) 感谢参加本书编写和审阅的还有周德兴、饶大立、路邀、丁立伟、郭炳予等,在此对他们的热情支持表示衷心感谢!对杭州立宇泰电子有限公司提供的优秀硬件平台支持表示感谢!编著者2004年8月 实例1嵌入式系统开发实例:模拟PDA的实现1.1 概述11.2 实例内容和目标11.3 实例分析21.3.1 系统构成的元素21.3.2 硬件部分31.3.3 软件部分51.4 实现方法与步骤101.4.1 连接硬件电路111.4.2 程序目录和内容说明111.4.3 下载并运行程序12实例2ARMSys平台开发环境及工具详解2.1 概述132.2 实例内容和目标132.3 实例分析142.3.1 ARMSys的组成结构142.3.2 ARMSys的启动程序和地址空间分配162.3.3 ARMSys提供的开发环境182.3.4 应用开发步骤192.3.5 SDT2.5的介绍192.4 实现方法与步骤202.4.1 编写或修改源程序代码212.4.2 使用APM对工程进行编译222.4.3 使用ADW进行仿真调试302.4.4 在Windows 2000/ XP下使用JTAG.exe372.4.5USB口下载工具392.4.6代码固化40实例3Flash ROM器件应用3.1 概述423.2 实例内容和目标423.3 实例分析433.3.1 读操作443.3.2 字写入操作453.3.3 扇区/ 块/ 整片擦除操作473.3.4 内部操作状态检测493.4 实现方法与步骤493.4.1 接口电路493.4.2 硬件上的设置503.4.3 寄存器的说明513.4.4 SST39VF160的擦除533.4.5 SST39VF160的写入533.5 运行结果54实例4SDRAM器件应用4.1 概述554.2 实例内容和目标554.3 实例分析554.3.1 SRAM器件的结构特点554.3.2 DRAM器件的结构特点564.3.3 SDRAM器件的构成原理和应用特点574.3.4 SDRAM器件IS42S16400简介574.4 实现方法与步骤594.4.1 地址分配594.4.2 电路连接614.4.3 寄存器设置614.4.4 对IS42S16400的编程654.5 运行结果65实例5Nandflash存储器器件应用5.1 概述665.2 实例内容和目标665.3 实例分析665.3.1 Nandflash存储器的应用特点665.3.2 Nandflash存储器器件K9F5608U0B简介675.4 实现方法与步骤785.4.1 K9F5608U0B与S3C44B0X的接口设计785.4.2 写入指令、地址和读/ 写数据的条件795.4.3 读器件的ID码子程序805.4.4 块擦除子程序805.4.5 页写入子程序815.4.6 页读出子程序825.5 运行结果83实例6通用I/O口的应用:矩阵式键盘6.1 概述846.2 实例内容和目标846.3 实例分析846.3.1 S3C44B0X的多功能I/ O口846.3.2 端口选择886.3.3 端口控制寄存器886.3.4 键盘的循环扫描检测法906.4 实现方法与步骤906.4.1 寄存器设置916.4.2 编写键盘扫描程序916.5 运行结果93实例7外部中断处理程序设计7.1 概述947.2 实例内容和目标947.3 实例分析947.3.1 概述947.3.2 中断控制器947.3.3 中断源957.3.4 中断优先级产生模块967.3.5 中断优先级977.3.6 中断矢量地址表977.3.7 控制中断的寄存器987.4 实现方法与步骤1067.4.1 I/ O口设置1067.4.2 外部中断触发模式设置1077.4.3 中断寄存器设置1077.4.4 主程序编写1077.4.5 中断处理程序编写1097.5 运行结果109实例8UART异步串行接口应用8.1 概述1108.2 实例内容和目标1108.3 实例分析1108.3.1 UART操作1118.3.2 UART寄存器1148.4 实现方法与步骤1208.4.1 电路接口和I/ O口设置1208.4.2 UART初始化1218.4.3 myUart_Send函数主体1218.4.4 字符发送程序myUart_SendByte1228.5 运行结果123实例9定时器应用9.1 概述1249.2 实例内容和目标1249.3 实例分析1249.3.1 PWM定时器操作1249.3.2 PWM定时器寄存器1309.4 实现方法与步骤1339.4.1 I/ O口设置1339.4.2 定时器时钟源频率设置1339.4.3 设置输出波形频率1339.4.4 设置占空比1339.4.5 设置定时器控制寄存器并启动定时器1339.4.6 定时器中断主程序1349.4.7 定时中断服务程序1349.5 运行结果134实例10实时日历时钟(RTC)应用10.1 概述13610.2 实例内容和目标13610.3 实例分析13610.3.1 实时时钟特性13610.3.2 实时时钟寄存器13710.4 实现方法与步骤13910.4.1 实时时钟初始化13910.4.2 显示当前时间14010.5 运行结果140实例11LCD接口应用11.1 概述14211.2 实例内容和目标14211.3 实例分析14211.3.1 STN型彩色LCD模块介绍14211.3.2 S3C44B0X的内部LCD控制器介绍14411.4 实现方法与步骤15011.4.1 I/ O口LCD功能设置15011.4.2 LCD初始化程序15111.4.3 图像数据15311.4.4 全屏显示参考程序15311.4.5 正方形的绘制15411.5 运行结果154实例12I2C接口应用12.1 概述15612.2 实例内容和目标15612.3 实例分析15612.3.1 I2C总线的基本知识15612.3.2 I2C总线通用传输格式15612.3.3 I2C串行EEPROM的相关知识15812.3.4 S3C44B0X的I2C接口16012.4 实现方法与步骤16512.4.1 I/ O端口I2C功能设置16512.4.2 I2C中断使能16512.4.3 初始化I2C接口16512.4.4 向24LC04B中写入数据子程序165124.5从24LC04B中读出数据子程序166124.6I2C中断处理子程序166125运行结果168实例13A/D转换器应用13.1 概述16913.2 实例内容和目标16913.3 实例分析16913.3.1 关于A/ D转换的基础知识16913.3.2 S3C44B0X具备的ADC16913.4 实现方法与步骤17213.4.1 模拟信号的产生17213.4.2 ADC控制寄存器的初始化17213.4.3 读取A/ D转换数值子程序17313.5 运行结果173实例14触摸屏应用14.1 概述17414.2 实例内容和目标17414.3 实例分析17414.3.1 触摸屏的基本原理17414.3.2 触摸屏的控制实现17514.3.3 ADS7843引脚配置17514.3.4 ADS7843的典型电路17614.3.5 ADS7843的控制字17714.3.6 ADS7843的工作过程17814.4 实现方法与步骤17914.4.1 接口电路的连接和I/ O口设置17914.4.2 读取触摸点坐标程序设计17914.5 运行结果180实例15USB设备接口应用15.1 概述18215.2 实例内容和目标18215.3 实例分析18315.3.1 USB接口工作原理概述18315.3.2 USB设备开发过程18415.3.3 USB接口控制器USBN960318415.3.4 USB接口电路18515.3.5 固件程序的开发18515.4 实现方法与步骤18715.4.1 安装USB驱动程序及进行文件下载18715.4.2 修改固件程序18715.5 运行结果189实例16以太网控制器接口应用16.1 概述19116.2 实例内容和目标19116.3 实例分析19116.3.1 以太网基础知识19116.3.2 关于以太网控制器RTL801919416.4 实现方法与步骤19916.4.1 连接以太网模块与处理器的接口19916.4.2 寄存器地址映射19916.4.3 热复位函数20016.4.4 初始化函数20116.4.5 接收/ 发送函数20216.5 运行结果205实例17μC/OSⅡ的移植与应用17.1 概述20617.2 实例内容和目标20717.3 实例分析20717.3.1 μC/OSⅡ操作系统的移植条件20717.3.2 移植工作的内容20817.4 实现方法与步骤21417.4.1 实验准备21417.4.2 多任务应用程序的编写21417.5 运行结果217实例18μC/OSⅡ的多任务管理和任务间通讯18.1 概述21818.2 实例内容和目标21818.3 实例分析21918.3.1 任务管理函数21918.3.2 任务间的通讯与同步22418.4 实现方法与步骤23018.4.1 连接电路23018.4.2 主任务处理程序23018.4.3 键盘检测任务处理程序23218.4.4 电压检测任务处理程序23318.5 运行结果233实例19μC/OSⅡ中断处理程序设计19.1 概述23519.2 实例内容和目标23619.3 实例分析23619.3.1 中断服务子程序23619.3.2 中断延迟23719.3.3 中断响应23719.3.4 中断恢复时间23719.3.5 中断延迟、响应和恢复23819.4 实现方法与步骤23819.4.1 中断处理汇编程序的编写23819.4.2 中断处理C程序的编写24019.4.3 中断处理任务程序的编写24019.5 运行结果241实例20GUI系统的移植与应用20.1 概述24220.2 实例内容和目标24220.3 实例分析24320.3.1 emWin的介绍24320.3.2 emWin对目标系统的要求24420.3.3 屏幕和坐标24420.3.4 应用emWin的步骤24520.3.5 emWin的移植24520.4 实现方法与步骤24720.4.1 实例准备24720.4.2 定义宏24720.4.3 编写Hello World程序24720.5 运行结果248实例21图形文字显示的基本应用21.1 概述24921.2 实例内容和目标24921.3 实例分析24921.3.1 文字显示24921.3.2 图形显示25321.4 实现方法与步骤25621.4.1 实例准备25621.4.2 绘制表盘的示例代码25621.5 运行结果257实例22汉字显示的应用22.1 概述25822.2 实例内容和目标25822.3 实例分析25822.3.1 emWin字体库的应用25822.3.2 字体库API25922.3.3 emWin已经提供的字符集26022.3.4 字体转换器26122.3.5 字体库文件结构26222.4 实现方法与步骤26422.4.1 得到符合emWin要求的汉字库26422.4.2 实例准备26822.4.3 显示汉字的示例代码26822.5 运行结果268实例23GUI视窗和控件的应用23.1 概述26923.2 实例内容和目标26923.3 实例分析26923.3.1 视窗管理器(WM)26923.3.2 视窗控件(Widgets)27523.3.3 对话框(Dialog)28723.4 实现方法与步骤29423.4.1 实例准备29423.4.2 编写主程序29423.5 运行结果294实例24GUI中的动画显示应用24.1 概述29624.2 实例内容和目标29624.3 实例分析29624.3.1 使用存储器设备驱动的说明29624.3.2 存储器设备驱动的绘图步骤29724.3.3 起用存储器设备驱动29724.3.4 与存储器设备驱动相关的API函数29824.4 实现方法与步骤30424.4.1 回调函数的参数30524.4.2 回调函数的编写30524.4.3 主程序编写30624.5 运行结果307实例25基于Nandflash的文件系统25.1 概述30825.2 实例内容和目标30825.3 实例分析30925.3.1 FAT16文件系统的结构30925.3.2 关于Nandflash 31425.4 实现方法与步骤31525.4.1 FAT16的移植31525.4.2 格式化文件系统31625.4.3 文件系统初始化31825.4.4 文件系统验证程序31925.5 运行结果320实例26ARP网络寻址26.1 概述32126.2 实例内容和目标32126.3 实例分析32326.3.1 IP地址32326.3.2 IP地址解析32326.3.3 ARP数据包32426.3.4 ARP扫描器32526.4 实现方法与步骤32626.4.1 主程序处理32626.4.2 ARP数据包的检测和创建32926.4.3 连接电路并调试运行33026.5 运行结果330实例27IP与ICMP应用27.1 概述33227.2 实例内容和目标33227.3 实例分析33427.3.1 IP数据报33427.3.2 ICMP消息33627.3.3 PING工具的工作步骤33727.4 实现方法与步骤33827.4.1 主程序处理33827.4.2 报文发送34027.4.3 报文接收34127.4.4 ICMP消息函数34327.4.5 IP数据报函数34427.4.6 连接电路并调试运行34627.5 运行结果346实例28UDP数据报传输应用28.1 概述34828.2 实例内容和目标34828.3 实例分析34928.3.1 UDP数据报34928.3.2 端口和套接字35028.3.3 UDP数据包格式35128.4 实现方法与步骤35128.4.1 主程序处理35228.4.2 接收处理35328.4.3 创建和发送UDP数据报35628.4.4 连接电路并调试运行35728.5 运行结果357附录AS3C44B0X概述A.1简介359A.2特性360A.3内部结构图362A.4芯片引脚定义363附录BARM处理器工作模式B.1处理器工作状态368B.2状态切换368B21进入THUMB状态368B22进入ARM状态368B.3存储空间格式368B.3.1大端格式368B.3.2小端格式369B.4指令长度369B.4.1数据类型369B.4.2操作模式369B.5寄存器369B.5.1ARM状态寄存器集369B.5.2THUMB状态寄存器集370B.5.3ARM状态寄存器与THUMB状态寄存器之间的关系371B.5.4在THUMB状态下操作寄存器高位372B.6程序状态寄存器PSR372B.6.1条件码标志372B.6.2控制位373B.6.3保留位374B.7异常374B.7.1进入异常处理时的行为374B.7.2离开异常处理时的行为375B.7.3异常进入/ 退出概要375B.7.4FIQ(快速中断请求)375B.7.5IRQ(中断请求)376B.7.6Abort(异常中断)376B.7.7SWI(软件中断)376B.7.8未定义指令377B.7.9异常中断向量377B.7.10异常中断优先级377B.7.11复位378附录C44binit.s初始化程序研究C.1定义入口地址379C.2建立异常中断处理向量379C.2.1向量中断模式(只针对IRQ)380C.2.2非向量中断模式382C.3初始化外部存储器385C.4初始化堆栈指针386C.5初始化I/ O设备387C.6初始化中断系统所需要的RAM变量…387C.7初始化C程序所要求的存储空间388C.7.1关于映像文件及区域388C.7.2与区域相关的符号388C.7.3加载时的映像文件389C.7.4执行时的映像文件389C.7.5初始化范例程序390C.8进入C语言程序的运行391参考文献392