嵌入式系统开发与应用实例(txt+pdf+epub+mobi电子书下载)


发布时间:2021-04-07 12:29:12

点击下载

作者:马洪连,李大奎

出版社:电子工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

嵌入式系统开发与应用实例

嵌入式系统开发与应用实例试读:

前言

随着嵌入式系统设计和物联网工程应用项目的迅速发展和普及,业界对嵌入式系统设计的技术人才需求越来越大,同时也迫切需要一些较好的适合于不同层次人员使用的教材和参考书。本书从实用的角度出发,针对国内大专院校嵌入式工程专业的“嵌入式系统结构”、“嵌入式操作系统”、“嵌入式软件设计”和“嵌入式系统设计与应用”等专业课程的需要,结合作者多年的教学、科研方面的经验编写了这部实例应用教材。

本书的实例内容是在以ARM系列S3C2440微处理器为核心,集实例教学和课程设计要求而开发设计的嵌入式综合实训平台基础上完成的。

全书内容具体分为如下四部分(35种应用实例)。(1)嵌入式系统结构(无操作系统)应用实例部分,具体包括:ADS1.2 集成开发环境的安装与应用、外部按键中断的应用、RS-232 串行接口通信应用、基于 I2C 总线通信的器件应用、LED指示灯驱动应用、LCD图片显示应用、蜂鸣器驱动应用和直流电机驱动应用,共计8个应用实例。(2)嵌入式操作系统的应用实例部分,具体包括:μC/OS-II 实时操作系统多任务调度、μC/OS-II多任务通信、μC/OS-II内存管理、Linux下交叉编译工具链的建立和定制Linux内核及制作文件系统,共计5个应用实例。(3)基于Linux下的C/C++程序设计应用实例部分,具体包括:独立按键应用、矩阵键盘应用、A/D转换应用、LED控制应用、LCD驱动应用、触摸屏控制应用、I2C总线器件控制应用、网络通信应用、U盘读写应用、SD卡读写应用、蜂鸣器控制应用、电机控制应用、CMOS摄像头应用、USB接口摄像头应用和音频播放应用,共计16个应用实例。(4)嵌入式系统常用传感器扩展应用实例部分,具体包括:超声波传感器应用、温湿度传感器应用、光照强度传感器应用、三轴数字加速度计应用、陀螺仪运动传感器应用和人体红外传感器应用,共计6个应用实例。

在本书的各个实例应用中为读者介绍了相关的硬件接口原理图、设备驱动程序代码、集成开发环境等相关内容;同时,本书还附带有提供完整的开发工具、Bootloader、内核、文件系统、外设驱动等应用实例源代码的网络光盘,读者可登录华信教育资源网(www.hxedu.com.cn)免费注册后下载,有利于提高读者的开发设计能力。

本书定位于从事嵌入式系统开发和设计的初学人员,作者在编写本书的过程中,精选内容、力求符合从事嵌入式系统开发和设计的初学者的特点,做到概念清晰、理论联系实际,以便使读者能在较短的时间内迅速掌握相关知识,起到事半功倍的作用。

在本书编写的过程中,得到了大连理工大学吴国伟教授、赖晓晨副教授、邱铁副教授和林驰老师的指导和支持。研究生罗龙、余亮、丁宇心和王亚维等人对本书的完成也做出了贡献,在此对他们表示感谢。另外感谢电子工业出版社的编辑,在他们的大力支持下使本书能够很快地出版发行。本书参考和引用了有关方面的文献和资料,同样对参考文献中所有的作者深表谢意。

由于嵌入式系统设计的迅速发展和普及,嵌入式应用的新技术、新成果不断涌现和更新,书中难免存在错误、疏漏和不妥之处,还希望广大读者能够多加谅解,并及时联系作者,以期在后续版本中进行完善。编者2015年5月

概述

0.1 嵌入式综合实训平台简介

目前,在国内外基于ARM体系结构的嵌入式系统占领了32位微处理器市场较大的份额,并且在国内市场极易购买到基于 ARM 系列的各种类型微处理器,正因为如此,本书采用了以ARM微处理器为核心的硬件应用平台。

