原创 Keil 串口 软件仿真调试

2015-4-29 17:52 1902 11 13 分类: MCU/ 嵌入式

 

1  调试前的准备工作

  下面介绍一种利用Keil的软件仿真功能来实现51单片机串口调试用户程序的方法。使用这种方法,无需任何硬件仿真器,甚至都不需要用户电路板。所需的只是:

    硬件。1台普通计算机(需要带有2个标准串口)和1根串口线(两头都是母头,连线关系如图1所示)。
    串口软件可以是自己编写的专用调试或上下位机通信软件,也可以是通用的串口软件(如串口助手、串口调试等),主要用来收发数据。如果没有合适的串口调试软件,则可使用笔者编写的一个免费的串口小工具TurboCom

2  基本调试命令介绍

  这个串口调试方法主要是利用了Keil强大的软件仿真功能。在新版本(高于6.0)的Keil软件中,增强了软件的仿真能力,可以利用软件仿真更多的单片机功能。在这些功能中,其中有一个很重要的功能就是利用计算机的串口来模拟单片机的串口(这不同于很多软件在仿真时使用的激励文件方式,可以直接与其他串口进行通信,更加方便、灵活)。首先要介绍仿真时需要使用的两个命令:ASSIGNMODE

2.1  ASSIGN命令

  将单片机的串口绑定到计算机的串口。基本使用方式为:

  ASSIGN channeloutreg

  其中: channel代表计算机的串口,可以是COM1COM2COM3COM4;而inregoutreg代表单片机的串口。对于只有一个串口的普通单片机,SINSOUT;对于有两个或者多个串口的单片机,即SnINSnOUTn=01即单片机的串口号)。

按此在新窗口浏览图片
1  串口连线示意图按此在新窗口浏览图片
2  仿真参数设置按此在新窗口浏览图片
晶振参数设置按此在新窗口浏览图片进入Debug(仿真调试)状态,在Output window窗口中的command文本框(一般是在左下角)中输入上面介绍的命令。例如,将PC机的串口1设置为单片机的串口:

  例如:

  ASSIGN COM1SOUT

  将计算机的串口1绑定到单片机的串口(针对只有一个串口的单片机)。

  ASSIGN COM2S0OUT

  将计算机的串口2绑定到单片机的串口0(针对有多个串口的单片机,注意串口号的位置)。

  需要注意的是,参数的括号是不能省略的,而outreg则是没有括号的。

2.2  MODE命令

  设置被绑定计算机串口的参数。基本使用方式为:

  MODE COMx baudrate, parity, databits, stopbits

  其中: COMxx = 12)代表计算机的串口号;baudrate代表串口的波特率;parity代表校验方式;databits代表数据位长度;stopbits代表停止位长度。

  例如:

  MODE COM1 9600, n, 8, 1
  设置串口1。波特率为9 600,无校验位,8位数据,1位停止位。
  MODE COM2 19200, 1, 8, 1
  设置串口2。波特率为19 200,奇校验,8位数据,1位停止位。

  使用以上两个命令,就能够将计算机的串口模拟成单片机的串口了。在进行软件仿真时,所有发送到被绑定的计算机串口上的数据都会转发到Keil模拟的单片机串口上,用户程序可以通过中断处理程序或查询方式接收到这些数据;同样,单片机程序中发送到单片机串口上的数据也会通过被绑定的计算机串口发送出来,可以被其他软件所接收。利用这个特点,就可以方便地仿真、调试单片机的串口部分程序。要注意的是,这两个命令需要一起使用。

