目录实验一 ADS环境及超级终端使用 2实验二 ARM的串行口实验 14实验三 键盘输入及数码管显示驱动 23实验四 ARM的A/D接口实验 30实验五 D/A接口实验 35实验六 LCD的驱动控制实验 39实验七 触摸屏驱动实验 47实验八 BootLoader 实验 54实验九 Linux开发环境的建立(ARM9) 58实验十 Linux下串行端口程序设计 66实验十一 Linux下LED设备实验 76实验十二 Linux下多线程应用程序设计 81实验十三 Linux下按键实验 92实验十四 电机控制实验 97实验十五 UDP通讯实验 107实验十六 基于ARM的多通道仪表数据采集实验 115实验十七 简单嵌入式WEB服务器实验 118实验十八 Bootloader下实现Flash的读写 129实验十九 Uclinux系统IP地址的修改和保存 130实验二十 BOOTLOADER、内核根文件系统实验 131实验二十一 图形界面应用程序设计 132实验二十二 基于Web的远程控制设计 133附录:嵌入式系统设计性实验要求 134实验一 ADS环境及超级终端使用一、实验目的熟悉ADS1.2 开发环境,学会ARM 仿真器的使用。
使用ADS 编译、下载、调试并跟踪一段已有的程序,了解嵌入式开发的基本思想和过程二、实验内容本次实验使用ADS 集成开发环境新建一个简单的工程文件,并编译这个工程文件学习ARM 仿真器的使用和开发环境的设置下载已经编译好的文件到嵌入式控制器中运行学会在程序中设置断点,观察系统内存和变量,为调试应用程序打下基础三、预备知识C 语言的基础知识、程序调试的基础知识和方法四、实验设备及工具(包括软件调试工具)硬件:ARM 嵌入式开发板、ARM7TDMI 的JTAG 仿真器、PC 机Pentium100 以上软件:ADS1.2 集成开发环境、仿真器驱动程序五、实验步骤1)建立工程(1)运行ADS1.2 集成开发环境(CodeWarrior for ARM Developer Suite)选择File| New…菜单,在对话框中选择Project,如图1B-1 所示,新建一个工程文件图中示例的工程名为Exp6.mcp 点set…按钮可为该工程选择路径如图1B-2 所示,选中CreatFolder 选项后将以图1B-1 中的ProjectName 或图1B-2 中的文件名为名创建目录,这样可以将所有与该工程相关的文件放到该工程目录下,便于管理工程。
在图1B-1 中工程模板列表中的44B0 ARM Executable Image 是专为本嵌入式开发板设置的工程模板,后文有具体说明在此也可选择ARM Executable Image 通用模板图1B-1 新建工程图 1B-2 保存工程(2)在新建的工程中,如图1B-3 所示,选择Debug 版本,使用Edit | Debug Settings 菜单对Debug 版本进行参数设置源码网整理:)图 1B-3 选择版本(3) 在Debug Settings 对话框中选择Target Settings 项,如图1B-4 所示在Post-linker 一栏中选择ARM fromELF 图1B-4 Target Settings (4)在Debug Settings 对话框中选择ARM Linker 项,如图1B-5在Output 选项卡的Simple image 框中设置连接的Read-Only (只读)和Read-Write (读写)地址地址0x0c080000 是开发板上SDRAM 的真实地址,是由系统的硬件决定的;0x0c200000 指的是系统可读写的内存地址也就是说, 在0x0c080000∼0xC1fffff 之间是只读区域,存放程序的代码段,在0xC200000 开始是程序的数据段。
图1B-5 设置连接地址范围图1B-5 所示的设置只是一种简单设置,如果程序需要用到标准C 库函数的话需要按图1B-6 进行连接地址的设置标准C 中如果使用malloc 及其相关的函数,需要使用系统的堆(Heap) 空间,可以通过scatter 文件来描述系统HEAP 段的位置针对44B0 开发板,把程序的入口定位在0xc080000, 并定义scatter 文件为scat_ram.scf 在图1B-6 中选择LinkType 为Scattered, 输入scatter 文件名scat_ram.scf ;然后切换到Options 选项卡在Image Entry Point 框中输入0xc080000 也可以在图1B-6 的Command Line 框中直接输入-entry 0xc080000 -scatter scat_ram.scf 进行上述设置图1B-6 通过scatter 文件设置连接地址提示:1.程序移植到ADS 后,程序最开始首先执行用汇编写的初始化代码——包括中断向量和内存空间的初始化在该段代码中使用IMPORT __main ;注意main 前面是两个下划线B __main 进行系统内部的标准C 函数初始化,然后调用用户在C 中定义的main()函数(注意:两个main 都是小写),并且在嵌入式应用中用户C 的main 函数中不能有参数(int main(void))。
2. 不能有系统定义的软中断,在汇编中可以使用IMPORT __use_no_semihosting_swi来检测,在C 中使用#pragma import(__use_no_semihosting_swi) // ensure no functions that use semihosting 3. scatter 文件内容如下,创建了一个RAM_LOAD 的程序和数据的装载区域,起始地址0xc080000 RAM_LOAD 0xc080000 { RAM_EXEC 0xc080000 {44binit.o (init, +First) * (+RO) } RAM 0x0c200000 { * (+RW,+ZI) } HEAP +0 UNINIT {heap.o (+ZI) } STACKS 0xc7ff000 UNINIT { stack.o (+ZI) } ISR_STARTADDRESS 0xc7fff00 ;SDRAM bottom { isr_address.o (+ZI) } } 在图1B-7 中说明了这个装载区域的划分图1B-7 程序和数据装载区域的划分4. 定义retarget.c 函数,重新定位标准C 库中stdio 的一些相关函数。
主要有:struct __FILE { int handle; /* Add whatever you need here */}; FILE __stdout; //文件的定义int fputc(int ch, FILE *f)//fputc 函数int ferror(FILE *f) //ferror 函数void _sys_exit(int return_code) //系统退出函数void _ttywrch(int ch) __value_in_regs struct __initial_stackheap __user_initial_stackheap(unsigned R0, unsigned SP, unsigned R2, unsigned SL)// 用户的堆空间和栈空间函数具体定义,可以参考init/retarget.c (5)在第(4)步中如果不选择简单的连接地址设置,则需按图1B-8 所示设置C 编译器在Debug Settings 对话框中选择ARM C Compiler 项,在ATPCS 选项卡中选择ARM/Thump interwork, 或者在命令行中添加-apcs /interwork 。
图1B-8 设置ARM C Compiler (6)在Debug Settings 对话框中选择ARM Linker 项,如图1B-9在Layout 选项卡的Place at beginning of image 框中设置程序的入口模块指定在生成的代码中,程序是从44binit.s 开始运行的Object 设为44binit.o,section 设为init 图 1B-9 设置入口模块(7) 在Debug Settings 对话框中选择ARM fromELF 项,如图1B-10 在Output file name 框中设置输出文件名为system.bin, 这就是要下载到开发板的嵌入式应用程序文件图1B-10 设置输出文件名(8) 回到如图1B-3 所示的工程窗口中,选择Release 版本,使用Edit | Release Settings 菜单对Release 版本进行参数设置9)参照第(3)、(4)、(5)、(6)、(7)步在Release Settings 对话框中设置Release 版本的Post-linker、连接地址范围、入口模块和输出文件10)回到如图1B-3 所示的工程窗口中,选择Targets 选项卡, 如图1B-11 所示。
选中DebugRel 版本,按Del 键将其删除DebugRel 子树是一个折衷版本,通常用不到,所以在这里删除图 1B-11 删除DebugRel 版本(11)设置完成后,可以将该新建的空工程文件作为模板保存以便以后使用将工程文件名改为44B0 ARM Executable.mcp 然后在ADS1.2 软件安装目录下的Stationery 目录下新建名为44B0 ARM Executable Image 的模板目录,再将刚设置完的44B0 ARM Executable.mcp 工程模板文件存放到该目录下即可这样以后新建工程的时候如图1B-1 所示就能看到以44B0 ARM Executable Image 为名字的模板了提示:1. 建议用户直接将光盘Stationery 目录中的44B0 ARM Executable Image 子目录和44B0 C lib ARM Executable Image 子目录直接拷贝到ADS1.2 安装目录下的Stationery 目录中,这样也能在图1B-1 所示的新建工程对话框中看到这两个模板,其中具有已经设置好的针对本开发板的参数注意前者的ARM Linker Linktype 设置为Simple, 而后者设置为Scattered, 推荐使用后者,请参阅第(4) 步内容。
2. 如果用户原来已经安装了ARM SDT 软件的话,再安装ADS1.2 后可能导致ARM SDT 不能正常使用,需要用户更改系统环境变量:ARMINC 设置为%ARMSDTPATH%\INCLUDE,ARMLIB 设置为 %ARMSDTPATH%\LIB ,其中%ARMSDTPATH% 指ARM SDT 的安装目录12)新建工程后,可以执行菜单Project | Add Files 把和工程相关的所有文件加入到工程中ADS1.2 不能自动按文件类别对这些文件进行分类,需要的话用户可以执行菜单Project | Create Group 创建文件组,然后分别将不同类的文件加入到不同的组,以方便管理如图1B-12 所示更为简单的办法是,在新建工程时ADS 创建了和工。