硬件仿真与烧写程序结果不一样原因总结

发布者:静逸闲云最新更新时间:2016-09-14 来源: eefocus关键字:硬件仿真  烧写程序结果 手机看文章 扫描二维码
随时随地手机看文章
一,配置问题:实际烧片时单片机的配置字与仿真的时候是不是一样?烧写时是否配置正确?

二,资源问题:单片机的ROM、RAM大小与仿真器的ROM、RAM大小是不一样的!
三,驱动能力问题:通常仿真器的驱动能力比单片机要强;可以分两步检查,一是分别用仿真器与单片机时对应IO口波形进行对比,二是当仿真器与外设连接与不连接时波形的对比;
要进行基本要素分析:单片机供电正常?起振没有?复位电路正常?芯片损坏?
【单片机上电不运行情况的分析】
1.单片机是没有运行,还是运行不正确?
2.如果是没有运行,检测单片机的基本参数是否已经满足<工作电压要在芯片的引脚处测量><复位引脚的复位曲线如何><晶振是否已经起振><芯片损坏,或者部分功能损坏>。
3.如果是运行不正确,检测<用了看门狗,没有处理好,芯片上电后处于不停的复位状态,看起来就象没有没有工作起来><是否进入了ISP状态><对单片机写入对所有的IO口以1秒取反一次的程序进行测试>

【单片机调试办法】
用LED进行状态指示,用串口进行数据指示,比用其它外设指示更可靠;
加入断点,烧写时是在不同的语句后面加入WHILE(1);
分模块调试,把每个小功能先调试通过,再进行组合。
http://bbs.21ic.com/icview-104784-1-1.html

 

Keil   C本身就是编译与仿真一体的,当不要外部数据时很方便,当要外部输入时(比如用定时器作计数器用)它提供几个调试输入用的窗口可用它们来摸拟输入,同时Keil   C本身提供一种调试函数用来配置摸拟外部输入的功能,这我在学习时看的一本书上讲过如用定时器作外部事件计数,调试函数由自己根据需要按特定的格式来编辑再按KEIL   C的要求调入即可。学习时可用这种方法,做产品时最好是用仿真器调试。下面我给出我以前试过的用定时器作外部事件计数时摸拟外部输入的调试函数,并写出Keil   C调用的步骤如下: 
1、编写如下信号函数: 
single   void   t0_singal(void) 

            while(1) 
          { 
                PORT3|=0x10;//pull   INT0(P3.4)   high   again 
                PORT3&=~0x10;//pull   INT0(P3.4)   low   and   generate   interrupt 
                PORT3|=0x10;//pull   INT0(P3.4)   high   again 
                twatch(CLOCK);//wait   for   1   second 
            } 

2、在DEBUG状态下单击DEBUG菜单在下拉菜单中单击“Function   Editor(Open   Ini   File)... "选项,   弹出新屏幕后,将“打开”窗口关闭,这时屏上有Function   Edito窗; 
3、在Function   Editor窗中输入上面的函数; 
4、保存(注意:扩展名为.ini),编译该程序,成功后关闭Function   Editor窗口; 
5、执行用户程序(必须连续执行); 
6、在屏幕左下脚的命令窗口中,键入t0_singl()后(必须回车)妈可向P3.4源源不断地提供脉冲信号。

http://topic.csdn.net/t/20030806/07/2113446.html

 

我们使用Keil C调试某系统时积累的一些经验

1、由于Keil C对中文支持不太好,因而会出现显示的光标与光标实际所在不一致的现象,这会对修改中文注释造成影响。在Windows2000下面,我们可以把字体设置为Courier,这样就可以显示正常。

    2、当使用有片外内存的MCU(如W77E58,它有1K片外内存)的时候,肯定要设置标志位,并且编译方式要选择大模式,否则会出错。   

    3、当使用Keil C跟踪程序运行状态的时候,要把引起Warning的语句屏蔽,否则有可能跟踪语句的时候会出错。

    4、在调用数组的时候,Keil C是首先把数组Load进内存。如果要在C中使用长数组的时候,我们可以使用code关键字,这样就实现了汇编的DB的功能,Keil C是不会把标志code的数组Load入内存的,它会直接读取Rom。

    5、当编程涉及到有关通信,时序是很重要的。拉高管脚的执行速度远远比检查管脚电平的要快。

    6、在等待管脚电平变化的时候,我们需要设置好超时处理,否则程序就会因为一个没有预计的错误而死锁。

    7、能用C语言实现的地方,尽量不要用汇编,尤其在算法的实现,用汇编是晦涩难懂。

    8、程序的几个参数数组所占篇幅很大,其中液晶背景数组最长,有四千个Byte,因而把那些初始化数组都放在另外一个C文件,在主文件使用使用关键字extern定义,这样就不会对主文件的编写造成干扰。

    9、所有函数之间的相关性越低越有利于以后功能的扩展。

    10、6.20版在编译带code关键字的数组时,编译通过但是单片机运行结果是错误的,改用6.14版后正常。

 

http://z86k.blog.163.com/blog/static/9079615620091051331503/

