1, 中断程序的编写
一个编程经验是,所有的中断都要尽快的运行和退出,中断服务程序越短越好,这样才不至于干扰主程序的工作和其他中断的运行。也就是,我们应该尽量把程序代码从中断服务函数里搬出来。
对于定时器的中断的工作方式,我们可以建立一个全局的标记(变量flag),在中断里置这个标记,然后就退出。在主程序里去检查这个标记,再清 0 标记和处理相应的工作。检查到这个标记之后,就运行相关的程序。对于 CPU 任务比较多的项目来说,这种工作方式可以获得最佳的工作效率。当然,对于非常实时的应用要求,比如时钟,还是建议在中断里做完,因为使用标记的方式时,主程序可能太忙而造成错过标记信号,就是这个标记还没有开始处理呢,下一个该中断又来了。熟练的程序员还是可以避开这些异常的情况的。(实质上是看中断发生的频率与cpu主频的相对快慢,cpu处理速度快就不会产生这种问题) 2, 在没有硬件的情况下,看看程序执行的如何,使用单步执行。但到外部中断的时候就过
不去了,怎么让他接着执行外部中断的服务从程序呢?
在仿真运行时,在peripheral中打开对应的IO口或UART等,找到外部中断输入的那一位,手动给中断信号就可。
3, Keil中调试技巧
<1>查看变量的值
注意,要查看变量的值,只能在程序停下来的状态下查看。在程序运行的过程中,程序不断地运行,变量也在不断地变化,一般是无法查看的。
(1)点停止程序后,在C源文件窗口程序中,将鼠标放在的变量“n”上面,可以看到旁边出现了一个小框框,上面显示了 n=0x47D3,这就是变量此时的值。
(2)如果觉得这样可能会点不准确,可以选中你要看的变量,同样会显示变量的值,个人感觉这种操作更为方便。
(3)在命令行窗口下,输入的方法也可以看变量,在命令行输入 n,回车,就看到结果了。
(4)在 watch 窗口看变量。点 watch 图标,就是那个有个眼镜的图标,打开 watch 窗口。注意要看某个变量,如果这个变量是某个函数私有的(局部变量),必须是程序停止时并且 PC 已经停止在了这个函数中才可以看到(这就需要在该函数中设置断点),各种看变量的情况都是这样。
注:watch框内的变量只有在当前变量作用域的才可以添加,例如全局变量。局部变量即使添加后,在下次调试时也会从watch窗口移除,改到locals窗口内显示。这个 ' 符号似乎是表示该变量是上次调试时定义的,好像没其他什么作用。做过测试,只要成功被记录进watch窗口的全局变量,即使该量的物理地址发生了变化,下次调试时调试器也能准确跟踪到,并在watch内刷新结果。locals窗口是查看当前函数处内部变量值得窗口。不要被误导。 KEIL调试时的watch窗口是查看的全局变量值,不能看内部变量值。
如果在watch窗口看内部变量,会是错误的。会误导你的!!
<2>这里再教一招,如果我想让 n 现在就变成我想要的值怎么办?这也是调试常见的手段,设置一个变量的值,比如,让 n =0x1234,只要在命令窗口里输入“n=0x1234”就行了,几乎所有变量都可以这样直接设置,包括 IO 口,比如你输入“P1.1=0”,结果第二个灯就亮了。
<3>还有一种直接看存储器的方法,可以看到所有存储器的值,但是和变量名称就不是那么好对应起来了。点 memory 窗口图标,打开 memory 窗口。在实际的硬件调试方式中,如果不用看 memery 窗口,就建议不用打开它。因为保持它的打开会增加仿真时通讯的时间,特别是单步运行的时间。
<4>仿真器仿真如何进入中断
你先main函数开头弄个断点,然后单步运行好了一个特殊的地方,使用 jlink 在单步时运行时,可能无法进入到中断服务函数中。这是因为中断函数可能在单步处理的瞬间已经运行过去了。如果要单步调试中断服务函数,请在中断服务函数内设置断点,再点全速。稍后就会停止在断点上,就可以继续单步运行了。
设置了一个静态变量 t,静态变量的值在进入函数时是不会被初始化的,而是保持上次的值。
第二篇:硬件调试经验总结
硬件调试经验总结
1 浪涌/过电应力损伤
1.1 烙铁接地不良导致MRF184损伤
启示:测试系统的仪器必须有外部接地点。
1.2 继电器切换编程电压导致89C52失效。
89C52的Vpp编程电压正常为12V,切换时达到20V,要串接100欧姆的电阻。
启示:继电器、开关机械式切换触点一般会有震荡,对于不同的负载所产生的过流或过压危害需要设计中采用阻容或二极管消除抖动。
1.3 热插拔产生浪涌
串口允许热插拔,也要考虑保护电路。
ADM208E,MAX208
启示:串口接口芯片用作板间信号通讯电平转换时,只要产生或维护中需要热插拔,其输入输出端就不能直接与外接插座相连,至少应串有保护电阻。
2容限
2.1时序
2.1.1 Flash写信号与片选信号同时翻转导致读操作错误
28SF040->28SF040
90ns->150ns
启示:逻辑器件中各信号要严格按照器件手册要求进行设计,并留有一定余量。
2.1.2
19M与38M时钟关系临界时隙误码
SD518
XCS30时钟芯片
启示:多时钟之间的正确时序关系及容限非常重要,ASIC手册必须对关键时序描述清晰。
2.2驱动能力
2.2.1输出极限应用导致替代出问题
DTMF收号芯片CM8870DI代替MT8870SR(MITEL)
全部参数一致,MT的典型值IOH=4.5nA》0.8nA。
启示:单板设计应严格按照数据手册设计,这样才能保证设计容限,才能保证设计的产品能够大批量生产。尤其是挂在数据总线上的器件,一定要按照器件手册考虑驱动能力。
2.2.2单片机高电平输出电流无法驱动ULN2003
普通数字电路接口芯片驱动功率芯片,要注意参数的最小值而不是凭经验进行替换。
2.3电源电压
3.3.1背板电源走线损耗电压下降的后果
80C320代替80C310
提示:根据系统的功耗容限,分析器件的电源电压范围,保证系统的电源稳定。
2.4逻辑电平稳定
3.4.1 TTL电平驱动CMOS电平器件导致单板运行不稳
EM7128-驱动AC16244
提示:多逻辑电平设计中,器件的每个管脚都要注意逻辑电平的配合问题,首先保证设计正确。
2.5关键参数取值
2 .5.1CPU测试管脚处理不当,上电不开工
AMD AM80C816-20替代Intel的N80C186
Test管脚下拉电阻过大
提示:针对可改变器件工作状态的制造厂家自由用特殊管脚,严格按照厂家要求可靠处理。
2.5.2器件测试输入管脚悬空带来的影响
SD522B-》SD522A
对于CMOS工艺器件,其未用输入管脚一定要通过4.7K上拉或1K电阻下拉,不能悬空。悬空的管脚可能会引入震荡,使系统莫名其妙出现问题。
2.5.3电容电阻精度不够产生拨号音不符合国标
电阻电容等器件的精度选择似乎是一个不起眼的小问题,但在振荡电路等于频率有关的电路中,需要考虑做好与最坏情况的影响。如温度对电容值,运放漂移的影响等。
2.6温度容限问题
2.6.1未使用温度补偿电路导致基准电压在-30oc时不正常
超常规温度范围的应用,需要特别关注模拟器件并提前进行局部电路高低温试验
2.6.2关键电路未作最差情况分析,异常动作。
保护电路是系统的关键部件,其保护点区间是一项非常关键的指标。在设计中开展容限分析,特别是温度器件参数离散方面的容限分析,可有效提高产品可靠性,降低问题更改的代价。
2.7寄存器设置不当,SGRAM无法达到最高频率。
某些厂家不同,其内部寄存器设置也会存在差异,在发生器件替代时充分考虑这种差异带来的影响。单板设计时更要注意做到兼容性。
按照器件手册设计电路时,对于器件的一些特性不能只关心典型值,应该按照其特性的分布范围考虑系统的容差问题。
3.1上电复位
MAX807看门狗
复位电路严格按照规范
3.2 DSP:DSP5630PV800-》DSP5630PV100
PT7A4401-》MT90401
内部有PLL等上电后需要一定时间才能稳定工作的器件,设计时需按照手册处理好上电过程与正常工作状态的切换。
3.3 PCI桥芯片SB21150芯片存在BUG
对复杂器件的上电稳定性要做验证,与厂家签订合作协议,保证器件及典型电路作更改时第一时间通知公司。
3.4直流电源跌落的影响是多方面的,在网上曾出现多次事故,这与硬件设计、单板软件设计都有很大关系,需要综合考虑。
3.5 DTMF芯片UM91215A需要缓上电。数模混合电路的上电设计,对厂家推荐的电路的更改需要充分验证。