如何在单片机上调试Hex文件的程序

2022-03-24 09:12:56 | 浏览次数:

会单片机编程的朋友都知道,在编写一个单片机的程序过程中和编好程序后,都需要多次地调试程序段。一般的方法是用仿真器进行试运行,仿真器有软件仿真和硬件仿真两种。软件仿真只能仿真部分常用硬件,如MPU、8255、RAM、E2ROM等,对LCD显示模块、键盘接口等外接部分就无能为力了。硬件仿真需要选购合适的仿真器设备,一般较贵,而且硬件环境也不一定能完全和所编程序的目标环境完全一样。还有一种比较落后的方法是把编写好的程序编译后,直接烧录到目标单片机环境的芯片上进行调试。一般的芯片出厂后都有规定的重复写入次数。这样,如果编程不顺利的话,芯片多次重复写入,使用寿命就大打折扣了。笔者试过用编程器多次烧录89C51芯片,开始时烧录很快,次数多了以后就不能再一次烧录成功,到后来刚烧录到一半就停止了,因为有一些存储单元校验结果与写入的数据不一致。怎样在编程过程中使程序经常得到实际单片机环境的验证,又不损坏芯片呢?本文介绍一种在实际的单片机目标环境中调试编译后的Hex文件的方法。这种方法不仅适用于MCS-51系列的单片机系统,其它系列的单片机系统依据此方法的基本原理,只需重新编写字节很少的串口中断服务程序仍然适用。

单片机硬件部分

这一调试方法的基础是通过串行通讯手段,把在计算机上编译好的Hex文件发送到目标单片机系统的RAM存储器中。然后,发送运行程序的命令,使已存入RAM的程序在目标单片机系统上试运行,检验程序能否进行正确动作。所以,首先要解决计算机与单片机系统的串口连接问题。一般来说,计算机串口与单片机的串口可用如图1所示的方式进行连接。

本例中的单片机串口出入端采用了由两个三极管组成的简单电路,经多次试用发现其通信效果极好,当然还可以用专用的集成电路,如MAX323等。

其次,还需要一个基本的单片机硬件结构以完成Hex文件存入RAM静态存储器。本例中,以AT89C51组成的目标单片机环境,由AT89C51、74HC373、RAM静态存储器组成基本的调试用环境。其它外接电路如LCD显示模块、键盘电路、82C55接口均可按需接入,不影响调试用电路部分的通信和试运行。基本结构部分电路如图2所示。

为了完成与计算机的通信,89C51芯片内部固化了一个短小的串行口预置和中断服务程序,所以EA脚接Vcc,PC所给地址在0000~1FFFH之间,CPU执行片内已固化的程序;所给地址为2000H以上,则执行RAM内保存的程序。为了使RAM内的数据能作为程序数据被执行,本例中将PSEN和RD两个信号用两个小二极管(可用贴片元件)组成的与门电路进行逻辑相与,作为RAM读取端的RD信号。经过试用,此连接方法是可靠的,当然也可以选用专用的与门芯片来连接。本例中RAM芯片的0000~1FFFH空间只能作为数据存储空间,2000H以上才能用作调试Hex文件的使用空间。具体的硬件连接情况由目标单片机环境决定,可灵活变通。

计算机软件部分

以上面的目标单片机系统环境为例,编好的.ASM或.A51单片机程序用专门的编译软件编译成Hex文件。再通过计算机的串口发送到单片机,单片机通过串口中断服务程序将Hex文件的程序数据保存在静态存储器RAM中。然后由计算机发送相应的命令代码(本例中运行程序的命令代码为“00 A5”),单片机收到指令后即转到RAM区执行已存入此处的Hex文件程序。有很多串口调试程序都可以把文本形式的16进制数据传送到单片机。但缺点是不能直接发送Hex文件,也不能把Hex文件转化成可发送的文本形式的16进制数据。因此不能直接用于本方法。在本刊的网站上,给出了笔者用VB6编写的Hex文件转化及串口通信程序。

这个程序的使用方法非常简单。安装后打开如图3的窗口界面,在正确的驱动器目录下找到已编译好的Hex文件,双击后程序即自动将Hex文件转化成可用串口发送的文本形式的16进制数据,显示于下部的文本框中。用过串口调试程序的朋友一定会感到很熟悉,文本框中每行显示16个数据字节,便于阅读和查找数据。接下来,点击“设置”菜单,出现图4所示的串口设置窗口。设好端口号、波特率等项,确定后即打开了相应串行端口。然后,点击“发送”,已转化为数据的Hex文件即向单片机发送。发送时,软件自动先发送“命令前缀”文本框中的命令代码(本例中命令代码为“01 A5 ”),单片机的串行中断服务程序收到此命令代码,自动转入接收Hex文件的状态。然后,计算机继续发送Hex文件的数据,单片机接收后,将数据存入相应的RAM区。此时,点击“运行”,计算机即向单片机发送命令代码“00 A5 ”,单片机接收命令代码后,自动转入RAM区运行,此时即可以在目标单片机系统上看到调试程序试运行的效果,进行改进和检验了。转换和发送字节数较多的Hex文件时,请注意中间的滚动条,等待操作全部完成。执行发送前,软件自动在Hex文件数据的尾部添加发送结束标记“A5 AA ”,单片机将在收到此标记代码后,自动退出接收Hex文件的状态。

单片机软件部分

为了和计算机进行串行通信,接收Hex文件的数据,单片机内应先固化有串口预置、串口中断服务等功能的小程序,在本刊的网站上给出了该程序的asm编码,该软件编译后的LIS文件、HEX文件见本刊网站,文件名为ceshi01.lis和ceshi01.hex 。

串口波特率需根据实际晶振频率具体设定,本例中串行口设为方式1,SMOD位设为0,晶振频率为12MHz,定时器1的重装载数根据公式:256-晶振频率×2SMOD÷32÷12÷波特率,计算结果约为230,转化为十六进制数为E6。使用较低波特率时,重装载数允许有一定偏差。笔者试过在1200波特率的情况下,重装载数增减1或2,串口通信情况仍然良好。

该asm程序编译后,是一个极短小的字节序列,约为7F字节。读者可以使用专门的烧录器烧录到89C51芯片内,也可以手工进行烧录。

结束语

本文以89C51系统为例,介绍了一种用目标单片机环境直接调试Hex文件的方法。由于采取了将程序存入RAM进行试运行的办法,可以进行无数次重复读写和调试运行。此方法的思想和本文中介绍的计算机端程序,对于其它系列单片机环境下直接调试Hex文件都是适用的。另外,本文中介绍的计算机端程序也是进行串口通信的一个很好的工具。尤其是可以将Hex直接转化成文本形式的数据,用串口直接发送。本人编写的这一软件,放在《电子世界》网站上,供感兴趣的朋友免费使用。■

推荐访问: 机上 调试 文件 程序 如何在