[转载]Keil软件仿真的串口调试技巧

引言

  在单片机系统中,串口(UART,通用异步收发接口)是一个非常重要的组成部分。通常使用单片机串口通过RS232/RS485电平转换芯片与上位机连接,以进行上位机与下位机的数据交换、参数设置、组成网络以及各种外部设备的连接等。RS232/RS485串行接口总线具有成本低、简单可靠、容易使用等特点,加上其历史悠久,所以目前应用仍然非常广泛;特别对于数据量不是很大的场合,串口通信仍然是很好的选择,有着广阔的使用前景。

  在单片机编程中,串口占了很重要的地位。传统方式串口程序的调试,往往是利用专用的单片机硬件仿真器。在编写好程序后,利用仿真器来设置断点,观察变量和程序的流程,逐步对程序进行调试,修正错误。使用硬件仿真器的确是很有效的方法,但是也有一些缺点:

  ◆ 很多仿真器不能做到完全硬件仿真,因而会造成仿真时正常,而实际运行时出现错误的情况;也有仿真不能通过,但是实际运行正常的情况。
  ◆ 对于一些较新的芯片或者是表面贴装的芯片,要么没有合适的仿真器或仿真头;要么就是硬件仿真器非常昂贵,且不容易买到。
  ◆ 有时由于设备内部结构空间的限制,仿真头不方便接入。
  ◆ 有的仿真器属于简单的在线仿真型,仿真时有很多限制。例如速度不高,实时性或稳定性不好,对断点有限制等,造成仿真起来不太方便。

1 调试前的准备工作

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

  ① 硬件。1台普通计算机(需要带有2个标准串口)和1根串口线(两头都是母头,连线关系如图1所示)。
  ② 串口软件可以是自己编写的专用调试或上下位机通信软件,也可以是通用的串口软件(如串口助手、串口调试等),主要用来收发数据。如果没有合适的串口调试软件,则可使用笔者编写的一个免费的串口小工具TurboCom。除了与其他软件一样的数据收发功能外,它还有定时轮流发送自定义数据帧和自动应答(接收到指定数据帧后,自动返回相应的数据帧)这两个很有用的功能,特别适合于老化测试。这个小工具可以从http: //shaoziyang.bloger.com.cn下载。

2 基本调试命令介绍

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

2.1 ASSIGN命令

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

  ASSIGN channeloutreg

  其中: channel代表计算机的串口,可以是COM1、COM2、COM3或COM4;而inreg和outreg代表单片机的串口。对于只有一个串口的普通单片机,即SIN和SOUT;对于有两个或者多个串口的单片机,即SnIN和SnOUT(n=0,1,…即单片机的串口号)。

  【硬件仿真与烧写程序结果不一样原因总结】 - eng_2005 - eng_2005的博客
图1 串口连线示意图

  例如:

  ASSIGN COM1SOUT

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

  ASSIGN COM2S0OUT

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

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

2.2 MODE命令

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

  MODE COMx baudrate, parity, databits, stopbits

  其中: COMx(x = 1,2,…)代表计算机的串口号;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)以及晶振参数。

  【硬件仿真与烧写程序结果不一样原因总结】 - eng_2005 - eng_2005的博客
图2 仿真参数设置

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

  【硬件仿真与烧写程序结果不一样原因总结】 - eng_2005 - eng_2005的博客
图3 晶振参数设置

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

  设置好参数后,就可以进行仿真了。单击工具栏的图标进入Debug(仿真调试)状态,在Output window窗口中的command文本框(一般是在左下角)中输入上面介绍的命令。例如,将PC机的串口1设置为单片机的串口:

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

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

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

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

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

3 小结

  这里介绍的方法对C51和汇编语言都是适合的。它最大的好处就是简单、方便,容易使用,不需要使用任何电路,也没有特殊的要求;甚至可以在硬件电路制作好之前就将串口部分的程序编写、调试完毕。笔者使用这种方法已经很长时间了,事实证明这种方法确实非常有效。其实对于51单片机,Keil的仿真功能实在是太强大了,只要充分掌握其特点,能够熟练利用它,就可以解决工作中的大部分问题。很多工作都可以使用软件仿真来完成,根本无需任何硬件仿真器;只有一些新的外部器件的时序、接口的调试才有可能需要用到硬件仿真器。目前介绍Keil软件仿真这方面的参考书籍很少,有些讲的还是老版本的用法,不过没有关系,Keil的帮助文件写得很详细、很清楚,只要认真看明白就会使用了。使用熟练后,就会发现Keil的功能相当强。

  对于串口编程,51单片机有Keil这个功能强大的开发软件,给我们带来了极大的便利;而在其他单片机软件的开发中,目前还没有这么强大的开发工具和方便的调试手段。这里有个变通的办法,就是可以先在Keil中编写并调试好串口程序,然后将程序移植到其他单片机平台中(笔者在PIC18单片机开发中就使用了这种方法,收到了很好的效果。当然这是指在使用C语言开发单片机程序时,汇编语言是没有可移植性的)。至于如何能够减小程序移植的工作量,使得程序具有更好的通用性,以最小的代价就可以平滑地移植到其他单片机平台上,也是一个非常值得探讨的问题。另外,为了方便初学者掌握这种方法,笔者专门做了一个例子程序,放在http://shaoziyang.bloger.com.cn上,可以用来练习。