该嵌入式综合实训平台是一款基于ARM S3C2440微处理器为核心,集实验教学和课程设计于一起的实践、实训教学平台。本平台的设计目的针对“嵌入式系统结构”、“嵌入式操作系统”、“嵌入式软件设计”和“嵌入式系统设计与应用”等嵌入式专业课程的需要,提供了分别在无操作系统、嵌入式实时操作系统μC/OS-II和Linux操作系统情况下,35种软件开发及应用的实例。另外,在各个实例应用中还为用户提供了相关的硬件接口原理图、设备驱动程序代码、集成开发环境等相关资料,这样有利于加速用户本身的开发设计能力。

嵌入式综合实训平台适合国内高校的计算机专业、物联网、电子信息工程、自动化、仪器仪表、机电一体化等专业创建嵌入式实验室,还可以为广大高校师生开展学术研究、课题研究提供良好的应用平台。

该平台装有μC/OS-II和Linux内核两种嵌入式操作系统,用户可以在稳定的环境中运行程序;另外在应用实例过程中,本平台还提供了扩展接口,这样在应用中给用户提供了一定的扩展性和便利性。

本书将提供完整的开发工具、Bootloader、内核、文件系统、外设驱动、传感器扩展等应用实例源代码网络光盘,同时作者还可以提供及时有效的技术支持。

0.2 性能指标及功能

下面针对嵌入式综合实训平台的整体配置、性能指标及功能,具体分为嵌入式核心部分、外部接口与设备和可扩充外部接口三部分进行介绍。嵌入式系统实训平台的实物图及各部分说明,配套的扩展模块等如图0.1所示。

1.嵌入式核心部分

嵌入式综合实训平台核心部分的整体配置、性能指标及功能分别如下所示。

● Samsung S3C2440A微处理器:主频400 MHz,最高533 MHz。

● 系统时钟源:12 MHz无源晶振。

● 实时时钟:内部实时时钟(带后备锂电池)。

● 操作系统支持:

✧ 非操作系统测试代码(可使用H-JATG单步调试);

✧ μC/OS-II基本系统;

✧ Linux 2.6.32+Qtopia 2.2.0+QTE 4.6.3。

● SDRAM内存:64 MB SDRAM、32位数据总线、时钟频率高达100 MHz。

● Flash存储器:256 MB NandFlash和2 MB NorFlash,已经安装BIOS。图0.1 嵌入式系统实训平台的实物图

2.外部接口与设备

嵌入式综合实训平台外部接口与设备的整体配置、性能指标及功能分别如下所示:

● 7英寸LCD显示256色真彩色TFT液晶屏,屏幕分辨率可以达到1 024×768像素。

● 在LCD屏上集成有四线电阻式触摸屏。

● 一个100 Mbps以太网RJ-45接口(采用DM9000网络芯片)。

● 三个RS-232串行口。

● 一个2.0 mm间距10针JTAG接口。

● 一个USB Host(主)、三个USB Slave(从)B型接口。

● 一个SD卡存储接口。

● 一路音频输出接口,一路麦克风接口。

● 四个LED发光二极管。

● 十六个按键的小矩阵键盘。

● 一个蜂鸣器,一个直流电机。

● 一个带有可调电阻的模拟电源,用于A/D转换测试。

● 一个I2C总线AT24C04(或AT24C08)芯片,用于I2C总线应用。

● 一个2.0 mm间距20引脚摄像头接口。

● 板载实时时钟电池。

● 电源接口(5 V),带电源开关和指示灯。

3.可扩充外部接口

嵌入式综合实训平台可扩充外部接口的功能模块如下所示。

● 超声波、温湿度、光照强度、三轴加速度、陀螺仪运动、人体红外共6种传感器输入模块。

● 扩展GPS模块、GPRS模块、ZigBee通信模块接口。

● 扩展GPIO接口(DIP32插座)。

4.实训平台支持的应用实例项目

嵌入式综合实训平台针对于嵌入式专业课程群的需要,提供了分别在无操作系统、嵌入式实时操作系统μC/OS-II和Linux操作系统三种不同环境下的应用实例项目,详见表0.1。表0.1 实例项目及相关内容第一部分嵌入式系统结构(无操作系统)应用实例实例1 ADS1.2集成开发环境的安装与应用