2.3  仿真步骤

  首先,用串口线将计算机的两个串口连接起来(或者是两台计算机上的两个串口)。这两个串口一个用来模拟单片机串口,另一个给调试程序使用。这个由用户自己分配,没有特殊要求。

  其次,编写好用户程序,并编译通过。

  然后,设置工程文件(Project)的相关参数,如图2和图3所示。主要是选择软件仿真模式(Use Simulator)以及晶振参数。

 

  为了不必每次进入仿真状态后,都需要输入串口参数设置命令,可以建立一个初始化文件。初始化文件是一个普通的文本文件,内容就是仿真时需要的命令,按照顺序一行输入一条。如图2所示,建立了一个debug.ini的初始化文件。这样,当每次进入仿真调试状态时,Keil就会自动载入debug.ini的内容进行初始化。

 

  为了正确仿真串口,在软件仿真调试时,在用户的Keil工程文件的属性中,还需要设置实际使用的晶振频率。这个参数非常重要,直接影响通信的波特率,可以按照实际使用的参数进行设置。要注意,这个参数的单位是MHz

  设置好参数后,就可以进行仿真了。单击工具栏的图标

  mode com1 9600,0,8,1
  assign com1 Sout

  然后设置断点,一般是在关键地方或与串口相关联的地方设置。再单击图标运行(Run)用户程序,使用户程序运转起来(不然是接收不到串口数据的)。这时再使用串口调试软件或用户调试软件,发送通信命令或者数据包,看用户程序是否进入断点,以及相关的变量是否正确。还可以有意发送带有错误数据的数据包,以观察用户程序的异常处理部分是否正常。一旦发现程序中的错误,可以马上停止仿真调试,立即修改代码,然后再次重复上面的步骤进行仿真。因为不需要与用户目标板联机,也不用下载代码到用户板上,所以速度非常高。以上这些步骤和使用硬件仿真器的基本一样,只不过现在使用的是软件仿真。

  需要注意的是: 仿真时单片机串口实际的波特率由MODE命令来指定,单片机程序中的TMODSCON等参数是不影响串口仿真状态的(也就是说这些参数不影响仿真的波特率,即使它们是错误的)。但是中断的使能位(如ESEA等)还是起作用的,如果ESEA被禁止,那么就不会进入串口中断。

    因为这种方法是利用计算机的串口来仿真单片机的串口,而仿真是通过Keil软件来转换串口上的数据,不是直接转发数据的,所以在实际仿真时,处理速度会比实际单片机运行时稍微低一点。比方说仿真状态时1 s只能发送/接收10个数据帧,但在单片机硬件上运行时可能1 s就可以接收/发送50个数据帧。这与使用的计算机的速度有关,但对仿真来说,是没有任何影响的。

  对于多串口的单片机,从理论上来说,可以一次绑定多个串口,只要计算机有足够多的串口。基本上,使用这种方法需要占用计算机的串口数量是单片机绑定串口的2倍。一个串口被Keil占用,用来模拟单片机的串口;另外一个串口被计算机占用,用来给单片机的串口收发数据。

 

2.4  计算机机上的硬件串口也可以用软件模拟

     不同的是,软件模拟串口,已经自动把串口两两相关联,这样可以既可以解决计算机硬件串口数量不足问题,又能省去串口之间的连线。缺点是计算机CPU运行负荷变大,实时性不一定满较快的通信速率,可能会出现丢失数据。如下图。

qq图片20150429125615.jpg

 

文章评论2条评论)

登录后参与讨论

用户1590308 2015-4-29 14:19

原文不知道谁写的 我又加了些内容 整理

shaoziyang 2015-4-28 13:32

转载的没有写出处啊。
相关推荐阅读
用户1590308 2016-06-24 14:43
IAR for MSP430 学习 汇编
1.编译后结果 Error[67]: Public 'Binary2BCD' did not appear in label field  解决方法,是把Binary2BCD不...
用户1590308 2016-06-18 15:43
关于补码 减一个数等于加上这个数的补码 理解式证明
1.补码的计算方式第一种是原码取反+1,第二种是模-原码,这是两种等效的方法,下面简单理解式的证明一下两种方法等效 以一个字节8位举例。假设原码为1001 0110,取反0110 1001,把...
用户1590308 2016-03-09 15:09
晶振
1.DS1307的时钟电路的外部圆柱形时钟32.768kHz居然吱吱响,不知道什么原因...
用户1590308 2016-03-09 11:59
AVR使用手记
1.上电后,当单片机外围器件没有正常现象后,可能是单片机的外围晶振没有起振,这时可以通过设置选择熔丝位,把AVR单片机的时钟源选择为内部时钟。再上电观察现象,综合判断。若单片机外围有485,单片机...
用户1590308 2016-02-19 18:10
GSM MG323到MG301驱动移植(未完待续)
关于华为MG323到MG301驱动移植,软件平台ICCAVR,单片机MEGA128A。 在从FAE得到的两者差异基础上,发现的使用差别 1.AT+CMGD=1 在MG323上,无论存M...
用户1590308 2015-05-14 17:50
ucosii 使用技巧
一、问题:在执行完一个任务一次后,就会进入硬中断,硬件平台stm32f103vct6,IDEkeil, ucoii版本V2.86。 经过追踪发现在进入硬件中断前,是在任务调度函数中。 根据...
我要评论
2
11
关闭 站长推荐上一条 /2 下一条