1、1如何配置 K e i l 51 开发环境V 1.0 2007-8-20我们将使用 C yp r e ss 提供的固件框 架 来一步 一 步说 明 如何使用 K e il C 51 来建立我 们 的工 程,如何配置 工 程并编 译 出我们 想 要的 h ex 文件,以及 如 何通过 C yp r e ss 提供的 h e x2b i x.e xe 程序将 h ex 文件转换为 iic 格式的文件。一安装 必 备软件1 首先确定你 安 装了 光 盘提供的 K e il u V is io n2 安装程序 , 这个破 解 的程序 编 译出来 的 代码大小没有限制。如果你没有安装 K e il u
2、V is io n2 ,那么在安装EZ-US B_d e v to o ls _v e r s io n _261700.e xe 时会提示安装 一 个有限制 版 本的 K e il C 51,这个 K e ilC 51 程序将限 制 你编译 出 来的文 件 最大 4K 字节。2 然 后 确定安 装了 EZ-US B_d e v t o o l s _v e r si o n _261700.e xe 。 安装之 后 , 在 安 装目录 下 你会看到 C y p r e ss U SBT a r g e t Fw Fx2 目录,这个目录 下 的 文 件就是 C yp r e ss 提供的固件框
3、架程序。如果你用过 VC 的向导 生 成过 M FC 的应 用程 序的话 ,这个框 架有 点类似于 M FC 的框架,标准的 USB 通 讯命令的响应, 以及 对重 枚举的 处理,程序的流程以及 中断的声明 已经搭好了,剩下的 就 是你在 这个流程中 合适的 地 方加入你 自己 的代码, 根据 你的设备属性 修改 配置信息等就行了。关于框架的 详细 说明 请 见另一节“ FX2 框架程序详细注释“。二建立 K e il u V is io n2 工程安装了必 备 的工具 后 ,我们就可以建立和编译 我 们 的 工程了!1 我们在 D 盘下建立一个 U SB_PROJE CT 目录,然后建立一个
4、 SRC 子 目录,将C y p r e ss US BT a r g e t Fw Fx2 目录下的所有.C 和. A 51 文件拷贝到 D :US B_PROJE C T SRC目录下。(也就是将 d s c r .a 51, f w .c , p e ri ph .c 考过来)。2 启动 K e il u V is io n2 程序。选择 Pr o j ectNew Pr o j e ct出现如图一所 示的对话框:图一:创 建 一个新 工程 f w .uv 2注意,我 们 将我们 的 工程保存到 d :u s b_ p r o j e ct 目录下,这样 工 程的结 构 比较清晰。点击保
5、存之后,出现入图二所 示的 对话框,提示 我们 选择目标板上我们使用的 C PU ,这里我们选2择 C p r e ss Se m icond u c t or 数 下的 E Z-US B FX2(C Y7C 68XXX)即可。图二:选择 C PU然后我们 会 看到入 图 三所示 的 提示, 提 示我们是否将标准的 8051 启动 代码 拷贝 到工 程 目录并将代码 文件 加入 工程:图三:提 示是否将 s t ar t up .a51 加入工程中实际上就是问你是否加入 ST A RT U P.A 51 文件到你的工程中 , 这个 文 件是一 段汇 编代 码 ,会在程序复位之后首先执行,进行堆
6、栈及内存的初始化等工作,然后将程序指针跳转到你的m a in 函 数处执行你的代码。如果你不想修改这段 初 始化程序,你就不用加了 。这里 我们选择“否“。这样 在程序复位之后 , 在你的 m a in 函数执行之前 ,会执行 默认的启动 代 码 。 我想这个就是 b oo t l o a d er 吧。这时,我 们会发现在 d :u s b_ p r o j e ct 目录下会生成 一个 f w .uv2 的文件,K e il u V is io n2 的工程文件的扩 展名为 .uv2, 他管理整个工程中的文 件 以 及 配置信息。3 将代码文件加入到 工程中。 默认情况下, 新创 建的 工
7、 程在 K e il u V is io n2 中的 结构如图四所示:3图四:新 工 程的结构我们可以理解为 T a r g e t 1 为你的工程名, Sou rc e Gr o u p 1 为你为代码所作的分类夹,我们可以通过先 选择,再 点击 一下名 字 ,这 两 个 名 字 都 可 以 处于编辑 状态 , 我们可 以 将这两个名字改为我们 更 舒服的名字,这里我将 T a r g e t 1 改为 Fi r m w are, So u r ce Grou p 1 改为 s rc,如图五所示:4图五:更改工程树这时我们选择 s rc 文件夹,点击鼠标右键,出 现 如 图 六 的画面,并选
8、择 A d d Fi l e s to Gro up s rc:5图六:添加文件到 s rc 组中在弹出如图七所示的对话框 之 后,选择所有 s rc 目 录下面 我们 拷贝 过来 的 文件 ,并 点击A dd按钮,然后关闭此 对话 框, 文 件就添加到了工程 Fi r m w are 的 s rc 组里面 了, 见图八所示:图七:添加 s rc 目录下面的源文件图八:源 文件 加入 到 工程的 s rc 组中注意: s rc 组和 s rc 目录不一 定要 同名,不同名也可。 Src 组只是 K e il u V i s i on 管理项目的组织形式,而 s rc 目录是你自己组织你的代 码
9、的形式, 两者没什么关系。三设置 编译 环境6我们应该 知道 ,要 想 编译一个源文件 ,必 须 告诉 K e il u V is io n2 编译器用什么 编译器,连接器用什 么 , 编 译 文件所需要的头 文 件,库文件等编译器要到哪里去找到 。这 些 对于所 有的开发 软件都 会 有这个要求。好多网友编译不 出 程序,都是这些设 置 没有设置好,或者不 了 解编译和联接的流程而出现的问题。再有 就 是编译 程 序并不一定需要用 IDE 环境来编译,直接写一个批 处理 文件,直接调用 编 译程序,连接程序 也可,但需 要 了解指令的参数。但可以参考一些 .BAT 文件来编写。实际上 C y
10、p r e ss 提供的每一个例程都有一个批处理文 件 来编译程序。但在编 译之前,你 可 能 也 需要修改一下相关的设置以使路径以及一些设置符合你的要求才能编译 出 代码。这里我们只介绍在 K e il u V is io n2 中 的编译环境设置。首先 K e il u V i s i o n2 需要 知道编译器,连接器 在那里, C 51 程序 以及 A 51 程序所用的 标准头文件及库文件在那里。对于安装了 K e il u V is i on2 之后,那么编译,连接所需要的程序在C:K e ilC 51Bin 目录下(假设我安 装在 C 盘根目 录下),头文件 会在 C:K e il
11、C 51Inc 目录下,库文件在 C:K e ilC 51lib 目录下,对于 我 们这个 工程 ,我们用到了 C yp r e ss 提供的头文件以及库文件 , 我们也 要 将这些 文 件的路径告诉 K e il u V is io n2 。 那么我们这个 工 程用 到了 哪些头文件和库 文件 呢? 我 们用到了 f x2s d l y .h, f x2.h, f x2re g s .h 这三个头文件和 一个 e z u s b.lib 库文件以及 一个 C yp r e ss 已经写好的 US BJm p T b.a51 的中断向量定义文件,接下来我 们 为了更清晰的组织我们的 程 序,我
12、 们在 d :u s b_ p r o j ect 目录下创建两个 文件夹,分别是 i nc 和 lib,然后我们到 EZ-US B_d e v to o ls _v e r s io n _261700.e xe 安装的目录下找到 e z u s b.lib 拷贝到 lib 目录下 ,将 f x2s d l y .h, f x2.h, f x2r e g s .h 拷贝到 i nc 目录下 ,并且将 US BJmpT b.a51 文件拷贝到我们之前的 s rc 目录下。回到 K e il u V is io n2 应 用程序,在Fi r m w are 工程树下加入一个 lib 组,右键点击
13、 Fi r m w are,选择 T a r g e ts , Gr o u p s , Fi l es如图九所示:图九:添 加新组弹 出如图十的对话 框 之后,选择 G r o u p s /Add Fil es 页面,输入 lib,电击 A dd,再点 确定 ,这样在 Fi r m w are 树下会增加一个 lib 组 ,如图十一所 示。7图十:添加 lib 组图十一:lib 组添加后, Fi r m w are 工程树然后按照上面添加 SRC 组 文 件的方法 ,将 US BJm p T b.a51 文件添加到 s rc 组里 ,将 e z u s b.lib添加到 lib 组里。添加
14、 之 后的工程树如图十二所示:8图十二: 工程树和文件组Lib 文件要添加到工 程的组里,而 .h 文件可以在 工程设置里指定 路径就行了。进行 如下操作来设 置工程中引用的头文件的位置, 选择 Pr o j ectFil e Ex t e n s io n s , Bo o k s a nd En v i ron m en t打开 如下 对话 框, 见图十三, 选择 Env i ron m e n t Se tup 页面,在 INC Fo l d er 栏 的后面添加一个 i nc, 注意需要用 ; 隔开,由于 i nc 就在工程目 录 下,所以直接用 i nc 就行,或者输入完整 路径也
15、行(d :u s b_p o r j e c t i nc), 点击确定按钮,完成环境变量设置。9图十三:设置环境 变量理论上讲,完 成以上设置,你就可以编 译 程序了。但 编 译之前为 了 我们的 文件 组织 结 构清晰,我们设置 一 下编译 之后输 出 的 文件夹 , 我们在 d :u s b_ p r o j ect 目录下再创建一个 o bj 文件夹。选择 Pr o j ectOp t i on s fo r T a r g e t Fi r m w are菜单,见下图:点击 Se l ec t Fo l d e r f o r Ob j ec ts 按钮,选择 O u t p ut
16、页面,见下图:10选择 o bj 文件夹,点击 ok 按钮,见下图:可以为输 出的 h ex 文件改名,这里我们默认为 fw, 选择 C r e a t e HEX File ,这样我们 编 译之后会得到 一个 f w .h ex 文件,见下图所示:。11用以上的方法 , 我们再创建 一个 lst 文件夹 ,将 listi ng 页面的输 出 文件设置输出到 lst 文件夹下。如下面几幅图所示:12OK,我 们 的工程基本设置完成了。但是连 接 器需要 根据 我们指 定的 数据存储区以 及 程序存储区来定位 我 们编译 出来中间文 件,所 以 我们还要给 工程设 置一下与硬件相关的内容。四设置
17、 程序存 储区和数据存储区我们知道, Fx2 内部有一个 增 强型的 8051 核 , 这个 8051 内部有有 128 字 节的直接寻 址空间(0-0x7F),有 128 字节的间接寻址 空间 (0x80-0xFF ),还有 128 字节的寄存器空间(0x 800xFF),由于间接 寻 址空间 与寄存器空间地址重叠,但 如 果在高 128 字节用直接寻址, 那么他会自动取寄存器 空间的地址。 8051 的外部, f x2 的内部从 0x00000x1FFF 空间的 8K 字节 (8192 字节)的 Ram 空间可用来存储程序 和 数据, 0XE000-0XE1FF 的 0.5K 字节(5 1
18、2 字节) r am 空间只能用来存储数据,其余的 RAM 是 FX2 已经定义好的寄存器空间 和保 留空间,这些空间有的可 读写 ,有些是只读 的,具体的操 作需要读 FX2 的寄存器手册 。这 些内容都要告诉编译器和 连 接器, 以 使编译 出 来的代码能正确的放到正确的地址。选择工程 Fi r m w are 并点击鼠标右键 ,在 弹 出的 菜单中 选择 O p ti o n s fo r T a r g e t Fi r m w are打开工程设置 对话 框, 如下 图所示:13工程设置 对话框我们首先进入 T a r g et 页面。1在 M e mo r y Mo d el 中有三
19、 项内存模式的选择:Sm a ll:变量存储在内部 r am 里;Co m pa c t:变量存储在外部 ram 里,使用页 8 位间接寻址;La r g e:变量存储在外部 Ram 里,使用 16 位间接寻址。一 般 我们选择 S m a ll 内存模 式 。这 样 我 们定义的 变量编译器会根据内存的 使用 情况尽可能分 配到 FX2 中 8051 内部的 Ram 空间,如果 8051内部的 Ram 空间不够了,才会分配到 FX2 内部,8 051 外部的 Ram 空间。142在 C o d e Ro m Si ze 中也有三项用于选择程序 空间的 尺寸:Sm a ll: 适用于某 些只有
20、 2k 代码空间 芯片 , 这样跳转地址只在 2k 范围内 ,编 译的时候会使用 A C AL L A JMP 这些短跳转指令, 而不会使用 LC A LL,LJMP 指令 。 如果你 的 代码跳转超过2k,那么会出错。C o mp a ct:表示每个子函数 的 程序大小不超过 2k,整个工程可 以有 64k 的代码。就 是 说在m a i n ()里可以使用 LC A LL, LJMP 长跳转指令,但在子 程序里只 会 使用 A C A LL, A JMP 指令.除非你确认你的每个子程序不会超过 2 k,否则不 要用 C o mp a ct 方式 .La r ge:表 示程序或子函数都可以
21、大到 64k。 使用 c od e ba nk 还可以更 大 。通常 我们都选用该方式. C od e Ro m Si ze 选择 La r ge 方式 速度不会比 Sm a ll 慢很多,所以一般没有必要选择C o mp a ct 和 Sm all 的方式。我们这里选择 La r ge 方 式。3O p e ra ti ng 用 于选择操作系统,我们选择 None 即可。O f f -c h i p Co d e M e m ory 用于指定目标硬件上的所有 外部 程序存储器的地 址 范围。由于我们的开发板采 用 的是 56 引脚的, 没有外扩程序和数 据存储器功能 , 这个地址是相对于 8
22、0 51 外部的,也就是 FX2 内部的。根据 6801 3-56AC 的硬件特性,我们可 以 确定起始地址为: 0X0000,程序存储器大小为: 0X2000(即 8K 字节)4 O f f -c h i p Xd a t a M e mo ry 用于指定目标硬件上的所有 外部 数据存储器的地 址 范围 。 我们根据上面对 68013-56AC 存储器 结构 的 说明,可以确定起始地址为:0 XE000,数据存储器的大小为: 0X0200(即 512 字节)。点击确定 按钮 ,工 程的所有设 置就完 成 了。这 时 我们可以通过 F7 键或 通过菜单 Pr o j ectBu i l d T
23、 a r g et 来编译程序,如下图所示:编译程序编译完成 后 ,你会在 Bu ild 信息栏中看到:15Bu i l d t a r g e t Fi r m w ar e a ss e m b l in g d s c r .a51.c o m p i li ng fw .c .c o m p i li ng p e r i p h .c .a ss e m b l in g U SBJmpT b.a51.li n k in g .Pro g ra m Si z e : d a t a=43.5 x d a t a =4464 c od e =2003c r e a ti n g h e
24、 x f il e f ro m “.o b j fw “.“.o b j fw “ - 0 Err o r(s ), 0 W a r n i n g (s ).表示编译成功 , 这 时 你会在 d :u s b_ p r o j ec t o bj 目录下看到 f w .h ex 编译出来的文件 , 这 个文件就是我们 要下载到 f x2 的 ram 中执行的固件程 序。关于 如何下载 f w .hex 文件,请看另一节“如何通过 E Z-US B Co n t r o l Pa n el 下载和烧写 程序 “的详细说 明。以后我们所有的例程都是以同样的方式组织以 及 配 置,所 以这一节必
25、须严格按照说明 一 步一步进行。五编译完成后,在 u V is i on 软件中设置将 HEX 文 件 转为 IIC 文件。我们如果 想 将我们 编 译出来 的 固件下载到外部 EEPROM 中,用 EZ-US B C o n t r o l Pan el 是不能直接使用 H EX 格 式的文 件 的,我们必须通过 一个 C y p r e ss 提供的 h e x2b i x.e xe 的软件将h ex格式的文 件 转换为 iic 格式的 文 件 。这部分的细 节 说 明如果想 了 解一下,可参 考“ H EX 文件下载细节 “,“ H EX 转为 IIC 文件细节 “。 u V is i
26、on 的工程设置中,允许我们在编议完成后执行一个外部 程 序,我们可以通 过 这个设 置 ,来完 成 将 我 们的 f w .h ex 转换为 f w .i ic 文件。打开工程设置,并 选择 O u t p ut 页面, 请选择 Run U s e r Pro g ra m #1 选项,并且在右边 的编辑栏填入需要执行 的 程序:16这里我们输入:c :cy p r e ss u s b bi n h e x2b i x -i -f 0xC 2 -o o b jf w .i i c o b jf w .h e xc :cy p r e ss u s b bi n h e x2b ix 是执行
27、 程序的完整 路径 ,后面的是给他的参数。-I 表 示我们要得到 iic 文件的输出-f 0xC 2 表示 iic 文件为 0xC2 模式加载 的固件-o 后面 跟着的就 是要输出的 iic 文件的名称和路径没有带- 开始的参数 就是 我 们要转 换的 h ex 文件,这里是 o b jf w .h ex 文件。具体的转 换 过程请看“H EX 转为 IIC 文件细节 “一 节。这时再重新编 译 ,你就会得到两个文件,一个 f w .h ex ,一个 f w .iic 。这时请参考“ 如 何 通过 E Z-US B C o n t r o l Pa n el 下载和烧写程序 “来 使 用这两 个 文件。