ARM ADS的全称为ARM Developer Suite,它是ARM公司推出的基于ARM系列微处理器系统应用的集成开发环境。本书应用的ADS为1.2版本,它可以在PC的Win7/XP/Windows Server2003等操作系统下使用。

在ADS集成开发环境中,包含了与应用相关的文档和实例支持,使用者可以用它来进行基于ARM系列的微处理器的应用开发。ADS支持编辑、编译、调试各种C、C++和ARM汇编语言编写的程序,ADS由命令行开发工具、ARM文件库、GUI开发环境等支持软件组成。

通过本实例的操作,读者可以熟悉ADS1.2开发环境,学会使用ARM仿真器,使用ADS编辑、下载、调试并跟踪程序,了解嵌入式系统开发的基本思想和过程。本次实例的内容是使用ADS1.2集成开发环境,新建一个简单的工程文件,并对其进行编译、下载和调试。

实例所需的设备及工具如下:硬件方面包括有嵌入式综合实训平台、PC和通信线;软件方面包括有PC操作系统(WindowsXP以上)、ADS1.2集成开发环境、超级终端通信程序。具体实例步骤如下所示。1.1 使用ADS创建用户工程

本节通过一个简单的具体实例,介绍如何使用ADS集成开发环境,包括如何创建一个新的工程,如何配置编译选项,并编译生成可以直接烧写到Flash中的bin格式二进制可执行文件。1.1.1 建立一个工程

在ADS集成开发环境中,选择“File”→“New”,打开如图1.1所示的窗口。

可以看到有7种工程类型可以选择。(1)ARM Excutable Image:用于由ARM指令的代码生成一个ELF格式的可以执行映像文件。(2)ARM Object Library:用于由ARM指令的代码生成一个armar格式的目标文件库。(3)Empty Project:用于创建一个不包含任何库或者源文件的工程。图1.1 New窗口(4)Makefile Importer Wizard:用于将 Visual C 的 nmake 或者 GNU make 文件转入CodeWarrior IDE工程文件。(5)Thumb ARM Interworking Image:用于由ARM指令和Thumb指令的混合代码生成一个可执行的ELF格式的映像文件。(6)Thumb Excutable image:用于由Thumb指令创建一个可执行的ELF格式的映像文件。(7)Thumb Object Library:用于由Thumb指令的代码生成一个armar格式的目标文件库。

我们在这里选择“ARM Executable Image”,在“Project name:”中输入工程文件名,本例为“myled”,单击“Location:”文本框的“Set”按钮,浏览选择想要保存该工程的路径(本例为“D:\work”),将这些设置好之后,单击“确定”按钮,即可创建一个名为“myled”的新工程。

这时会出现如图1.2所示的myled.mcp窗口,同时会在“D:\work”目录下创建一个工程目录myled,如图1.3所示,而myled.mcp会出现在“D:\work\myled”目录中。图1.2 工程窗口图1.3 工程目录

对于本例,我们将准备好的源文件及其目录一起复制到myled工程目录,如图1.4所示。

然后在图1.5所示的myled.mcp项目窗口中,单击鼠标右键或者在ADS菜单选择“Project”→“Add Files…”,开始添加该项目所需要的源代码,如图1.6所示。

单击“打开”按钮,这时会弹出如图1.7所示的提示选择窗口。图1.4 网络光盘中源文件图1.5 添加源代码窗口图1.6 源文件图1.7 目标选择窗口

这里请注意,我们在新建一个工程时,ADS默认的Targets是DebugRel,另外还有两个可用的Targets,分别为Release和Debug,它们的含义分别为:

● DebugRel:使用该目标选项,在生成目标时,会为每一个源文件生成调试信息。

● Debug:使用该目标选项,在生成目标时,会为每一个源代码生成最完整的调试信息。

● Release:使用该目标选项,在生成目标时,不会生成任何调试信息。

在本例中,我们使用默认的DebugRel选项,然后把main.c也加入到myled.mcp项目工程,如图1.8所示。

