|
运行Hello World程序
|
PC机系统配置要求:WIN7-64BIT、WIN10、WIN11 |
人们认识世界的过程总是从感性上升到理性。所以在具体了解学习板的相关资料之前,先跑几个简单的演示例程,有助有我们对这款学习板形成一个基本的概念。 |
以下,以一个简单的 Hello World 例程来演示如何使用学习板调试单片机程序,如何建立一个新的应用程序工程,以及如何把调试好的程序下载到单片机中运行。 |
|
4、实验板的单片机中已安装调试代理程序。如未安装,需先行安装,方法参见:安装调试代理程序。 |
1. |
点击 这里 下载 Hello World 范例工程。 |
2. |
解压后,双击 demo.uvproj 文件,用 Keil uVision 打开该工程。 |
3. |
在 [Project] 窗口中,右键点击 [APP] 条目。在弹出的菜单上选择 [Optios for Target 'APP'...] 命令。 |
4. |
在弹出的对话框中选择 [Debug] 页,然后点击右上角的 [Setting] 按钮。 |
5. |
在弹出的对话框中,修改 [Port] 设置。将通信口改为学习板所对应的通信口号,然后点击 [OK] 按钮。实验板所对应的通信口号可在 Windows 的设备管理器中查看,参见:安装 CH341C 驱动挰序。注意:不要改变 [Baudrate] 的设置。 |
7. |
点开 [Project] 菜单,选择 [Rebuild all target files] 命令,重新编译工程。 |
8. |
点开 [Debug] 菜单,选择 [Start/Stop Debug Session] 命令,启动调试工具。 |
9. |
经过短暂的程序下载过程之后,进入到调试界面。程序停留在 main 函数的第1行语句处,也就是 C 语言的入口处,等待进一步的调试指令。 |
10. |
通常来说,对 C 语言的运行指令有断点运行和单步运行。单步运行又分为 Step Into、Step Over、Step Out,它们的区别主要体现在函数的调用上,对于非函数调用语句,它们作用是一样的。先试一下单步功能。点击 [Step Into] 按钮,程序指针前进了1行语句。 |
11. |
再来尝试一下Step Over 指令。点击 [Step Over] 按钮,程序指针又前进了1行语句。因为这几行语都不是函数调用语句,所以两种单步指令效果相同。 |
12. |
双击第23行左侧的黑边处,在这里打一个断点。注意,没有黑边的行是打不了断点的。这样的行,要么是空白行,要么是注示行,或者是被优化掉的行,总之是没有对应的机器指令的行。点击 Run 按钮,程序连续执行了若干行后停在了断点处。这一运行过程就是断点运行。 |
13. |
第23行是一个子函数调用语句。再次点击 Step Into 按钮,程序进入了子数内部,停在了子函数体的第1行语句。顾名思义,Step Into 的作用是单步进入子函数。 |
14. |
这时,我们可以点击 Step Out 按钮。程序停在第24行,上1行刚好是 Step Into 指令进入的子函数。所以,Step Out 指令的作用是跃出子函数。 |
15. |
点击 Step Over 按钮,程序停在了第25行。和 Step Into 不同的是,程序没有停在子函数内部,而是直接跃过的子函数。所以,Step Over 指令的作用是跃过子函数。 |
16. |
再次点击 Run 按钮,程序全速运行起来。因为一路没有遇到断点,所以程序没有再停下来。学习板上的 LED 数码管和 LCD 显示屏都在显示计数信息,LED 以16进制显示,LCD以10进制显示。 |
17. |
这时,点击 Stop 按钮,程序停在了当前待执行的行,学习板上的显示信息也随之静止了下来。 |
18. |
在 Disassembly 窗口可以查看到反汇编出来的机器指令,以及和源程序对应的关系。当前程序停留的地址是 0x2046,对应的指令是 MOV A,timer(0x1D)。 |
19. |
用鼠标点一下 Disassembly 窗口的标题栏,选中 Disassembly 窗口。然后,点击 [Step Into] 按钮,程序前进了一条指令,停在了地址 0x2048,此处对应的指令是 SUBB A,#T2CON(0xC8)。说明在反汇编窗口,单步指令执行的是一条机器指令,而不是一行 C 语言语句。 |
20. |
我们可以点击一下地址0x2079所在行左侧的黑边,打一个断点。然后点击 [Run] 按钮,程序执行了若干条指令后,停在了断点处。说明在反汇编窗口内也可以断点运行。 |
21. |
在地址0x2079处,对应的指令是一条 LCALL 指令,也就是子程序调用指令。我们点击 [Step Over] 按钮,程序停在了地址0x207C,也就是 LCALL 指令返回的地址。说明在反汇编窗口内,Step Over 指令同样起到跃过子程序的作用。 |
22. |
我们点开 [View] 菜单,向下找到 [Watch Windows] 选项,进而找到下一级菜单中的 [Watch1] 选项。点击打开 [Watch1] 窗口。 |
23. |
在 [Watch1] 窗口内有一个表单。表单内有一个标注为 [Enter expression] 的表格。双击这个表格,输入 x,然后敲一下回车键。表单随之新增一行,而标注 [Enter expression] 移到了新增的一行中。我们继续同样的方式输入 y 和 z。于是,我在表单中就看到了变量 x、y、z 的当前值。 |
24. |
我们点开 [View] 菜单,向下找到 [Memory Windows] 选项,进而找到下一级菜单中的 [Memory 1] 选项。点击打开 [Memory 1] 窗口。 |
25. |
在 [Memory 1] 窗口的 Address 栏内,;输入 D:0x00,然后敲击 [Enter] 键。随之,在 [Memory 1] 窗口内列出了,以 0x00 为首地址的内存空间的数据。我们不好验证所显示的这些内存单元的数据是否真实,但是前8个单元比较好验证,因为它们刚好对应寄存器 R0 ~ R7 的值。对比一下旁边的寄存器窗口中的 R0 ~ R7 的值,刚好符 [Memory 1] 窗口中前8个单元的值。在这里,D:0x00 中的 D 表示内部数据存贮器。如果换成 X 则表示外部数据存贮器,而 C 则表示程序存贮器。 |
|
以上各步展示了常用的调试方法,还有很多功能不一一列举。当然,只要硬件系统及调试代理对 Keil uVistion 有良好的支持,这些调试功能,也同样适用于其他的51单片机系统,因为这些功能都是 Keil uVision 所提供的。所以,通过学习板所掌握的调试方法并不局限于在这款学习板上使用。 |
|
|
|