在 Keil MDK 中调试 AT91SAM9260... 2 一 初识 Keil MDK... 2 二 在内部 RAM 中调试... 3 三 在片外的 SDRAM 中调试... 7 四 从 Norflash 启动运行... 8 五 从 Norflash 启动, 最终运行在 SDRAM 中... 10
在 Keil MDK 中调试 AT91SAM9260 我们板子的配置是 at91sam9260+norflash+sram, 而一般 9260 外扩的都是 SDRAM, 所以后来我又写了个 SDRAM 的例程, 运行在我们的开发板上 所以我们的硬件环境是 : 编译工具 :Keil MDK3.22a; ARM:at91sam9260; Norflash:sst39vf1601,2Mbytes, 地址 :0X10000000~0X101FFFFF; SDRAM:Hy57V561620*2,64Mbytes, 地址 :0X20000000~0X23FFFFFF; 一 初识 Keil MDK 使用 Keil 开发过 51 的肯定对 Keil 不陌生, 而且很多资料上都介绍了怎么新建一个项目, 所以我就不多说了, 主要说一下 Keil 中对 ARM 开发很方便的一个地方 :Components Environment Books, 新建一个 project 后, 点击 Project/Manage, 再点击 Components Environment Books, 或者直接点击工具栏中的三种颜色的品字形标志 图 1-1 打开 Components Environment Books 打开之后是图 1-2 所示, 我们主要使用第一项 Project Components 由于 ARM 启动方式多种多样, 还可以在片内或片外 RAM 调试, 而不同的方式对应的 target/options 选项也不同, 所以我们可以根据调试环境的不同, 建立不同的 Target 图 1-2 Project Components 我们 At91sam9260 的板子, 既可以在内部 RAM 调试, 也可以在外部 SDRAM
调试, 既可以从 Norflash 启动运行在 Flash 中, 也可以从 Norflash 启动并将代码拷贝到 SDRAM 中运行, 所以我们可以通过图 1-1 所示的编辑工具, 建立四个 Target, 如图 1-3 所示 : 图 1-3 建立 Target 然后在 Keil 的工具栏中就可以通过点击下拉框来选择不同的 Target, 如图 1-4 所示 : 图 1-4 选择 Target 这几种不同的 Target, 使用的文件都是一样的, 只是每个 Target 的 Options 不同, 这样我们就可以在同一个 Keil 工程下实现 ARM 的各种调试环境 下面我们将分别介绍各个 Target 中 Options 的设置, 从而实现不同的运行环境 二 在内部 RAM 中调试 首先点击图 1-4 中的 SAM9260 Int RAM, 然后在 Workspace 中右键点击 SAM9260 Int RAM, 打开 Options 对话框, 如图 2-1 所示 : 图 2-1 打开 Options 打开 Options 后, 如图 2-2 所示 :
图 2-2 Options 在 Target 页面主要设置存储器的配置, 在内部 RAM 调试的话,ROM 的地址和 RAM 的地址都要设为内部 RAM 的地址, 而当 BMS 接高时,REMAP 后, 内部 RAM 的 SRAM0 被映射为 0 地址, 所以此时 ROM 地址填 0x0 和 0X200000 都是一样的, 此时访问到的都是内部的 SRAM0 Output 和 Listing 用来设置调试信息和输出文件的存放目录, 可在项目目录下新建一个文件夹, 命名为 Int RAM User 对话框用来设置编译前后要运行的命令行, 比如说将 AXF 格式文件转化为 Bin 格式文件, 在 RAM 中调试使用默认输出的 AXF 文件, 所以此时不用设置 C/C++ 和 ASM 对话框分别用来设置 C 程序和汇编程序中的调试定义, 以及所包含的头文件目录 如图 2-3 所示,Define 行定义了 NOFPUT, 这是因为我们使用的 Dbgu.C 中有如下语句 : #ifndef NOFPUT #include <stdio.h> #endif //#ifndef NOFPUT 其中是自定义 Printf() 所需的一些函数, 而我们使用的 Printf() 是通过在 Retarget.C 中自定义 sendchar() 实现, 所以不编译其中的语句 另外, 在下面的 Include paths 中, 要添加 C 程序所有头文件即所有.H 文件的路径 也可通过点击浏览, 然后添加
图 2-3 C/C++ 图 2-4 Linker 对话框中, 我们直接选择 Use Memory Layout Target Dialog, 意思就是
直接使用 Target 对话框定义的存储器配置 当选择此项时, 系统会自动生成一个分散加载文件, 就不再自己写分散加载文件了, 否则要添加自己的分散加载文件 Debug 对话框主要是设置仿真器 添加仿真初始化文件 我们使用 DB 的 Jlink, 所以首先点击右侧的 Use 硬件仿真器, 选择 RDI Interface Driver, 然后点击 Setting, 添加 Jlink 的配置文件 如图 2-5 所示 : 图 2-5 Jlink 然后添加初始化文件, 初始化文件的作用就是初始化时钟 RAM, 为硬件建立一个启动环境, 很多程序在 RAM 中调试正常, 而直接跑在 Flash 就不对, 此时就要检查初始化文件所做的工作, 在实际的程序中又没有做, 我遇到了几次这样的毛病, 最后都检查出是实际的启动文件中忘记配置了什么东西 一般初始化文件不用自己来写, 改改例程中的就可以用了, 需要注意的两个地方 : 1. 入口地址 : 在内部 RAM 调试时,Entry = 0x00000000; 在外部 SDRAM 调试时,Entry = 0x20000000; 2. 下载 AXF 文件时, 路径和名字要修改, 例如 : FUNC void Download (void) { if (Setup & 0x20) { // <s0.80> Command for Loading exec("load Int_RAM\\Blinky.axf INCREMENTAL"); } Int_RAM\\Blinky.axf 要相应地修改为 Output 对话框定义的输出路径和名字 至此, 这个 Target 的设置就完成了, 点击 Build Target, 编译 Target, 如果没有
错误, 如图 2-6, 就可以将板子上电调试了 图 2-6 Build OK 然后上电, 点击工具栏上的 Debug 按钮, 进入仿真环境, 如图 2-7 所示, 程序运行在 SRAM0 地址中 接下来如何调试, 单步或者全速与 51 没啥区别, 就不再说了 图 2-7 Int RAM 三 在片外的 SDRAM 中调试 在片外的 SDRAM 调试与片内 RAM 调试差别不大, 主要是存储器地址范围设置和调试初始化文件的区别 : 图 3-1 SDRAM-Target
在 SDRAM 中调试, 所以 ROM 和 RAM 的地址都要设置为 SDRAM 的地址 如上图 3-1 所示 初始化文件也要相应地改为外部 SDRAM 调试的初始化文件, 如图 3-2 所示, 这个初始化文件与在内部 RAM 调试的初始化文件相比, 多了外部 SDRAM 的初始化, 另外入口地址也要变为 SDRAM 的地址 图 3-2 SDRAM Debug 其他的都跟在内部 RAM 中调试的一样设置, 同样 Build, 进入调试环境, 发现程序运行在 SDRAM 地址中, 如图 3-3 所示 : 四 从 Norflash 启动运行 图 3-3 SDRAM 这里是指 ARM 从 Norflash 启动, 程序一直运行在 Norflash 中 首先要保证你的启动代码没有问题, 因为前面在 RAM 中调试, 系统的启动都是靠初始化文件建立的, 而这里要靠正确的启动代码 同样需要修改的地方还是 Options, 首先 Target 处,ROM 地址填 Norflash 的地址,RAM 处填 SDRAM 的地址, 启动代码中一定要有 SDRAM 的初始化部分 然后 User 处添加转为 Bin 文件的命令
图 4-1 Norflash Target 图 4-2 Norflash User 另外 ASM 处, 添加启动代码中一些定义,RAM_INTVEC REMAP 将中断
向量复制到内部 RAM, 并将内部 RAM 映射为 0x0 地址 Linker 处还是选择 Use Memory Layout Form Target Dialog 图 4-3 Norflash ASM 接着,Build Target, 无错误的话, 打开生成的 Map 文件, 会看到代码段都被放置到 Norflash 地址中, 如图 4-4 所示 : 图 4-4 Norflash Map 然后将生成的 Bin 文件用 Jflash 或 h-flasher 下载到 Norflash 中, 然后将 BMS 接低, 上电后执行 五 从 Norflash 启动, 最终运行在 SDRAM 中 将程序从 Norflash 拷贝至 SDRAM 执行, 本来可以在启动代码中添加代码拷贝部分或者写两个程序实现, 但是在 Keil 中, 有两种更容易实现的方式, 编译器自动将所需的代码段拷贝至 RAM 区, 一是通过自定义的分散加载文件, 二就是接下来我们介绍的只点击鼠标的方式 第一种方法一直没能搞成功, 还请搞过的牛人指点 这个 Target 与前面运行在 Norflash 中的 Options 完全一样, 然后右键点击
Source Code, 打开其 Options, 如图 5-1 所示 : 图 5-1 Source Options 然后在 properties/memory Assignment 中将其 Code/Const 定位于 SDRAM 中, 如图 5-2 所示 : 图 5-2 CODE SDRAM
同理, 再将其他需要放置到 SDRAM 执行的程序, 进行同样的操作, 然后, Build Target, 无错误的话, 查看生成的 Map 文件, 发现这些代码段被放置在 SDRAM 空间内了, 如图 5-3 所示 : 图 5-3 SDRAM Map 至于使用分散加载文件的方式, 我还没有试验出来, 也请知道的大虾指点指点, 谢谢 至此, 使用 Keil 四种方式调试 at91sam9260 的方法都介 绍完了, 授之鱼不如授之渔, 我主要说的是方法步骤, 并没 有提供程序, 自己从中摸索确实能学到很多东西, 但是不要 像我走火入魔就行了 本人也是第一次学习 ARM, 以上如有不对的地方还请多 多指教 风子 (ch2003_23) 2009-3-24 于深圳 QQ:277565600 MSN:ch2003_23@hotmail.com