到目前为止,一个完整的工程就已经建立了,如图 1.9 所示。下面我们开始对该工程进行编译和链接的配置。图1.8 添加mian.c文件示意图图1.9 完整工程窗口1.1.2 编译和链接工程

在进行编译和链接之前,首先需要对生成的目标进行配置,选择“Edit”→“DebugRel Settings…”(注意:这个选项会因为用户选择的不同目标而有所不同),出现如图1.10所示的设置窗口。图1.10 编译设置窗口

这里的设置有很多,我们主要介绍最常用的一些选项。

1.Target Settings

Target Name文本框显示了当前的目标设置。

Linker选项为用户提供了要使用的链接器,在这里选择默认的ARM Linker,使用该链接器,将使用armlink链接编译器和汇编器生成相应的工程目标文件。

在 Linker 设置中,还有两个可选项,None 代表不对生成的各个源代码目标文件进行链接,ARM Librarian表示将编译或者汇编得到的目标文件转换为ARM库文件。对于本例,使用默认的链接器ARM Linker。(1)Pre-Linker:目前ADS并不支持该选项。(2)Post-Linker:选择在链接完成后,还要对输出文件进行的操作。因为在本例中,希望生成一个可以烧写到Flash中去的二进制代码,所以在此选择ARM fromELF,表示在链接生成映像文件后,再调用fromELF命令将含有调试信息的ELF格式的映像文件转换为其他格式的文件。

Target Settings选择最后设置,如图1.11所示。

2.Language Settings

因为在本例中包含汇编代码,所以要用到汇编器。选择“ARM Assembler”后,在右侧出现相应的设置选项,在ADS集成开发环境中用的汇编器是armasm,默认的ARM体系结构是ARM7TDMI。在此要改为ARM920T,字节顺序(Byte Order)默认是小端模式(Little Endi),其他采用默认值即可,如图1.12所示。图1.11 目标设置选项窗口图1.12 ARM Assembler选项设置窗口

本例中还包含了C语言代码,因此还需要设置“ARM C Compiler”选项。选择“ARM C Compiler”后,右侧出现相应的设置选项。在ADS集成开发环境中用的汇编器是armcc,默认的ARM体系结构是ARM7TDMI,在此要改为ARM920T。字节顺序(Byte Order)默认是小端模式(Little Endi),其他采用默认值即可,如图1.13所示。图1.13 ARM C Compiler窗口

细心的读者可能会注意到,在设置框的右下角,当对某项设置进行了修改,该行中的某个选项就会发生相应的改动。实际上,这行文字显示的就是相应的编译或者链接选项,由于有了CodeWarrior,开发人员可以不用再去产生繁多的命令行选项,只要在界面中选择或者撤销某个选项,软件就会自动生成相应的代码,该命令框为习惯在DOS下键入命令行的用户提供了极大的方便。

3.Linker设置

提示:如果您对ADS设置不熟悉,可以使用我们缺省的项目文件,以下部分仅供参考。

选择“ARM Linker”,在右侧出现相应的设置选项,我们在此详细介绍这些设置框,因为这些选项对最终生成的文件有着直接的影响。在标签“Output”中,Linktype 中提供了三种链接方式,如图1.14所示。Partia方式表示链接器只进行部分链接,经过部分链接生成的目标文件,可以作为以后进一步链接时的输入文件;Simple方式是默认的链接方式,也是最为频繁使用的链接方式,它链接生成简单的ELF格式的目标文件,使用的是链接器中指定的地址映像方式;Scattered方式使得链接器要根据scatter格式文件指定的地址映像,生成复杂的ELF格式的映像文件,这个选项一般很少用到。图1.14 ARM Linker窗口