参考文献

[1] Keil公司的帮助文件DBG51.CHM.

http://www.laogu.com/wz_2576.htm

关键字:硬件仿真  烧写程序结果 引用地址:硬件仿真与烧写程序结果不一样原因总结

上一篇:电感式触摸屏控制系统硬软件设计
下一篇:Keiil中将“.hex”文件转".iic"文件的简单方法

推荐阅读最新更新时间:2024-03-16 15:09

FPGA高速硬件在环仿真器进行电机控制器测试
   介绍   电机在现代生活中扮演着重要角色。出于对安全、成本及效率的考虑,工程师——尤其是混合电动力汽车(HEV)工程师——往往希望在特定的真实环境下通过仿真电机模型对电机控制器进行测试。   由于在经济及环境等方面展现出的优势,HEV受到了广泛的关注,而电机正是HEV的核心部件。尤其是考虑到HEV的电机及电力电子器件体积大, 成本高; 在让控制器去控制这些实际的部件前, 先用硬件在环仿真的方法来测试和验证控制器的性能是非常必要的.   本文讨论基于FPGA而设计的高速HIL仿真器来实现电机控制器测试。下图为HIL测试系统。   电机驱动仿真器包括DC电压源、逆变器桥路以及电机。我们支持永磁同步电机(PMSM)及
[嵌入式]
FPGA高速<font color='red'>硬件</font>在环<font color='red'>仿真</font>器进行电机控制器测试
STM32-Keil软件仿真硬件仿真/在线仿真
软件仿真和硬件仿真什么区别?软件仿真就是没有硬件参与的仿真,完全是模拟实现的。硬件仿真是将程序下载到控制芯片的FLASH或RAM中,直接在硬件上实现仿真。【有什么问题欢迎联系讨论,一起解决问题】 仿真这种东西,因为涉及到信任问题,用的好觉得好用,用不好可能会徒增麻烦——“还不如直接在硬件上调试靠谱”。但是总体上,仿真还是比较有用的,比如在排查软件问题(寄存器配置等)的时候,使用软件仿真是非常靠谱的。而如果涉及到硬件的问题(比如你的板子代码需要读取外部信号,或者输出信号等),可能需要用到硬件仿真,或者说在线仿真。关于仿真,网上的资料说的还是挺全的,这里只做总结。 一、软件仿真 1.1 仿真配置 首先确定仿真的硬件环境。点击魔
[单片机]
STM32-Keil软件<font color='red'>仿真</font>和<font color='red'>硬件</font><font color='red'>仿真</font>/在线<font color='red'>仿真</font>
硬件仿真器成IC设计新宠 三大EDA公司竞争
随着芯片复杂度的提高,验证测试变得越来越重要,对芯片最显著的改进不仅在设计流程中产生,也在芯片调试和验证流程中反复进行着。因此,为帮助IC设计企业缩短验证时间、加快产品上市,大型EDA工具提供商均致力于加强硬件仿真工具的开发与相关市场的经营。Cadence于日前推出其新一代验证计算平台PalladiumXPII,容量扩展至23亿门。Synopsys公司则在2012年收购了仿真工具供应商EVE,强化了其硬件辅助验证产品线。Mentor亦于2012年推出高速多功能硬件加速仿真器Veloce。全球三大EDA公司均已涉足硬件仿真器市场,并进行激烈竞争。 验证测试面临挑战 现代大规模集成电路设计密度越来越高,更加快速、有效地进行设
[半导体设计/制造]
Keil的软件仿真硬件仿真
一、软件仿真 Keil有很强大的软件仿真功能,通过软件仿真可以发现很多将要出现的问题,Keil的仿真可以查看很多硬件相关的寄存器,通过观察这些寄存器值的变化可以知道代码有没有正常运行。这样可以避免频繁下载程序,延长单片机Flash寿命。 开始仿真之前,先配置一些选项。 1.在工程设置里设置好芯片型号和晶振频率。 2.在“Debug”选项卡中选择“Use Simulator”,表示使用软件仿真;选择“Run to main()”则表示跳过汇编代码,直接跳转到main函数开始仿真。设置下面的“Dialog DLL”项为“DARMSTM.DLL”和“TARMSTM.DLL”;parameter项为“-p
[单片机]
Keil的软件<font color='red'>仿真</font>和<font color='red'>硬件</font><font color='red'>仿真</font>
热门资源推荐
热门放大器推荐
  •  pdf文件控制系统设计指南 (埃利斯)
  •  pdf文件射频电路基础 (赵建勋,邓军)
  •  pdf文件控制系统设计指南第4版
  •  pdf文件电气控制与S7-1200 PLC应用技术教程 (郑海春)
  • 系统发生错误

    系统发生错误

    您可以选择 [ 重试 ] [ 返回 ] 或者 [ 回到首页 ]

    [ 错误信息 ]

    页面错误!请稍后再试~

小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved