首页 嵌入式技术及应用-实验资料

嵌入式技术及应用-实验资料

举报
开通vip

嵌入式技术及应用-实验资料嵌入式技术及应用-实验资料 嵌入式技术及应用 更多论文 目 录 实验一 ADS 1.2 集成开发环境的使用„„„„„„„„„„„1 实验二 串口通信实验„„„„„„„„„„„„„„„„„12 实验三 ARM指令实验„„„„„„„„„„„„„„„„„„22 实验四 汇编与 C 语言混合编程实验„„„„„„„„„„„28 实验五 4 个跑马灯实验„„„„„„„„„„„„„„„„„33 实验六 ADC 模数转换实验„„„„„„„„„„„„„„„37 实验七 BootLoader 实验„„„„„„„„„„„„„„„„...

嵌入式技术及应用-实验资料
嵌入式技术及应用-实验资料 嵌入式技术及应用 更多 论文 政研论文下载论文大学下载论文大学下载关于长拳的论文浙大论文封面下载 目 录 实验一 ADS 1.2 集成开发环境的使用„„„„„„„„„„„1 实验二 串口通信实验„„„„„„„„„„„„„„„„„12 实验三 ARM指令实验„„„„„„„„„„„„„„„„„„22 实验四 汇编与 C 语言混合编程实验„„„„„„„„„„„28 实验五 4 个跑马灯实验„„„„„„„„„„„„„„„„„33 实验六 ADC 模数转换实验„„„„„„„„„„„„„„„37 实验七 BootLoader 实验„„„„„„„„„„„„„„„„„44 实验八 TFTP 以太网通讯实验„„„„„„„„„„„„„„51 嵌入式系统及应用 实验一ADS 1.2 集成开发环境的使用 一、实验目的 学习ADS 1.2工具的用途,掌握它们的使用方法; 二、实验设备 实验微机1台; 三、实验内容 1、ADS简介 ARM ADS 全称为 ARM Developer Suite。是 ARM 公司推出的新一代 ARM 集成开发工具。现 在 ADS 的最新版本是 1.2,它取代了早期的 ADS1.1 和 ADS1.0。它除了可以安装在 Windows NT4, Windows 2000,Windows 98 和 Windows 95 操作系统下,还支持 Windows XP 和 Windows Me 操作系统。 2.1 使用 ADS 创建工程 本节通过一个具体实例,为读者介绍如何使用该集成开发环境,利用 CodeWarrior 提供 的建立工程的模板建立自己的工程,并学会如何进行编译链接,生成包含调试信息的映像文 件和可以直接烧写到 FLASH 中的.bin 格式的二进制可执行文件。 2.1.1 建立一个工程 打开一个如图 2.2-1 所示的对话框: 图 新建工程对话框 工程将所有的源码文件组织在一起,并能够决定最终生成文件存放的路径,输出的格式等。 在 CodeWarrior 中新建一个工程的方法有两种,可以在工具栏中单击“New”按钮,也可 以在“File”菜单中选择“New”菜单。在这个以上对话框中为用户提供了7种可选择的工程类型: 第 1 页 共 58页 嵌入式技术及应用 ARM Executable Image:用于由 ARM 指令的代码生成一个ELF 格式的可执行映像文件; ARM Object Library:用于由 ARM 指令的代码生成一个armar 格式的目标文件库; Empty Project:用于创建一个不包含任何库或源文件的工程; Makefile Importer Wizard:用于将 Visual C 的nmake 或 GNU make 文件转入到CodeWarrior IDE 工程文件; Thumb ARM Executable Image:用于由ARM指令和 Thumb 指令的混和代码生成一个可执 行的 ELF 格式的映像文件; Thumb Executable image:用于由Thumb 指令创建一个可执行的 ELF 格式的映像文件; Thumb Object Library:用于由 Thumb 指令的代码生成一个 armar 格式的目标文件库。在 这里选择 ARM Executable Image,在“Project name:”中输入工程文件名,本例为“ASM”, 点击“Location:”文本框的“Set?”按钮,浏览选择想要将该工程保存的路径,将这些设置好 后,点击“确定”,即可建立一个新的名为 ASM 的工程。 这个时候会出现 ASM.mcp 的窗口,如图 2.1-2 所示,有三个标签页,分别为 files,link,order,target 默认的是显示第一个标签页 files。通过在该标签页点击鼠标右键,选中“Add Files?”可以把要用到的源程序添加到工程中。 图 新建工程打开窗口 2.1-2 对于本例,将已准备好的源文件(.s 和.c 文件)添加进去,添加过程如下图(图 2.1-3):点击“打开”按钮确定。 第 2 页 共 58页 嵌入式系统及应用 图 2.1-3 在这里还有一个细节,希望读者注意。在建立好一个工程时,默认的 target 是 DebugRel,还有另外两个可用的 target,分别为 Realse 和 Debug,这三个 target 的含义分别为:DebugRel:使用该目标,在生成目标的时候,会为每一个源文件生成调试信息; Debug:使用该目标为每一个源文件生成最完全的调试信息; Release:使用该目标不会生成任何调试信息。 在本例中,使用默认的 DebugRel 目标。 为工程添加源码常用的方法有两种,既可以使用 如图 2.1-3 所示方法,也可以在“Project”菜单项中,选择“Add Files?”,这两种方法都会打开文件浏览框,用户可以把已经存在的 文件添加到工程中来。当选中要添加的文件时, 会出现一个对话框,如图 2.1-4 所示,询问 用户把文件添加到何类目标中,在这里,我们选择 DebugRel 目标。把 ASM.s(ASM.s 的参考 代码下面章节)添加到工程中来。 图 2.1-4 选择添加文件到指定目标 到目前为止,一个完整的工程已经建立。下面该对工程进行编译和链接工作。 2.1.2 编译和链接程 在进行编译和链接前,首先讲述一下如何进行生成目标的配置。点击 Edit 菜单,选“DebugRel Settings?”(注意,这个选项会因用户选择的不同目标而有所不同),出现如图2.1-5 所示的对话框。这个对话框中的设置很多,在这里介绍一些最为常用的设置选项,读者 若对其它未涉及到的选项感兴趣,可以查看相应的帮助文件。target 设置选项。Target Name 文本框显示了当前的目标设置。Linker 选项供用户选择要使用的链接器。在这里默认选择的 是 ARM Linker,使用该链接器,将使用 armlink 链接编译器和汇编器生成的工程中的文件相 应的目标文件。 第 3 页 共 58页 嵌入式技术及应用 图 2.1-5 DebugRel 设置对话框 这个设置中还有两个可选项,None 不是不用任何链接器,如果使用它,工程中的所有文件 都不会被编译器或汇编器处理。ARM Librarian 表示将编译或汇编得到的目标文件转换为 ARM 库文件。对于本例,使用默认的链接器 ARM Linker。 Pre-linker:目前 CodeWarrior IDE 不支持该选项。 Post-Linker:选择在链接完成后,还要对输出文件进行的操作。因为在本例中,希望生 成 一个可以烧写到 Flash 中去的二进制代码,所以在这里选择 ARM fromELF,表示在链接生成 映像文件后,再调用 FromELF 命令将含有调试信息的 ELF 格式的映像文件转换成其它格式 的文件。 Language Settings:因为本例中包含有汇编源代码,所以要用到汇编器。ADS 集成开发环境的汇编器是 armasm,默认的 ARM 体系结构是 ARM920T。字节顺序默认就是小端模式。其它设 置,就用默认值即可。 还有一个需要注意的就是 ARM C 编译器,它实际就是调用的命令行工具 armcc。使用默认的设置就可以了。 细心的读者可能会注意到,在设置框的右下脚,当对某项设 置进行了修改,该行中的某个选项就会发生相应的改动。实际上,这行文字就显示的是相应的编 译或链接选项,由于有 了 CodeWarrior,开发人员可以不用再去查看繁多的命令行选项,只要 在界面中选中或撤消某 个选项,软件就会自动生成相应的代码,为不习惯在 DOS 下键入命令行的用户提供了极大的方便。 Linker 设置:鼠标选中 ARM Linker,出现如图 2.1-7 所示对话框。这里详细介绍该对话 框的主要的标签页选项,因为这些选项对最终生成的文件有着直接的影响。 第 4 页 共 58页 嵌入式系统及应用 图 2.1-6 命令行工具选项设置 在标签页 Output 中,Linktype 中提供了三种链接方式。Partial 方式表示链接器只进行 部分链接,经过部分链接生成的目标文件,可以作为以后进一步链接时的输入文件。Simple 方式是默认的链接方式,也是最为频繁使用的链接方式,它链接生成简单的 ELF 格式的目标 文件,使用的是链接器选项中指定的地址映像方式。Scattered 方式使得链接器要根据 scatter 格式文件中指定的地址映像,生成复杂的 ELF 格式的映像文件。这个选项一般情况下,使用不太多。 图 2.1-7 链接器设置 第 5 页 共 58页 嵌入式技术及应用 图 2.1-8 设置映像文件的入口点 因为所举的例子比较简单,选择 Simple 方式就可以了。在选中 Simple 方式后,就会出现 Simple image。 RO Base:这个文本框设置包含有 RO 段的加载域和运行域为同一个地址。默认是 0x8000。 这里用户要根据自己硬件的实际 SDRAM 的地址空间来修改这个地址,保证在这里填写的地址, 是程序运行时,SDRAM 地址空间所能覆盖的地址。针对本书所介绍的目标板,SDRAM 的空间范围为 0x30000000~0x34000000,这里设置为 0x30100000。 RW Base:这个文本框设置了包含 RW 和 ZI 输出段的运行域地址。如果选中split 选项, 链接器生成的映像文件将包含两个加载域和两个运行域,此时,在 RW Base 中所输入的地址为包含 RW 和 ZI 输出段的域设置了加载域和运行域地址 Ropi:选中这个设置将告诉链接器使包含有 RO 输出段的运行域位置无关。使用这个选项, 链接器将保证下面的操作:检查各段之间的重寻址是否有效;确保任何由 armlink 自身生成的代码是只读位置无关的。 Rwpi:选中该选项将会告诉链接器使包含 RW 和 ZI 输出段的运行域位置无关。如果这个 选项没有被选中,域就标识为绝对。每一个可写的输入段必须是和读写位置无关的。如果这 个选项被选中,链接器将进行下面的操作:检查可读/可写属性的运行域的输入段是否设置了位置无 关属性;检查在各段之间的重地址是否有效; 在 Region$$Table 和 ZISection$$Table 中添加基于静态存储器 sb的选项。该选项要求 RW Base 有值,如果没有给它指定数值的话,默认为 0 值。 Split Image:选择这个选项把包含 RO 和 RW 的输出段的加载域分成 2 个加载域:一个是 包含 RO 输出段的域,一个是包含 RW 输出段的域。 这个选项要求 RW Base 有值,如果没有给 RW Base 选项设置,则默认是-RW Base 0。 Relocatable:选择这个选项保留了映像文件的重寻址偏移量。这些偏移量为程序加载器提 供了有用信息。在 Options 选项中,需要读者引起注意的是 Image entry point 文本框。 它指定映像文件的初始入口点地址值,当映像文件被加载程序加载时,加载程序会跳转到该 地址处执行。如果需要,用户可以在这个文本框中输入下面格式的入口点: 入口点地址:这是一个数值,例如-entry 0x0 符号:该选项指定映像文件的入口点为该符 第 6 页 共 58页 嵌入式系统及应用 号所代表的地址处,比如:-entry int_handler,如果该符号有多处定义存在,armlink 将产生出错信息。 offset+object(section):该选项指定在某个目标文件的段的内部的某个偏移量处为映 像文件的入口地址,例如:-entry 8+startup(startupseg)在此处指定的入口点用于设置 ELF 映像文件的入口地址。需要引起注意的是,这里不可以用符号 main 作为入口点地址符号,否 则将会出现类似“Image dose not have an entry point(Not specified or not set due to multiple choice)”的错误信息。在 Layout 选项中,需要的设置如图 2.1-8,设置 asm.o 目标文件中的 Init 为整个文件的入口点。关于 ARM Linker 的设置还有很多,对于想进一步 深 入了解的读者,可以查看帮助文件,都有很详细的介绍。 在 Linker 下还有一个 ARM fromELF:fromELF 是一个实用工具,它实现将链接器,编译 器或汇编器的输出代码进行格式转换的功能。 例如,将 ELF 格式的可执行映像文件转换成可以 烧写到 ROM 的二进制格式文件;对输出文件 进行反汇编,从而提取出有关目标文件的大小,符 号和字符串表以及重寻址等信息。只有在 Target 设置中选择了 Post-linker,才可以使用该选项。在 Output format 下拉框中,为用户提供了多种可以转换的目标格式,本例选择 Plain binary, 这是一个二进制格式的可执行文件,可以被烧些的目标板的Flash中。 在 Output file name 文本域输入期望生成的输出文件存放的路径,或通过点击 Choose...按 钮从文件对话框中选择输出文件。如果在这个文本域不输入路径名,则生成的二进制文件存 放 在工 程所在 的目 录下。 进行 好这些 相关 的设置 后,以后在 对工 程进行 make 的时 候, CodeWarrior IDE 就会在链接完成后调用 fromELF 来处理生成的映像文件。 对于本例的工程而言,到此,就完成了 make 之前的设置工作了。 图 2.1-9 ARM fromELF 可选项 点击 CodeWarrior IDE 的菜单 Project 下的 make 菜单,就可以对工程进行编译和链接了。 整 个编译链接过程如图 2.1-10 所示: 第 7 页 共 58页 嵌入式技术及应用 图 2.1-10 编译和链接过程 在工程 ASM 所在的目录下,会生成一个名为:工程名_data 目录,在本例中就是 ASM _data 目录,在这个目录下不同类别的目标对应不同的目录。在本例中由于我们使用的是 DebugRel 目标,所以生成的最终文件都应该在该目录下。进入到 DebugRel 目录中去,读者会看到 make 后生成的映像文件和二进制文件,映像文件用于调试,二进制文件可以下载到 SDRAM 中运行。 2.2 用 AXD 进行代码调试 2.2.1 安装并运行 ARM-JTAG 调试代理 ARM9 首先要正确连接目标板,20 芯排线连接到 SDT 座上。 将光盘目录“实用工具”下的“arm debug”文件夹拷贝到硬盘上任意目录下,运行其中的文件——“安装驱动.exe”,就会弹出一 个界面窗口,点击上面的“INSTALL”按键直到出 现提示信息“Service is partially installed.”,然后再点击下面的“INSTALL” 按键, 出现下面的信息(图 2.2-1),说明驱动安装成功: 图 2.2-1 现在运行 ARM9-JTAG 调试代理软件——arm9.exe,注意如果 20 芯排线连接到 SUPERJTAG 板 的 SDT 接口(JP4)上,需要选中下图中的 SDT;如果 20 芯排线连接到 SUPERJTAG 板的 Wiggler 接口(JP2)上,需要选中下图中的 Wiggler,这里使用的是 SDT,设置如下图所示: 第 8 页 共 58页 嵌入式系统及应用 图 2.2-2 如果安装成功、配置正确而且硬件连接良好,将会检测到 ARM920T,如(图 2.2-2)中左上 角的红色圆圈。 2.2.2 为 ARM-JTAG 调试代理正确配置 AXD DEBUGGER 运行 ADS1.2 软件中的调试软件——AXD Debugger,如图 2.2-3 的界面中,点击菜单 options/Configure Target , 在 弹 出 的 界 面 窗 口 中 选 择 Remote_A.dll , 然 后 点 击 按 键 Configure: 图 2.2-3 第 9 页 共 58页 嵌入式技术及应用 图 2.2-4 在弹出的窗口中,点击“Select”按键,选择“ARM Ethernet driver”选项,然后点击 OK 按键,如图 2.2-4 所示。 再点击“Configure”按键,在弹出的窗口中输入数字“127.0.0.1”并确认,如图 2.2-5 所示,就是设置完毕: 图 2.2-5 四、实验步骤 1.使用 SUPERJTAG 在 ADS1.20 环境下进行仿真调试 关闭并重新启动 AXD Debugger,点击菜单 File/Load Image,找到您想调试的调试目标 代码(*.axf 格式),打开它就启动目标代码下载,这时会出现进度条,下载完毕就可以单步 或者全速调试了,调试过程中可以看 CPU 各寄存器,也可以设置断点,可以单步,全速等等 调试功能。 第 10 页 共 58页 嵌入式系统及应用 五、思 考 快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题 通过本次实验我们了解到采用ADS1.2开发ARM程序过程中所必需的各种常见工具和设置的作用,你认为在开发应用程序中比较重要的设置有那些? 第 11 页 共 58页 嵌入式技术及应用 六、成绩评定 评 分 项 目 分值分配 实际得分 实验出勤情况 10 遵守实验规则 10 操作 规范性 20 实验完成情况 40 课后思考题 20 实 验 成 绩 评阅老师签名 实验时间 实验地点 指导老师 同组成员 实验成绩 实验二 一、实验目的 1.掌握ARM的串行口工作原理。 2.学习编程实现ARM的UART通讯。 3.掌握CPU利用串口通讯的方法。 二、实验设备 1.FS2410P 教学实验平台 2.ADS 1.2 评估版集成开发环境和调试代理软件 3.网线,串口连接线,电源 三、实验内容 学习串行通讯原理,了解串行通讯控制器,阅读ARM芯片文档,掌握ARM的UART相关寄存器的功能,熟悉ARM系统硬件的UART相关接口。编程实现ARM和计算机实现串行通讯:ARM监视串行口,将接收到的字符再发送给串口(计算机与开发板是通过超级终端通讯的),即按PC键盘通过超级终端发送数据,开发板将接收到的数据再返送给PC,在超级终端上显示。 四、实验原理 第 12 页 共 58页 嵌入式系统及应用 串行通信是微计算机之间一种常见的近距离通信手段,因使用方便,编程简单而广泛使用, 几乎所有的微控制器,PC 都提供串行通信接口。 1)串行通讯传输格式 开始前,线路处于空闲状态,送出连续“1”。传送开始时首先发一个“0”作为起始位,然 后出现在通信线上的是字符的二进制编码数据。 每个字符的数据位长可以约定为 5 位、6 位、7 位或 8 位,一般采用 ASCII 编码。后面是奇偶校验位,根据约定,用奇偶校验位将所传字符中为“1”的位数凑成奇数个或偶数个。也 可以约定不要奇偶校验,这样就取消奇偶校验位。 最后是表示停止位的“1”信号,这个停止位可以约定持续 1 位、1.5 位或 2 位时间宽度。 至此一个字符传送完毕,线路又进入空闲,持续为“1”。经过一段随机的时间后,下一个 字符开始传送才又发出起始位。 每一个数据位的宽度等于传送波特率的倒数。微机异步串行通信中,常用的波特率为 110,150,300,600,1200,2400,4800,9600 等。 2)电气特性 RS-232 标准 excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载 采用的接口是 9 芯或 25 芯的 D 型插头,常用的一般是 9 针插头(DB-9),下 面是 DB9 引脚说明: 第 13 页 共 58页 嵌入式技术及应用 要完成基本的通信功能,实际上只需要 RXD,TXD,GND 即可,但由于 RS-232-C 标准所定义的高,低电平信号与 S3C2410 系统的 LVTTL 电路定义的高,低电平信号完全不同,LVTTL的标准逻辑“1”对应 2V~3.3V 电平,标准逻辑“0”对应 0V~0.4V 电平,而 RS-232-C 标准采用负逻辑方式,标准逻辑“1”对应-5V~-15V 电平,标准逻辑“0”对应+5V~+15V。显然,两者间要进行通信,必须经过电平的转换,转换芯片采用的 MAX232。电路原理图如下: 第 14 页 共 58页 嵌入式系统及应用 1)S3C2410 的 UART 简介 S3C2410 的 UART(通用异步串行口)单元提供三个独立的异步串行 I/O 端口,每个都可以在中断和 DMA 两种模式下进行。它们支持最高波特率 115.2Kbps。每个 UART 通道包含 2 个16 位 FIFO 分别提供给接收和发送。 S3C2410 的 UART 可以进行以下参数的设置:可编程的波特率,红外收/发模式,1或2个停止位,5位,6位,7 位或8位数据宽度和奇偶位校验。 每个 UART 包含波特率发生器,接收器,发送器和控制单元。波特率发生器以 MCLK 为时钟源。发送器和接收器包含 16 字节 FIFO 寄存器和移位寄存器,当发送数据的时候,数据先写到 FIFO 然后拷贝到发送移位寄存器,然后从数据输出端口(TxDn)依次被移位输出。被接收的数 据也同样从接收端口(RxDn)移位输入到移位寄存器,然后拷贝到 FIFO 中。 2)UART 操作 *数据发送操作 数据发送帧的格式是可编程的,它包含一个开始位,5 到 8 个数据位,一个可选的奇偶位 和一个或两个停止位,这些可以通过线性控制器(ULCONn)来设置。发送器也能够产生发送中止 条件。中止条件迫使串口输出保持在逻辑 0 状态,这种状态保持一个传输帧的时间长度。 通常在一帧传输数据完整地传输完之后,在通过这个全 0 状态将中止信号发送给对方。中止 信号发送之后,传送数据连续放到 FIFO 中(在不使用 FIFO 模式下,将被放到输出保持寄存 器)。 *数据接收 与数据发送一样,数据接收的帧也是可以编程的,它包含一个开始位,5 到 8 个数据, 一个可选的奇偶位和一位或两位停止位,它们都是通过线性控制器(ULCONn)来设置的。接收器能够检测溢出错误,奇偶校验错误,帧错误和中止状况,每种情况下都将会将一个错 误标志置位。 3)波特率发生器 每个 UART 的波特率发生器为传输提供了串行移位时钟。波特率产生器的时钟源可以 C、 从 S3C2410 的内部系统时钟或 UCLK 中来选择。波特率由时钟源(PCLK 或 UCLK)16 分频和 UART 波特率除数寄存器(UBRDIVn)指定的 16 位除数决定。UBRDIVn 的值可以按照下式确定: UBRDIVn=(int)(PCLK/(bps*16))-1 除数的范围为 1 到(216-1)。例如,如果波特率为 115200bps 且 PCLK 或 UCLK 为 40MHz, 则 UBRDIVn 为: UBRDIVn =(int)(40000000)(115200*16))-1 = (int) (21.7)-1 = 21-1 = 20 线路控制寄存器(ULCONn)线性控制寄存器,主要用来规定传输帧的格式。下面表格是线控 制寄存器的地址和位定义: 第 15 页 共 58页 嵌入式技术及应用 控制寄存器(UCONn) 第 16 页 共 58页 嵌入式系统及应用 状态寄存器(UTRSTATn) 第 17 页 共 58页 嵌入式技术及应用 波特率(UBRDIV) 注意:如果发生了溢出错误,必须读一次 URXHn。如果不读,即使 USTATn 中的溢出错误位被清除了,下一个接收的数据仍然会发生一个溢出错误。 *发送寄存器 UTXHn 和接收寄存器 URXHn 下表是接收寄存器的地址和位定义。 第 18 页 共 58页 嵌入式系统及应用 下表为 UART 发送寄存器的地址和位定义。 五、实验步骤 (1)新建一个工程名为UART,并新建源文件、输入代码,设置好工程编译生成目标代码; (2) 硬件连接:用串口线将PC 机的COM1 与实验箱的UART1 连起来,再用交叉网线将PC 机的网口与实验箱的网口连起来,最后插上12V 电源; (3) 下载、调试并运行; (4) 结合实验内容和原理,观察实验现象,实验结果应该是在超级终端上显示键盘键入的值; (5) 完成实验思考题。 1.相关函数说明 在本实验中,主要采用串行口 1。 ?串口初始化,相关代码如下: /* 设置串口的 FIFO 属性,并清除 FIFO 中的内容 */ rUFCON0=0xf7; /* 关闭流控功能 */ rUMCON0=0x0; /* 设置 8 位数据位、1 位停止位、无奇偶校验串口模式 */ rULCON0=0x3; 第 19 页 共 58页 嵌入式技术及应用 /* 设置收发的中断模式为电平触发,关闭超时功能 */ rUCON0=0x345; /* 设置波特率,pclk 为 CPU 主频,baud 为波特率 */ rUBRDIV0= ((int) (pclk/16./baud + 0.5) -1); ?接受数据,相关代码如下: /* 等待接收缓冲空.*/ while (!(rUTRSTAT0 & 0x1)); /* 将数据写到数据端口 */ Data = rURXH0; ?发送数据 /* 等待发送缓冲区空 */ while (!(rUTRSTAT0 & 0x2)) /* 发送数据 */ rURXH0 = data 主函数 Main 功能说明:从串口接收字符串,然后通过超级终端回显 主要功能代码: /*********************************************************************** Function name: Main Parameter : void Description : 初始化系统,串口,并实现串口回显实验 Return : void Argument : Autor & date: ***********************************************************************/ void Main(void) { int data; BoardInitStart(); //系统初始化,MMU 初始化 SystemClockInit(); //系统时钟初始化 MemCfgInit(); //设置 NAND FLASH 的配置寄存器 PortInit(); //S3C2410 的 GPIO 初始化 SerialSwitch(0); //选择串口 0 SerialChgBaud(115200); //波特率 115200 printf ("FS2410P RTC Test,please Enter 'ESC' to exit\n"); while (1) { while((rUTRSTAT0 & 0x1)==0x0); /* 等待数据 */ data = rURXH0; /* 读取数据 */ if(data=='\r') /*如果是换行字符,补充一个回车 */ { while (!(rUTRSTAT0 & 0x2)); /* 等待发送缓冲空.*/ rUTXH0 = data; /* 将数据写到数据端口 */ while (!(rUTRSTAT0 & 0x2)); /* 等待发送缓冲空.*/ rUTXH0 = '\n'; /* 将数据写到数据端口 */ 第 20 页 共 58页 嵌入式系统及应用 } else { } } } while (!(rUTRSTAT0 & 0x2)); /* 等待发送缓冲空.*/ rUTXH0 = data; /* 将数据写到数据端口 */ 上面是关于该实验涉及到的部分函数,完整的代码请看光盘目录的 exp 文件夹下相应实验 的工程目录。 六、思考题 从串口接收字符,然后根据字符来调用相关处理程序。 第 21 页 共 58页 嵌入式技术及应用 七、成绩评定 评 分 项 目 分值分配 实际得分 实验出勤情况 10 遵守实验规则 10 操作 规范性 20 实验完成情况 40 课后思考题 20 实 验 成 绩 评阅老师签名 实验时间 实验地点 指导老师 同组成员 实验成绩 实验三 ARM 指令实验 一、实验目的 1. 掌握 ARM 汇编语言编程 2.掌握 ARM C 语言编程 二、实验设备 1. FS2410P教学实验平台 2.ADS 1.2 评估版集成开发环境和调试代理软件 3.网线,串口连接线,电源 三、实验内容 1. 用汇编实验LED灯的不停闪烁; 四、实验原理 ARM 处理器的指令集可以分为跳转指令,数据处理指令,程序状态寄存器(PSR)处理指 令,加载/存储指令,协处理器指令和异常产生指令 6 大类,关于这些类指令的功能使用请查 看相 第 22 页 共 58页 嵌入式系统及应用 应的 ARM 指令集资料。这里主要介绍本实验参考代码涉及到的指令的功能。 *ENTRY ENTRY 伪指令用于指定汇编程序的入口点。在一个完整的汇编程序中至少要有一个 ENTRY,但在一个源文件里最多只能有一个 ENTRY(可以没有)。 *AREA 语法格式: AREA 段名 属性 1,属性 2,?? AREA 伪指令用语定义一个代码段或数据段。其中段名若以数字开头,则该段名需用“|” 括 起来,如|1_test|. 属性字段表示代码段(或数据段)的相关属性,多个属性用逗号分隔。常用 的属性如下: CODE 属性:用于定义代码段,默认为 READONLY。 DATA 属性:用于定义数据段,默认为 READWRITE。 READONLY 属性:指定本段只读,代码段默认为 READONLY。 除了上面的属性,还有 ALIGN 属性和 COMMON 属性。 *EQU EAU 伪指令用于为程序中的常量,标号等定义一个等效的字符名称,类似于C 语言中的 #define。其中 EQU 可用“*”代替。语法格式: 名称 EQU 表达式{,类型} *END END 伪指令用于 通知 关于发布提成方案的通知关于xx通知关于成立公司筹建组的通知关于红头文件的使用公开通知关于计发全勤奖的通知 编译器已经到了源程序的结尾。 ARM 微处理器支持加载/存储指令用于在寄存器和存储器之间传送数据,加载指令用于将 存储器中的数据传送到寄存器,存储指令则完成相反的操作。 常用的加载存储指令如下: — LDR 字数据加载指令 — LDRB 字节数据加载指令 — LDRH 半字数据加载指令 — STR 字数据存储指令 — STRB 字节数据存储指令 — STRH 半字数据存储指令 在本实验中主要用到了 LDR 和 STR 指令,下面将介绍这两条指令的用法: *LDR 指令 LDR 指令的格式为: LDR{条件} 目的寄存器,<存储器地址> LDR 指令用于从存储器中将一个 32 位的字数据传送到目的寄存器中。该指令通常用于从 存储器中读取 32 位的字数据到通用寄存器,然后对数据进行处理。当程序计数器 PC 作为目的寄存器时,指令从存储器中读取的字数据被当作目的地址,从而可以实现程序流程的跳转。该指 令在程序设计中比较常用,且寻址方式灵活多样,请读者认真掌握。 例如:ldr r0,=rPCONE ;将寄存器 rPCONE 的地址存放到寄存器 r0 中 第 23 页 共 58页 嵌入式技术及应用 *STR 指令 STR 指令的格式为: STR{条件} 源寄存器,<存储器地址> STR 指令用于从源寄存器中将一个 32 位的字数据传送到存储器中。该指令在程序设计中 比较常用,且寻址方式灵活多样,使用方式可参考指令 LDR。 例如:str r1,[r0];将 r1 中的数据存放到寄存器 rPCONE 中数据处理指令 数据处理指令可分为数据传送指令、算术逻辑运算指令和比较指令等。 数据传送指令用于在寄存器和存储器 之间进行数据的双向传输。 算术逻辑运算指令完成常用的算术与逻辑的运算,该类指令不但将 运算结果保存在目的寄存器中,同时更新 CPSR 中的相应条件标志位。 比较指令不保存运算结 果,只更新 CPSR 中相应的条件标志位。 *MOV 指令 MOV 指令的格式为: MOV{条件}{S} 目的寄存器,源操作数 MOV 指令可完成从另一个寄存器、被移位的寄存器或将一个立即数加载到目的寄存器。其中 S 选项决定指令的操作是否影响 CPSR 中条件标志位的值,当没有 S 时指令不更新 CPSR 中 条件标志位的值。 例如:mov pc,lr;将寄存器 lr 的数据传输到 pc(r15)寄存器中 *CMP 指令 CMP 指令的格式为: CMP{条件} 操作数 1,操作数 2 CMP 指令用于把一个寄存器的内容和另一个寄存器的内容或立即数进行比较,同时更新 CPSR 中条件标志位的值。该指令进行一次减法运算,但不存储结果,只更改条件标志位。标 志位表示的是操作数1与操作数 2 的关系(大、小、相等),例如,当操作数 1 大于操作操作数2,则此后的有 GT后缀的指令将可以执行。 例如:cmp r3,#0x0;将 r3 寄存器的值与 0 相比较; 跳转指令用于实现程序流程的跳转,在 ARM 程序中有两种方法可以实现程序流程的跳转: — 使用专门的跳转指令。 — 直接向程序计数器 PC 写入跳转地址值。 通过向程序计数器 PC 写入跳转地址值,可以实现在 4GB 的地址空间中的任意跳转,在跳 转之前结合使用。 MOV LR,PC等类似指令,可以保存将来的返回地址值,从而实现在 4GB 连续的线性地址空间的子程 序调用。 ARM 指令集中的跳转指令可以完成从当前指令向前或向后的 32MB 的地址空间的跳转,包括 以下 4 条指令: — B 跳转指令 — BL 带返回的跳转指令 — BLX 带返回和状态切换的跳转指令 — BX 带状态切换的跳转指令 *B 指令 B指令是最简单的跳转指令。一旦遇到一个 B 指令,ARM 处理器将立即跳转到给定的目 标地址,从那里继续执行。注意存储在跳转指令中的实际值是相对当前 PC 值的一个偏移量,而不 第 24 页 共 58页 嵌入式系统及应用 是一个绝对地址,它的值由汇编器来计算(参考寻址方式中的相对寻址)。它是 24位有符号数,左移两位后有符号扩展为 32 位,表示的有效偏移为 26 位(前后 32MB 的地址空间)。 例如:b ledloop;跳转ledloop所在的程序段 *BL 指令 BL 指令的格式为: BL{条件} 目标地址 BL 是另一个跳转指令,但跳转之前,会在寄存器 R14 中保存 PC 的当前内容,因此,可以通过将 R14 的内容重新加载到 PC 中,来返回到跳转指令之后的那个指令处执行。该指令是 实现子程序调用的一个基本但常用的手段。 例如:bl delay; 调用延迟子程序 五、实验步骤 (1) 新建工程:运行 CodeWarrior 开发环境,选择 File ? New? 菜单项,弹出一个如下图示对话框: 在图中左边的工程类型中选择 ARM Executable Image 项,在“Project name:”中 输入工程 文件名“ASM”,点击“Location:”文本框的“Set?”按钮,浏览选择想要将该工程 保存的 路径,设置好后点击“确定”,即可建立一个新的名为 ASM 的工程; (2) 建立源文件:选择 File ? New? 菜单项,弹出一个对话框,选择 File 标签并按 照下图所示输入设置好相关内容,按确定键就建好了源文件; 第 25 页 共 58页 嵌入式技术及应用 (3) 输入源代码:把自己预先编写好的程序键入 asm.s 文件中; (4) 工程设置:选择 Edit ? DebugRel Settings? 选项,或按下快捷键 Alt+F7,弹出工程设置对话框如下图示: 在工程设置对话框中各项目的设置可以参考exp 文件 夹下的工程文件的设置; (5) 生成目标代码:选择 Project ? Make 菜单项,或按快捷键 F7,生产目标代码; (6) 硬件连接:用串口线将 PC 机的 COM1 与实验箱的 UART1 连起来,再用交叉网线将 PC机的网口与实验箱的网口连起来,最后插上 12V 电源; (7) 下载、调试并运行; (8) 结合实验内容和原理,观察实验现象,实验结果应该是 D14 灯不停的闪烁; (9) 完成实验思考题。 参考汇编代码程序,主要实现 LED 灯 D14 的不停闪烁的功能,主要代码如下: ;汇编指令实验 ;定义端口 E 寄存器预定义 rGPFCON EQU 0x56000050 rGPFDAT EQU 0x56000054 rGPFUP EQU 0x56000058 AREA Init,CODE,READONLY ;该伪指令定义了一个代码段,段名为 Init,属性只读 ENTRY ;程序的入口点标识 ResetEntry ;下面这三条语句,主要是用来设置 I/O 口 GPF7 为输出属性 ldr r0,=rGPFCON ;将寄存器 rPCONF 的地址存放到寄存器 r0 中 ldr r1,=0x4000 str r1,[r0] ;将 r1 中的数据存放到寄存器 rPCONF 中 ;下面这三条语句,主要是禁止 GPF 端口的上拉电阻 第 26 页 共 58页 嵌入式系统及应用 bl delay ;调用延迟子程序 ldr ldr r0,=rGPFUP str r1,=0xffff ldr r1,[r0] ledloop r2,=rGPFDAT ldr r1,=0xff str r1,[r2] ;使 GPE7 输出高电平,D14 灯会灭 ;将数据端口 F 的数据寄存器的地址附给寄存器 r2 ldr r1,=0x0 str r1,[r2] ;使 GPE7 输出低电平,D14 灯亮 bl delay ;调用延迟 b ledloop ;不断的循环,D14 将不停的闪烁 ;下面是延迟子程序 delay ldr r3,=0xbffff ;设置延迟的时间 delay1 sub r3,r3,#1 ;r3=r3-1 cmp r3,#0x0 ;将 r3 的值与 0 相比较 bne delay1 ;比较的结果不为 0(r3 不为 0),继续调用 delay1,否则执行下一条语 句 mov pc,lr ;返回 END ;程序结束符 上面是关于该实验涉及到的部分函数,完整的代码请看光盘目录的 exp 文 件夹下相应实验的工程目录。 六、思 考 题 1. 编写一个汇编代码,让 LED 灯 D13 不停的闪烁,同时可以通过调节延迟时间来控制 D13 闪烁的频率。 第 27 页 共 58页 嵌入式技术及应用 七、成绩评定 评 分 项 目 分值分配 实际得分 实验出勤情况 10 遵守实验规则 10 操作 规范性 20 实验完成情况 40 课后思考题 20 实 验 成 绩 评阅老师签名 实验时间 实验地点 指导老师 同组成员 实验成绩 实验四 汇编与 C 语言混合编程实验 一、实验目的 1. 掌握ARM C语言编程 2.掌握ARM 汇编与C语言的混合编程 第 28 页 共 58页 嵌入式系统及应用 FS2410P教学实验平台 二、实验设备 2.ADS 1.2 评估版集成开发环境和调试代理软件 1.3.网线,串口连接线,电源 三、实验内容 1. 用汇编实验LED灯的不停闪烁; 四、实验原理 ARM编程中不同语言的程序只要遵守ATPCS规则就可实现不同语言间的相互调用。ATPCS 是一系列用于规定应用程序之间相互调用的基本规则,这个规则包括: *支持数据栈限制检查 *支持只读段位置无关(ROPI); *支持可读/写段位置无关(RWPI); *支持ARM程序和Thumb程序的混合使用; *处理浮点运算。 使用以上规定的ATPCS规则时,应用程序必须遵守如下: *程序编写遵守ATPCS; *变量传递以中间寄存器和数据栈完成; *汇编器使用-apcs开关选项。 关于其它ATPCS规则,用户可以参考ARM处理器相关书籍或登录ARM公司网站。 C语言中定义的函数名在汇编语言中可作为标号使用,因此,在汇编语言中可使用程 序支指令直接转移到C语言中定义的标号(函数)中。下面代码实现从汇编语言跳转到C 语言的Main函数中。 汇编代码: _start: B Main /*跳转到C语言程序*/ C代码: Void Main() { } 程序只要遵守ATPCS相应规则,就可以使用不同的源代码编写程序。程序间的相互调用最 主要的是解决参数传递问题。应用程序之间使用中间寄存器及数据栈来传递参数,其中,第 一个到第四个参数使用R0-R3,多于四个参数的使用数据栈进行传递。这样,接收参数的应用 程序必须知道参数的个数。但是,在应用程序被调用时,一般无从知道所传递参数的个数。 不同语言编写的应用程序在调用时可以自定义参数传递的约定,使用具有一定意义的形式来 传递,可以 第 29 页 共 58页 嵌入式技术及应用 很好地解决参数个数的问题。常用的方法是把第一个或最后一个参数作为参数个 数(包括个数本身)传递给应用程序。 下面的代码就是用汇编语言写的一个简单函数: asse_add: ADD r0, r0, r1 /*r0 = r0 +r1*/ MOV pc, lr /*函数返回*/ 上面的汇编函数相当于如下声明的C语言函数: int asse_add(int x, int y); 在汇编语言中可以使用BL asse_add 指令调用该函数。输入时,r0为x参数,r1为y参数;输出r0。该函数实现的功能很简单, 返回参数x与y的和。 以上面的asse_add函数为例,在C语言中声明该函数在其它文件中实现: extern int asse_add(int x, int y); 然后就可像调用C函数一样调用该函数: x = asse_add(10, 20); ARM的编译器支持内嵌汇编语言。如下示例为C语言中采用内嵌汇编语言的方式实现 asse_add相同的功能: int embed_add () int x, int y) { asm { add x, x, y } return x; } 五、实验步骤 (1)新建一个工程名为 ASM_c,并新建源文件、输入代码, 设置好工程编译生成目标代码; (2) 硬件连接:用串口线将 PC 机的 COM1 与实验箱的 UART1 连起来,再用交叉网线将 PC 机的网口与实验箱的网口连起来,最后插上 12V 电源; (3) 下载、调试并运行 (4) 结合实验内容和原理,观察实验现象,实验结果应该是 D14 灯不停的闪烁; (5) 完成实验思考题。 ;汇编参考代码init.s如下: ;汇编与C语言的混合调用实验 第 30 页 共 58页 嵌入式系统及应用 ;端口E寄存器的预定义 AREA Init,CODE,READONLY ;该伪指令定义了一个代码段,段名为Init,属性只读 ENTRY ;程序的入口点标识 ResetEntry IMPORT Main /*声明主函数*/ BL Main /*调用主函数*/ /*定义一个汇编的延迟函数 *相当于C语言的void delay(int time); *r0 time的值*/ EXPORT delay delay sub r0,r0,#1 ;r0=r0-1 cmp r0,#0x0 ;将r3的值与0相比较 bne delay;比较的结果不为0(r0不为0),继续调用delay1,否则执行下一条语句 mov pc,lr;返回 END ;程序结束符 ;建立C语言函数Main.C 主要实现LED灯D14的不停闪烁的功能,参考代码如下: /*C语言函数*/ /*端口E寄存器预定义*/ #deefinerGPFCON (*(volatile unsigned *) 0x56000050) #define rGPFDAT (*(volatile unsigned *) 0x56000054) fine #define rGPFUP (*(volatile unsigned *) 0x56000058) extern delay (int time); void Main () { rGPFCON=0x4000; /*设置I/O口GPF7为输出属性*/ rGPFUP=0xffff; /*禁止GPF端口的上拉*/ while(1) /*不断的循环,D14将不停的闪烁*/ { rGPDATF=0xff; /*使GPF7输出高电平,D14灯会灭*/ delay(0xbffff); /*调用汇编延迟函数*/ rGPDATF=0x0; /*使GPE7输出低电平 D14灯亮*/ 第 31 页 共 58页 嵌入式技术及应用 delay(0xbffff); /*调用汇编延迟函数*/ } } 上面是关于该实验涉及到的部分函数,完整的代码请看光盘目录的exp文件夹下相应实验的工程目录。程序运行后,你会看到D14不停的闪烁。 六、思 考 题 1. 编写一个程序代码,让 LED 灯 D13 不停的闪烁,同时可以通过调节延迟时间来控制 D13 闪烁的频率。 七、成绩评定 评 分 项 目 分值分配 实际得分 实验出勤情况 10 遵守实验规则 10 操作 规范性 20 实验完成情况 40 课后思考题 20 实 验 成 绩 评阅老师签名 第 32 页 共 58页 嵌入式系统及应用 实验时间 实验地点 指导老师 同组成员 实验成绩 实验五 4 个跑马灯实验 一、实验目的 1. 了解S3C2410的I/O口特性; 2.掌握S3C2410的I/O口编程; 二、实验设备 1. FS2410P教学实验平台 2.ADS 1.2 评估版集成开发环境和调试代理软件 3.网线,串口连接线,电源 三、实验内容 1. 实现4个LED的跑马灯控制 四、实验原理 S3C2410 有 117 个复用功能输入/输出端口引脚。这些引脚是: ——Port A(GPA):23 个 输出端口 ——Port B(GPB):11 个输入/输出端口 ——Port C(GPC):16 个输入/输出端口 ——Port D(GPD):16 个输入/输出端口 ——Port E (GPE):16 个输入/输出端口 ——Port F (GPF): 8 个输入/输出端口 ——Port G(GPG):16 个输入/输出端口 ——Port H(GPH):11 个输入/输出端口 每一个端口都可以有软件设置来满足各种系统配置和设计需求。在启动程序之前你必须定义 每个引脚的哪个功能。如果引脚没有配置为复用功能,这个引脚被配置为 I/O 端口。 *端口配置器(GPACON-GPHCON) 在 S3C2410 中,大部分的引脚是复用的。所以,对于每个引脚要求定义一个功能。端口控 制寄存器(PnCON)定义每一个引脚的功能。如果 GPF0-GPF7 和 GPG0-GPG7 在掉电模式下被 用 第 33 页 共 58页 嵌入式技术及应用 做唤醒信号,这些端口必须在中断模式下被设置。 *端口数据寄存器(GPADAT-GPHDAT) 如果端口配置为输出端口,数据能被写到 PnDAT 对应的位。如果端口配置为输入端口, 能从 PnDAT 对应的位中读出数据。 *端口上拉寄存器(GPBUP-GPHUP) 端口上拉寄存器控制着每个端口组的上拉寄存器的使能或禁止。当对应位为 0,这个引 脚的上拉寄存器是允许的。当为 1 时,上拉寄存器是禁止的。 *MISCELLANEOUS 控制寄存器 这个寄存器控制数据端口的上拉寄存器?高阻状态?USB 通道以及 CLKOUT 的挑选。 *外部中断控制寄存器(EXTINTN) 24 个外部中断由多种方式来请求。EXTINTn 寄存器可以配置外部中断的请求信号的触发 方式为低电平触发,高电平触发,下降沿触发,上升沿触发以及双边沿触发。 在本实验中,由端口 GPF4~GPF7 控制 4 个 LED 指示灯。主要涉及端口 F 的控制寄存器, GPFCON,GPFDAT 和 GPFPU。端口 F 的寄存器地址和位定义如下; *端口 F 配置寄存器(GPFCON) *端口数据寄存器壹(GPFDAT) 第 34 页 共 58页 嵌入式系统及应用 *上拉寄存器(GPFUP) 4 个 LED 指示灯的接口电路如下: 五、实验步骤 (1)新建一个工程名为 LED,并新建源文件、输入代码,设置好工程编译生成目标代码; (2)硬件连接:用串口线将 PC 机的 COM1 与实验箱的 UART1 连起来,再用交叉网线将 PC 机的网口与实验箱的网口连起来,最后插上 12V 电源; (3) 下载、调试并运行; (4) 结合实验内容和原理,观察实验现象,实验结果应该是 D11、D12、D13、D14 灯不停的 轮流点亮; (5) 完成实验思考题。 1.相关函数说明 点亮灯和熄灭灯函数 LEDn_ON ()和 LEDn_OFF()定义如下: #define LED1_ON () (rGPFDAT &= ~0x10) #define LED2_ON () (rGPFDAT &= ~0x20) #define LED3_ON () (rGPFDAT &= ~0x40) #define LED4_ON () (rGPFDAT &= ~0x80) #define LED1_OFF () (rGPFDAT |= 0x10) #define LED2_OFF () (rGPFDAT |= 0x20) #define LED3_OFF () (rGPFDAT |= 0x40) #define LED4_OFF () (rGPFDAT |= 0x80) 主函数 Main 主要代码如下; 第 35 页 共 58页 嵌入式技术及应用 /******************************************************************* Function name: Main Parameter : void Description : 初始化系统,串口,并调用跑马灯显示实验函数 Return : void Argument : Autor & date: *******************************************************************/ void Main () { rGPFCON=0x5500; /*设置 I/O 口 GPF7~GPF4 为输出属性*/ rGPFUP=0xffff; /*禁止 GPF 端口的上拉*/ while(1) /*跑马灯 */ { LED1_ON(); //LED 点亮/熄灭状态设置 delay (0x2ffff); LED2_ON(); //LED 点亮/熄灭状态设置 delay (0x2ffff); LED3_ON(); //LED 点亮/熄灭状态设置 delay (0x2ffff); LED4_ON(); //LED 点亮/熄灭状态设置 delay (0x2ffff); LED1_OFF(); //LED 点亮/熄灭状态设置 delay (0x2ffff); LED2_OFF(); //LED 点亮/熄灭状态设置 delay (0x2ffff); LED3_OFF(); //LED 点亮/熄灭状态设置 delay (0x2ffff); LED4_OFF (); delay(0x2ffff); } } 上面是关于该实验涉及到的部分函数,完整的代码请看光盘目录的 exp 文件夹下相应实验 的工程目录。 六、思 考 题 1. 编写程序来改变跑马灯运行的频率。 第 36 页 共 58页 嵌入式系统及应用 七、成绩评定 评 分 项 目 分值分配 实际得分 实验出勤情况 10 遵守实验规则 10 操作 规范性 20 实验完成情况 40 课后思考题 20 实 验 成 绩 评阅老师签名 实验时间 实验地点 指导老师 同组成员 实验成绩 实验六 ADC 模数转换实验 一、实验目的 1.了解模数转换的基本原理 2.掌握模数转换的编程方法 3.掌握 S3C2410 内部 ADC 的基本应用和相关寄存器设置 第 37 页 共 58页 嵌入式技术及应用 二、实验设备 1. FS2410P教学实验平台 2.ADS 1.2 评估版集成开发环境和调试代理软件 3.网线,串口连接线,电源 三、实验内容 1. 编写程序对模拟输入进行采集和转换,并将结果显示在超级终端 2.通过可变电阻改变模拟量输入,观查显示结果,并与万用表测试的结果相比较 四、实验原理 我们经常遇到的物理参数,如电流、电压、温度、压力、速度等电量或非电量都是模拟 量。模拟量的大小是连续分布的,且经常也是时间上的连续函数。 经常遇到的物理参数,如电流、电压、温度、压力、速度等电量或非电量都是模拟量。 模拟量的大小是连续分布的,且经常也是时间上的连续函数。模拟量转换成数字信号需经过采样 ——>量化——>编码三个基本过程(数字化过程)。 *采样 按采样定理对模拟信号进行等时间间隔采样,将得到的一系列时域上的样值去代替 u=f(t),即用 u0、u1、?、un 代替 u=f(t)。这些样值在时间上是离散的值,但在幅度上仍然是连续模拟 量。 *量化 在幅值上再用离散值来表示。方法是用一个量化因子 Q 去度量;u0、u1、?,便得到整 量化的数字量。 u0=22Q 010 u1=44Q 100 .4Q u2=55Q 101 .0Q u3=55Q 101 .2Q *编码 .8Q 将整量化后的数字量进行编码,以便读入和识别; 编码仅是对数字量的一种处理方法。 例如:Q=0.5V/格,设用三位(二进编码) 1)S3C2410 的 A/D 简介 S3C2410 集成了一个8路 10 位 A/D 转换器。A/D 转换器片上带有采样保持功能。 S3C2410 支持触摸屏接口。转换器的主要特性: 分辨率:?1LSB,微分线性度误差:?1.5LSB;积分线形度误差:?1LSB,最大转化速率: 500KSPS;输入电压范围:0~3.3v,片上采样保持功能;独立/自动 X/Y 位置转换模式。 下图展示了S3C2410 A/D 转换器和触摸屏接口的功能块图。AIN[7]应该接上电阻到 VDDA_ADC。触摸屏的X通道应连接到S3C2410的 AIN[7],触摸屏的Y通道应该连接到 AIN[5]。 第 38 页 共 58页 嵌入式系统及应用 2)A/D 转换时间计算和分辨率 当 PCLK 频率为 50MHz,预分频值是49,10位数字量的转换时间如下:A/D转换频率=50MHz /(49+1)=1MHz 转换时间=1/(1MHz/5 个周期)=1/200KHz=5us A/D 转换器至少工作在 2.5MHz 时钟下,所以转换速率可以达到 500KSPS。 3)A/D 转换实验相关寄存器 *A/D 控制寄存器 ADCCON 第 39 页 共 58页 嵌入式技术及应用 *A/D 数据寄存器 ADCDAT0 ADCDAT0 工作在普通 ADC 转换模式。 五、实验步骤 (1)新建一个工程名为 ADC,并新建源文件、输入代码,设置好工程编译生成目标代码; (2) 硬件连接:用串口线将 PC 机的 COM1 与实验箱的 UART1 连起来,再用交叉网线将 PC 机的网口与实验箱的网口连起来,最后插上12V电源; 第 40 页 共 58页 嵌入式系统及应用 (3) 下载、调试并运行。 (4) 结合实验内容和原理,观察实验现象,实验结果应该是: ADC conv. freq. = 2500000Hz PCLK/ADC_FREQ - 1 = 19 AIN0: 0843 AIN0: 0844 AIN0: 0845 (5) 完成实验思考题。 *设置 A/D 采样的时钟频率 假定 CPU 主时钟的频率为 50MHZ,并且将 A/D 采样预分频值设为 49,而完成一次转换至 少需要 5 个时钟周期,则采样频率可以采用下面公式计算: f = 50M /(49+1)/5 = 200 KHZ 转换时间=1/f=0.5us 下面代码实现该功能: rADCCON=(rADCCON&0xC03F)|(~0xC03F)&(0x31<<6) //设置预分频值 启动采样步骤: 1) 允许ADC的时钟输出; rCLKCON = rCLKCON | (1<<15) 2)将ADCCON 寄存器的 BIT0 置 1 可以启动转换,当启动转换后,该位会被自动清除。 同 时启动转换时还需要指定转换通道。 3)下面代码启动通道 0 的采样转换:rADCCON=0x1|(0x0<<3); *获取转换结果 当 A/D 转换结束后,可以读取 ADCDAT 寄存器的内容下面代码等待通道0的 A/D 转换,完 毕后读取数据,实现的代码如下: while(!(rADCCON & 0x8000)); //等待,直到 A/D 转换结束 data=rADCDAT; //获得转换后的数据 int Read_Adc(unsigned char ch) A/D读取通道函数 参数说明:ch : 决定那个通道被选择 主要功能:指定某一通道(ch)进行转换,并读出转换值 该函数的代码如下: /************************************************************************** Function name: Read_Adc Parameter : ch : ADC 的通道,范围 0~7 Description : 读取相应通道 ch 的模数转换的值 Return : 返回模数转换的值 Argument : Autor & date : **************************************************************************/ int ReadAdc (int ch) { 第 41 页 共 58页 嵌入式技术及应用 int i; static int prevCh=-1; rADCCON = (1<<14)|(preScaler<<6)|(ch<<3); //setup channel if (prevCh!=ch) { rADCCON = (1<<14)|(preScaler<<6)|(ch<<3); //setup channel for (i=0;i0) { NorFlashProg(0x0,download_addr,download_len);//进行 BootLoader 的更新 } } *启动 Linux 功能 该功能主要由 NandLoadRun()函数实验,主要用来启动 Linux,并向 Linux 内核传递 参数。 主要代码如下: void NandLoadRun(void) { InitNandFlash(); //初始化 NAND FLASH LoadRun(); //装载并启动 Linux } 主函数 Main 功能说明:系统的初始化,功能菜单的选择。主要代码如下: /*********************************************************************** Function name: Main Parameter : void Description : 初始化系统,串口,并调用 TFTP 网络传输实验函数 Return : void Argument : Autor & date : **********************************************************************/ void Main(void) { 第 49 页 共 58页 嵌入式技术及应用 int idx,i; BoardInitStart(); //系统初始化,MMU 初始化 SystemClockInit(); //系统时钟初始化 MemCfgInit(); //设置 NAND FLASH 的配置寄存器 PortInit(); //S3C2410 的 GPIO 初始化 SerialSwitch(0); //选择串口 0 SerialChgBaud(115200); //波特率 115200 while(1) { puts("\nPlease select function : \n"); for(i=0; CmdTip[i].fun!=0; i++) printf("%d : %s\n", i, CmdTip[i].tip);//打印 BootLoader 的功能菜单 idx=getch(); idx-='0'; if(idx 协议 离婚协议模板下载合伙人协议 下载渠道分销协议免费下载敬业协议下载授课协议下载 3.了解 TFPT 协议的功能和作用 二、实验设备 1. FS2410P教学实验平台 2.ADS 1.2 评估版集成开发环境和调试代理软件 3.交叉网线,串口连接线,电源 第 51 页 共 58页 嵌入式技术及应用 三、实验内容 1. 通过 TFTP 协议实现文件的下载 四、实验原理 1)以太网物理帧格式 Preamble :前导,由 0、1 间隔代码组成 . Destination Address:目的地址,以太网的地址为 48 位(6 个字节)二进制地址,表明该帧传输 给哪个网卡.如果为 FFFFFFFFFFFF,则是广播地址,广播地址的数据可以被任何网卡接收 到。 Source Address :源地址,48 位,表明该帧的数据是哪个网卡发的,即发送端的网卡地址,同样 是 6 个字节。 Type :类型字段,表明该帧的数据是什么类型的数据,不同的协议的类型字段不同。如: 0800H 表示数据为 IP 包,0806H 表示数据为 ARP 包,814CH 是 SNMP 包,8137H 为 IPX/SPX 包。(小于0600H 的值是用于 IEEE802 的,表示数据包的长度。) DATA :数据段 ,该段数据不能超过 1500 字节。因为以太网规定整个传输包的最大长度 不能 超过 1514 字节。(14 字节为 DA,SA,TYPE)。 FCS :32 位数据校验位.为 32 位的 CRC 校验,该校验由网卡自动计算,自动生成,自动校验,自 动在数据段后面填入.对于数据的校验算法,我们无需了解。 1)IP 协议 网际协议 IP 是网络层中最重要的协议。IP 层接收由更低层(网络接口层如以太网设备 驱动程序)发来的数据包,并把该数据包发送到更高层—TCP 或 UDP 层;相反,IP 层也把从 TCP 或 UDP 层接收来的数据包传送到更低层。IP 数据包是不可靠的,因为 IP 并没有做任何事 情来确认数据包是按顺序发送的或则没有被破坏的。IP 数据包中含有发送它的主机的地址(源 地址)和接收它的主机的地址(目的地址)。 ——————————————————— |本地媒介头 | IP 头 | UDP 头 | TFTP 包 | —————————————————— 包头 次序 关于 IP 协议的详细资料,请查看相关资料。 2)UDP 协议简介 UDP 与 TCP 位于同一层,但对于数据包的顺序错误或重发不作处理。UDP 主要用于面向查 第 52 页 共 58页 嵌入式系统及应用 询-应答的服务,如 NFS。相对于 FTP 或 Telnet,这些服务需要交换的信息量较少。UDP 协议 的0 16 32 数据包头格式如下: —————————————————— | UDP 源端口 | UDP 目的端口 | —————————————————— | UDP 数据报长度 | UDP 数据报校验 | ————————————————— UDP 数据包格式 3)TFTP 协议简介 TFTP 是一个传输文件的简单协议,它基于 UDP 协议实现,它不具备通常的 FTP 的全部功能,它只能从文件服务器上获得或写入文件,不能列出目录,不进行认证等。 传输中有三种模式:netascii,这是 8 位的 ASCII 码形式,另一种是octet,这是 8 位源数据类型;最后一种 mail 已经不再支持,它将返回的数据直接返回给用户而不是保存为文件。 任何传输起自一个读取或写入文件的请求,这个请求也是连接请求。如果服务器批准此请求,则服务器打开连接,数 据以定长 512 字节传输。每个数据包包括一块数据,服务器发出下一个数据包以前必须得到客 户对上一个数据包的确认。如果一个数据包小于 512 字节,则表示传输结束。如果数据包在传 输过程中丢失,发出方会在超时后重新传输最后一个未被确认的数据包。通信的双方都是数据的 发出者与接收者,一方传输数据接收应答,另一方发出应答接收数据。大部分的错误会导致连接 中断,错误由一个错误的数据包引起,这个包不会被确认,也不会被重新发送,因此另一方无法 接收到。如果错误包丢失,则使用超时机制。 TFTP 使用 UDP 协议,而 UDP 使用 IP,IP 可以还使用其它本地通信方法。 一个 TFTP 包中会有以下几段:本地媒介头,IP 头,数据报头,TFTP 头,剩下的就是 TFTP 数据了。 TFTP 在 IP 头中不指定任何数据,但是它使用 UDP 中的源和目标端口以及包长度域, 由 TFTP 使用的包标记(TID)在这里被用做端口,TID 必须介于 0 到 65,535 之间。 *TFTP 的初始连接 初始连接时需要发出 WRQ(请求写入远程系统)或 RRQ(请求读取远程系统),收到一个 确定应答,一个确定可以写出的包或应该读取的第一块数据。 创建连接时,通信双方随机选择一个 TID。每个包包括两个 TID,发送者 ID 和接收者 ID。 下例是一个写入的例子,其中 WRQ,ACK 和 DATA 代表写入请求,确认和数据。 ?主机 A 向主机 B 发出 WRQ,其中端口为 69 ?B 机向 A 机发出 ACK,块号为 0,包括 B 和 A 的 TID *TFTP 包的类型 Read request (RRQ) Write request (WRQ) Data (DATA) Acknowledgment (ACK) Error (ERROR) *连接正常终止 传输的结束由 DATA 数据标记,其包括 0-511 个字符。这个包可以被其它数据包确认。接 收方在发出对最后数据包的确认后可以断开连接,当然,适当的等待是比较好的,如果最后 的确定包丢失可以再次传输。如果发出确认后仍然收到最后数据包,可以确定最后的确认丢失。 第 53 页 共 58页 嵌入式技术及应用 发送最后一个 DATA 包的主机必须等待对此包的确认或超时。如果响应是 ACK,传输完成。 如果发送方超时并不准备重新发送并且接收方有问题或网络有问题时,发送也正常结束。 FS2410P 使用 CS8900A-CQ3 芯片扩展了网络通讯模块,它的传输速率工作为 10M。 在电路接口中,CS8900 工作在 16 位模式下,网卡芯片复位默认工作方式为 I/O 连接,寄存器 的默认基址是 300H。 电路原理图如下: 因为 CS8900 占用了 CPU 的片选线 nGCS3,则 CS8900 寄存器的基址空间为 0X6000000+300H。 CS8900 几个关键寄存器介绍: *LINECTL(0112H) LINECTL 决定 CS8900 的基本配置和物理接口。在本系统中,设置初始值为 00d3H,选择 物理接口为 10BASE-T,并使能设备的发送和接收控制位。 *RXCTL(0104H) RXCTL 控制 CS8900 接收特定数据报。设置 RXTCL 的初始值为 0d05H,接收网络上的广播 或者目标地址同本地物理地址相同的正确数据报。 *RXCFG(0102H) RXCFG 控制 CS8900 接收到特定数据报后会引发接收中断。RXCFG 可设置为 0103H,这样当 收到一个正确的数据报后,CS8900 会产生一个接收中断。 *BUSCT(0116H) BUSCT 可控制芯片的 I/O 接口的一些操作。设置初始值为 8017H,打开 CS8900 的中断总 控制位。 *ISQ(0120H) ISQ 是网卡芯片的中断状态寄存器,内部映射接收中断状态寄存器和发送中断状态寄存器 的内容。 *PORT0(0000H) 第 54 页 共 58页 嵌入式系统及应用 发送和接收数据时,CPU 通过 PORT0 传递数据。 *TXCMD(0004H) 发送控制寄存器,如果写入数据 00C0H,那么网卡芯片在全部数据写入后开始发送数据。 *TXLENG(0006H) 发送数据长度寄存器,发送数据时,首先写入发送数据长度,然后将数 据通过 PORT0 写入芯 片。 以上为几个最主要的工作寄存器(为 16 位),CS8900 支持 8 位模式,当读或写 16 位数据 时,低位字节对应偶地址,高位字节对应奇地址。例如,向 TXCMD 中写入 00C0H,则可将 00h 写入 305H,将 C0H 写入 304H。 系统工作时,应首先对网卡芯片进行初始化,即写寄存器 LINECTL、RXCTL、RCCFG、BUSCT。 发数据时,写控制寄存器 TXCMD,并将发送数据长度写入 TXLENG,然后将数据依次写入 PORT0 口,如将第一个字节写入 300H,第二个字节写入 301H,第三个字节写入 300H,依此类推。网 卡芯片将数据组织为链路层类型并添加填充位和 CRC 校验送到网络同样,CPU 查询 ISO 的数据, 当有数据来到后,读取接收到的数据帧。读数据时,CPU 依次读地址 300H,301H,300H,301H。 五、实验步骤 (1)新建一个工程名为 TFTP,并新建源文件、输入代码,设 置好工程编译生成目标代码; (2) 硬件连接:用串口线将 PC 机的 COM1 与实验箱的 UART1 连起来,再用交叉网线将 PC 机的网口与实验箱的网口连起来,最后插上 12V 电源; (3) 下载、调试并运行; (4) 结合实验内容和原理,观察实验现象,实验结果应该可以通过 TFTP 实现文件的下载; (5) 完成实验练习题。 CS8900A 初始化函数 int board_eth_init(void) 功能说明:用来设置 CS8900A 的 MAC 地址和工作模式。 主要代码如下: int board_eth_init(void) { int r; bIsPacket = FALSE; DBGMSG("CS8900_Initial\n"); //输出调试信息 DBGMSG("CS8900 Mac Address: %x:%x:%x:%x:%x:%x\r\n", EmacAddr[0], EmacAddr[1], EmacAddr[2], EmacAddr[3], EmacAddr[4], EmacAddr[5]); //设置物理地址 r = -1; do { if (!CS8900_Probe(IO_BASE_ADDR, 0)) //检测 CS8900,获得相关信息 if (!CS8900_Reset()) //复位 CS8900 if (!Init((U16 *)EmacAddr)) break; //初始化 CS8900 r = 0; 第 55 页 共 58页 嵌入式技术及应用 } while (0); return r; } CS8900A 接收数据函数 int board_eth_rcv(unsigned char *data, unsigned int *len) 参数说明: *data :指向数据缓冲区的指针 *len :数据包的长度 功能说明:用于接收数据,将该数据包上传给 IP 层。 主要代码如下: int board_eth_rcv(unsigned char *data, unsigned int *len) { int r = -1; if(CS8900DBG_IsReceivedPacket()) { //判断是否是需要接收的包 U16 size; bIsPacket = FALSE; size = RcvPkt((char *)data, 1532); //CS8900 接受包 *len = size; r = 0; } return r; } CS8900A 发送数据函数 int board_eth_send(unsigned char *data, unsigned int len) 参数说明: *data :指向数据缓冲区的指针 len :要发送的数据包的长度 功能说明:主要用来将上层传过来的数据 包发送出去; 主要代码如下: int board_eth_send(unsigned char *data, unsigned int len) { return TransmitPkt((char *)data, len); //用来发送数据包 } 主函数 Main 功能说明:用来通过 TFTP 协议从网口下载数据 主要代码如下: /******************************************************************** Function name: Main Parameter : void Description : 初始化系统,串口,并调用 TFTP 网络传输实验函数 Return : void Argument : Autor & date : *******************************************************************/ 第 56 页 共 58页 嵌入式系统及应用 void Main(void) { BoardInitStart(); //系统初始化,MMU 初始化 SystemClockInit(); //系统时钟初始化 MemCfgInit(); //设置 NAND FLASH 的配置寄存器 PortInit(); //S3C2410 的 GPIO 初始化 SerialSwitch(0); //选择串口 0 SerialChgBaud(115200); //波特率 115200 while( 1 ) { printf("FS2410P TFTP Test,please Enter 'ESC' to exit\n"); NetLoadFile(0,0,0,0); } } 上面主要介绍了几个与 CS8900 相关的函数,关于 IP 包处理函数,IP 包接收和发送函数, UDP 包接收和发送函数,TFTP 包处理和接收函数的详细代码在该例子相关源代码文件中。 上面是关于该实验涉及到的部分函数,完整的代码请看光盘目录的 exp 文件夹下相应实 验 的工程目录。 第 57 页 共 58页
本文档为【嵌入式技术及应用-实验资料】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_833902
暂无简介~
格式:doc
大小:884KB
软件:Word
页数:80
分类:
上传时间:2018-03-09
浏览量:27