在本例中,我们选择使用Simple方式,这里有一些设置。(1)RO Base:这个文本框设置包含 RO 段的加载域和运行域为同一个地址,默认是0x8000。这里用户要根据自己的硬件实际SDRAM地址空间来修改这个地址,保证这里填写的地址是程序运行时SDRAM地址空间所能到达的范围,针对本实训平台,SDRAM的空间范围是0x3000000~0x34000000,因此这里设置为0x30000000。(2)RW Base:这个文本框设置了包含RW和ZI输出段的运行域地址。如果选中Split选项,链接器生成的映像文件将包含两个加载域和两个运行域,此时在RW Base中所输入的地址为包含RW和Z I输出段的域设置了加载域和运行域地址。(3)Ropi:选中这个设置将告诉链接器使包含有 RO输出段的运行域位置无关。使用这个选项,与链接器将保证下面的操作:检查各段时间的重寻址是否有效;确保任何由armlink自身生成的代码是与只读位置无关的。(4)Rwpi:选中该选项将会告诉链接器使包含 RW 和 ZI输出段的运行域无关。如果这个选项没有被选中,域就标识为绝对,每一个可写的输入段必须是和读写位置无关的;如果这个选项被选中,链接器将进行下面的操作。

● 检查可读/写属性的运行域的输入段是否设置了位置无关属性;

● 检查在各段之间的重地址是否有效。

在Region$$Table和ZISection$$Table中添加基于静态存储器sb的选项,该选项要求RW Base有值,如果没有给它指定数值的话,默认为0。(5)Split Image:选择这个选项把包含RO和RW的输出段的加载域分成两个加载域,一个是包含R O输出段的域,另一个是包含RW输出段的域。

这个选项要求RW Base有值,如果没有给RW Base选项的值,则默认是0。(6)Relocatable:选择这个选项则保留映像文件的重寻址偏移量,这些偏移量会为程序加载器提供有用的信息。

在Options选项中,需要读者引起注意的是Image entry point文本框,它指定映像文件的初始入口点地址值。当映像文件被加载程序加载时,加载程序会跳转到该地址处执行。如果需要,用户可以在这个文本框中输入的格式应该是“-entry入口点”,其中入口点的数据类型分为三类,分别在如下的(7)、(8)和(9)中说明。(7)入口点地址:这是一个数值,如“-entry 0x0”。(8)符号:该选项指定映像文件的入口点为该符号所代表的地址处,如“-entry int_handler”,如果该符号有多处定义存在,armlink将产生出错信息。(9)offset+object(section):该选项指定在某个目标文件的段内部的某个偏移量处为映像文件的入口地址,如“-entry8+startup(startuoseg)”,在此处指定的入口点用于设置ELF映像文件的入口地址。需要引起注意的是,这里不可以用符号main作为入口点地址符号,否则将会出现类似“Image dose not have an entry point(Not specified or not set due to multiple choice)”的错误信息。

在Layout选项中,需要设置asm.o目标文件中的Init为整个文件的入口点。关于ARM Linker的设置还很多,对于想进一步深入了解的读者,可以查看帮助文件,都有很详细的介绍。(10)在Linker下还有一个“ARM fromELF”:fromELF是一个实用工具,它实现将链接器、编译器和汇编器的输出代码进行格式转换的功能。例如,将ELF格式的可执行映像文件转换成可以烧写到 ROM 的二进制格式文件;对输出文件进行反汇编,从而提取出有关目标文件的大小、符号和字符串表,以及重寻址等信息。只有在“Target”设置中选择了“Post-linker”,才可以使用该选项。

在“Output format”下拉框中,为用户提供了多种可以转换的目标格式。本例选择“Plain binary”,这是一个二进制格式的可执行文件,可以被烧写到目标板的Flash中。

在“Output file name”文本域输入期望生成的输出文件存放的路径,或通过单击“Choose...”按钮从文件对话框中选择输出文件,如图1.15所示,如果在这个文本域不输入路径名,则生成的二进制文件存放在工程所在的目录下。进行好这些相关的设置后,以后在对工程进行 make时,CodeWarrior IDE就会在链接完成后调用fromELF来处理生成的映像文件。

对于本例的工程而言,到此,就完成了make之前的设置工作了。图1.15 ARM fromELF选项窗口

选择CodeWarrior IDE的“Project”→“make”菜单,就可以对工程进行编译和链接了,编译链接结果如图1.16所示。

最后在“D:\work\myled\myled_Data\DebugRel”目录下生成myled.bin,同时还有myled.axf文件,它是用于调试的,如图1.17所示。图1.16 编译结果显示窗口图1.17 编译生成文件指示窗口1.2 使用HJTAG进行代码调试

