欣欣学习网,老工程师带你学习单片机技术,欢迎来坐坐。
首  页 | 学习NIOSII | 学习C51 | 学习CPLD | 51+CPLD实验板 | | | MY-RTOS

 实验板首页
 安装QuartusII软件
 安装USB-Blaster驱动
 安装CH340C驱动
 安装Keil uVision软件
 运行Hello World例程
 新建Keil uVision工程
 在Flash中运行程序
 恢复CPLD中的出厂逻辑
 安装调试代理程序
 硬件架构分析
 实现LCD驱动接口
 实现数码管驱动接口
 实现4x2键盘接口
 使用ADC采集拟量
 使用EEPROM保存数据
 使用UART通信
 红外遥控信号解码
 用作USB转232/485
 相关软件与文档


运行Hello World程序


PC机系统配置要求:WIN7-64BIT、WIN10、WIN11

人们认识世界的过程总是从感性上升到理性。所以在具体了解学习板的相关资料之前,先跑几个简单的演示例程,有助有我们对这款学习板形成一个基本的概念。

以下,以一个简单的 Hello World 例程来演示如何使用学习板调试单片机程序,如何建立一个新的应用程序工程,以及如何把调试好的程序下载到单片机中运行。

在体验这一演示之前,要做好以下准备:

1、在你的电脑上已安装有 Keil uVision 软件。安装方法参见:安装 Keil uVision 软件

2、在你的电脑上已安装好 CH340C 的驱动程序。安装方法参见:安装 CH340C 驱动挰序

3、实验板的 CPLD 出厂逻辑未被更改。如已更改,需先行恢复,方法参见:恢复CPLD的出厂逻辑

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] 的设置。

6.

点击 [OK] 按钮。

7.

点开 [Project] 菜单,选择 [Rebuild all target files] 命令,重新编译工程。

8.

点开 [Debug] 菜单,选择 [Start/Stop Debug Session] 命令,启动调试工具。

9.

经过短暂的程序下载过程之后,进入到调试界面。程序停留在 main 函数的第1行语句处,也就是 C 语言的入口处,等待进一步的调试指令。

10.

通常来说,对 C 语言的运行指令有断点运行和单步运行。单步运行又分为 Step IntoStep OverStep 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] 移到了新增的一行中。我们继续同样的方式输入 yz。于是,我在表单中就看到了变量 xyz 的当前值。

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 所提供的。所以,通过学习板所掌握的调试方法并不局限于在这款学习板上使用。




管理员信箱: stonewayqi@hotmail.com

欣 欣 学 习 网

粤ICP备2023138008号