1.H-JTAG安装

首先,对H-JTAG进行安装。

2.为H-JTAG配置AXD DEBUGGER(1)运行AXD Debugger,打开运行ADS1.2软件的调试软件AXD Debugger,如图1.18所示。

AXD Debugger主界面如图1.19所示。(2)设置AXD Debugger,选择“Options”→“Configure Target…”,出现如图1.20所示的窗口。图1.18 AXD Debugger启动方式示意图图1.19 AXD Debugger主界面图1.20 AXD Debugger配置窗口

在该窗口中单击“Add”按钮,跳出选择文件对话框,找到 H-JTAG 安装目录,选择并打开里面的H-JTAG.dll文件,如图1.21所示。

此时会在Choose Target窗口中多了一项H-JTAG,如图1.21所示,单击“OK”按钮返回AXD Debugger主界面,如图1.22所示。图1.21 添加H-JTAG.dl示意图1.22 Choose Target选项配置窗口

3.使用HJTAG在ADS1.2环境下进行仿真调试

关闭并重新启动AXD Debugger,选择菜单“File”→“Load Image”,找到想调试的调试目标文件(*.axf格式)例如,前面编译生成的myled.axf文件,打开它就自动启动目标映像通过JTAG下载至实训平台,这时在AXD Debugger底部的状态栏会出现下载过程提示,下载完毕就可以进行单步或者全速调试了。在调试过程中可以看到CPU各个寄存器的值,也可以设置断点等,详细的用法请参考ADS附带的英文说明手册,这和常见的Visual C++等集成开发环境基本上是类似的。实例2 外部按键中断的应用2.1 实例目的和内容

S3C2440微处理器中断控制器可以接收来自60个中断源(1个看门狗定时器、5个定时器、9个UART、24个外部中断、4个DMA、2个RTC、2个ADC、1个I2C、2个SPI、1个SDI、2个USB、1个LCD、1个电池故障、1个NAND、2个Camera、1个AC97音频),可以接收来自 GPIO、DMA、UART、I2C 等片内、片外的中断,支持并具有电平/边沿触发模式的外部中断源;可编程的边沿/电平触发极性;支持为紧急中断请求提供快速中断服务等功能。

通过本实例,读者能够了解S3C2440微处理器外部中断的工作原理,掌握S3C2440微处理器外部中断的应用方法与过程。编写相关程序,在 PC 的超级终端支持下屏幕会显示按下按键及观察相关现象。

本实例使用的设备与工具在硬件方面有S3C2440嵌入式开发环境、USB连接线、串口连接线、PC。在软件方面有PC操作系统、ADS1.2集成开发环境、USB口传输工具DNW、超级终端通信程序。2.2 实例原理

嵌入式实训平台中独立按键的电路如图 2.1 所示,其实现原理非常简单,按键一端连接中央处理器中断引脚 EINT0 引脚,另一端直接接地,同时接 EINT0 的一端通过上拉电阻接3.3 V高电平。在按键未被按下时,在EINT引脚可检测到高电平。当按键被按下时,EINT0引脚直接与地相连,此时变为低电平,因此,可用EINT0引脚的电位变化表征按键的状态。图2.1 独立按键电路

利用实训平台上的按键进行外部中断申请,观察基于 ARM 系列嵌入式微处理器中断系统的相关过程,下面将简要介绍一下S3C2440异常中断方面的相关知识。2.2.1 S3C2440异常中断概述

基于S3C2440微处理器的7种异常中断情况,如表2.1所示。表2.1 S3C2440微处理器的异常中断情况表

对于S3C2440异常中断相关的控制寄存器如下。(1)SUBSRCPND寄存器:它用来表示INT_RXD0、INT_TXD0等中断是否发生,每位对应一个中断,当这些中断发生并且没有被INTSUBMSK寄存器屏蔽,则它们中的若干位将汇集出现在SRCPND寄存器的某一位上。要清除中断,往此寄存器中某位写1。(2)INTSUBMSK寄存器:它用来屏蔽SUBSRCPND寄存器所标识的中断,INTSUBMSK寄存器中某位设置1时,对应的中断被屏蔽。(3)SRCPND寄存器:它每一位被用来表示一个或一类中断是否发生,要清除某一位,往此位写1。(4)INTMSK 寄存器:用来屏蔽 SRCPND 寄存器所标识的中断,INTMSK 寄存器中某位被设为1时,对应的中断被屏蔽,它只能屏蔽IRQ中断,不能屏蔽FIQ。(5)INTMOD寄存器:它某位被设为1时,对应的中断被设为FIQ,同一时间,INTMOD只能有一位被设为1。(6)PRIORITY寄存器:当有多个IRQ同时发生时,中断控制器选出最高优先级的中断,首先处理它。(7)INTPND 寄存器:经过中断优先级选出优先级最高的中断后,这个中断在 INTPND寄存器中的相应位被置1,随后CPU进入中断模式处理它;同一时间,此寄存器只有一位被置1。在ISR中,可以根据这个位确定是哪个中断,清除中断时,往此位写入1。(8)INTOFFSET寄存器:用来表示INTPND寄存器中哪位被置1了,即INTPND寄存器中位[x]为1时,INTOFFSET寄存器的值为x(x为0~31)。清除SRCPND、INTPND寄存器时,INTOFFSET寄存器被自动清除。2.2.2 异常中断工作原理

异常中断的响应过程如下。(1)保存当前状态寄存器CPSR的值、中断屏蔽和各条件标志位,并存入将要执行的异常中断的备份状态寄存器SPSR中。(2)设置当前程序状态寄存器CPSR的值,其中包括设置CPSR相应位的值,使处理器进入特定的处理器模式,还有在FIQ快速中断时屏蔽IRQ中断。(3)设置连接寄存器LR,将中断响应模式的LR中的值设为异常中断的返回地址。(4)处理程序计数器PC,将程序计数器PC值设为相应的中断向量的地址,从而实现跳转以执行其相应的中断程序。

S3C2440 微处理器异常中断的响应流程模式为:保存当前状态寄存器 CPSR→进入特定模式、屏蔽中断→设置连接寄存器LR→设置程序计数器PC。

当微处理器执行完以上流程之后,微处理器已经自中断向量进入异常中断的处理状态。在异常中断处理完毕之后,微处理器进入异常中断的返回状态,其中断返回流程如下。(1)恢复状态寄存器,将保存在中断模式中的SPSR值赋给CPSR。(2)将返回地址赋值到程序计数器,这样程序将返回到异常中断产生的下一条指令,或者在出现问题的指令处执行。

注意:针对于不同的异常中断,其返回地址的计算方法也是不同的。在IRQ和FIQ异常中断产生时,程序计数器PC已经更新。而SWI中断和未定义指令中断是由当前指令自身产生的,程序计数器 PC 尚未更新,所以要计算出下一条指令的地址来执行返回操作。指令预取指中止异常中断和数据访问中断要求,返回到出现异常的执行现场,重新执行操作。

S3C2440微处理器异常中断的返回流程模式为:进入中断向量、异常中断的处理程序→恢复状态寄存器→将返回地址复制到程序计数器。

S3C2440系统通过在异常向量表安装各异常中断处理程序的相应入口地址,从而实现面向不同异常中断服务程序的跳转。异常向量中断的入口地址是固定的(0x00~0x1C),系统运行到满足异常中断时,系统将自动跳入相应的异常中断向量表中。而在异常向量表中保存的正是利用跳转指令或LDR指令指向该中断的异常中断处理程序入口地址,这就实现了各异常中断处理程序的执行。(1)利用跳转指令实现异常中断的安装。将 BL 指令放置到中断向量表的特定位置,跳转目标地址为中断处理程序的首地址,便可直接实现异常中断的安装。其优点是 BL 指令可以直接保存地址,缺点是BL的跳转范围只有32 MB的地址空间。(2)利用ldr指令实现异常中断的安装。利用ldr直接向程序计数器PC中赋值也可以实现中断处理程序的安装。先要将异常中断处理程序首地址的绝对地址放在临近的一个存储单元中,然后用ldr命令将该内存单元中的地址读取到程序计数器PC中。注意,这种方式的优点是可调用程序的范围不受限制。2.3 程序编写

本实例中实现了按键中断的测试与响应。通过__irq标识中断处理函数,在中断处理函数中编写自己的响应程序,本实例的响应流程如下。(1)进入中断临界区;(2)判断中断类型,若是外部中断,则处理,否则舍弃;(3)向终端输出信息,并清空中断标志;(4)退出中断临界区。

同时需要编写相应的中断测试函数,本实例中实现了除Esc按键外所有按键响应中断的功能,在测试函数中,主要完成了以下功能。(1)设置按键响应的中断类型;(2)设置中断触发类型,本实例中实现的是下降沿触发;(3)清空中断标志,并设置对应的中断处理函数;(4)循环检测按键。

这样,在完成中断对应的处理和测试程序后就可以在ADS工程中完成主函数的编写,以测试按键中断响应的功能,具体的编程代码如下。实例3 RS-232串行接口通信应用3.1 实例目的和内容

本实训平台具有三个通用同步/异步接收发送单元(Universal Synchronous/Asynchronous Receiver/Transmitter,USART),每个通道支持5位、6位、7位或者8位串行数据发送/接收;支持外部时钟作为USART的运行时钟;可编程的波特率;支持红外通信模式IrDA1.0;每个通道都具有内部64字节的发送FIFO和64字节的接收FIFO缓冲区。同时,USART可以基于在DMA模式或中断模式工作。通过增加相关转换芯片,极易扩展为RS-232、RS-485等串行通信方式。

本实例通过学习编程,来实现S3C2440微处理器的USART中有关异步接收、发送方式UART的通信功能;掌握S3C2440微处理器的串行口工作原理;掌握S3C2440微处理器寄存器配置方法。实例内容是编写程序,采用查询方式实现S3C2440微处理器UART串口的收发功能,接收来自 PC 串口(通过超级终端)的字符并将接收到的字符发送到超级终端。有关同步接收、发送USRT通信的应用详见本书实例21。

本实例使用的设备及工具在硬件方面有S3C2440嵌入式开发环境、USB连接线、串口连接线、PC。在软件方面有PC操作系统、ADS1.2集成开发环境,USB口传输工具DNW,超级终端通信程序。3.2 实例原理3.2.1 标准RS-232C串行接口简介

RS-232C是美国电子工业协会(Electronic Industries Association,EIA)在1973年公布的一种串行数据通信标准。其中RS是推荐标准(Recommended Standard)的缩写,232是识别代号,C是标准的版本号。该标准定义了数据终端设备(Data Terminal Equipment,DTE)和数据通信设备(Data Communication Equipment,DCE)之间的接口信号特性,提供了一个利用公用电话网络作为传输媒介、通过调制解调器将远程设备连接起来的技术规定。RS-232C标准串行通信方式是一种在低速率串行通信中增加通信距离的单端输出信号标准,其应用比较广泛。基于RS-232串行通信方式时,通常采用DB-9类型的接口器件示意图,如图3.1所示。图3.1 DB-9类型串行接口器件示意图

DB-9类型接口器件引脚定义说明如表3.1所示。表3.1 DB-9类型接口器件引脚定义说明

在32位的微处理器内部,一般都集成了3.3 V的LVTTL(低电压形式的TTL标准)电平的通用异步接收发送串行接口 UART。该电路模块一般由时钟发生器、数据发送器和接收器三部分功能部件组成。另外,UART控制寄存器为各个功能部件共享。为了与标准RS-232C串行设备通信,在嵌入式电路设计时,通常需要采用SP3243或MAX3223芯片用于进行通信电平的转换。这样可以将微处理器中的逻辑1信号变成RS-232C接口需要的-3 V至-15 V,将微处理器中的逻辑0信号变成RS-232C接口需要的+3 V至+15 V电平。3.2.2 相关寄存器介绍

在进行RS-232串口通信时,主要是对微处理器中UART相关的寄存器进行设置。UART包括有11个相关寄存器,分别是线路控制寄存器(ULCONn)、控制寄存器(UCONn)、FIFO控制寄存器(UFCONn)、工作方式控制寄存器(UMCONn)、发送接收状态寄

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载