[ZLG-ARM] 请教"看门狗"的问题 各前辈请帮忙 实在弄不好了

[复制链接]
2956|7
 楼主| zhkxc 发表于 2007-7-16 21:22 | 显示全部楼层 |阅读模式
问题是这样的:周立功书原程序是这样的(见后)<br /><br />原程序在LPC2200的实验板上实验是没有任何问题的,可以修改看门狗的复位时<br />间等等都没有问题;但是我在主程序中的while(1);&nbsp;&nbsp;里面直接加WdtFeed()函数;想让狗不复位,改好的如下:<br />while(1)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;WdtFeed();<br />}<br />得到的结果是程序一直从启动;我把狗复位时间改成10分钟都不行.<br />片子:LPC2214<br />我在做产品程序的时候,使用是KEIL3环境,用KEIL仿真器,就写一个简单的程序,<br />还是在主程序中直接只有WdtFeed();函数,得到的结果一样,还是不断的重启动.<br />我修改过狗复位时间到10分钟,结果还是一样.自己估计应该不是狗狗的初始化<br />或则复位时间不够,但是就不知道原因.<br />敬请各位前辈指点指点,在此谢谢了!!!!!!!!!!!!!!!!!!!!!!<br />对了,模板是用的周立功的.不知道是不是中断问题.<br /><br /><br /><br />//---------------------------------------------------------------<br />#include&nbsp;&nbsp;&quot;config.h&quot;<br /><br />#define&nbsp;&nbsp;&nbsp;SPI_CS&nbsp;&nbsp;&nbsp;&nbsp;0x00000100&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;P0.8&nbsp;*/<br />#define&nbsp;&nbsp;&nbsp;SPI_DATA&nbsp;&nbsp;&nbsp;&nbsp;0x00000040&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;P0.6&nbsp;*/<br />#define&nbsp;&nbsp;&nbsp;SPI_CLK&nbsp;&nbsp;&nbsp;&nbsp;0x00000010&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;P0.4&nbsp;*/<br /><br />#define&nbsp;&nbsp;&nbsp;SPI_IOCON&nbsp;&nbsp;&nbsp;&nbsp;0x00000150&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;定义SPI接口的I/O设置字&nbsp;*/<br /><br />//---------------------------------------------------------------<br />void&nbsp;&nbsp;HC595_SendDat(uint8&nbsp;dat)<br />{&nbsp;&nbsp;uint8&nbsp;&nbsp;i;<br /><br />&nbsp;&nbsp;&nbsp;IO0CLR&nbsp;=&nbsp;SPI_CS;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;SPI_CS&nbsp;=&nbsp;0<br />&nbsp;&nbsp;&nbsp;for(i=0;&nbsp;i&lt8;&nbsp;i++)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;发送8位数据<br />&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;IO0CLR&nbsp;=&nbsp;SPI_CLK;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;SPI_CLK&nbsp;=&nbsp;0<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;设置SPI_DATA输出值&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(&nbsp;(dat&0x80)!=0&nbsp;)&nbsp;IO0SET&nbsp;=&nbsp;SPI_DATA;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;IO0CLR&nbsp;=&nbsp;SPI_DATA;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dat&nbsp;&lt&lt=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IO0SET&nbsp;=&nbsp;SPI_CLK;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;SPI_CLK&nbsp;=&nbsp;1<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;IO0SET&nbsp;=&nbsp;SPI_CS;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;SPI_CS&nbsp;=&nbsp;1,输出显示数据<br />}<br /><br />//---------------------------------------------------------------<br />void&nbsp;&nbsp;WdtFeed(void)<br />{&nbsp;&nbsp;WDFEED&nbsp;=&nbsp;0xAA;<br />&nbsp;&nbsp;&nbsp;WDFEED&nbsp;=&nbsp;0x55;<br />}<br />//---------------------------------------------------------------<br />void&nbsp;&nbsp;DelayNS(uint32&nbsp;&nbsp;dly)<br />{&nbsp;&nbsp;uint32&nbsp;&nbsp;i;<br /><br />&nbsp;&nbsp;&nbsp;for(;&nbsp;dly&gt0;&nbsp;dly--)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;&nbsp;i&lt1000;&nbsp;i++)WdtFeed();<br />}<br /><br />int&nbsp;&nbsp;main(void)<br />{&nbsp;&nbsp;uint8&nbsp;&nbsp;i;<br /><br />&nbsp;&nbsp;&nbsp;PINSEL0&nbsp;=&nbsp;0x00000000;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设置管脚连接GPIO&nbsp;<br />&nbsp;&nbsp;&nbsp;PINSEL1&nbsp;=&nbsp;0x00000000;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;IO0DIR&nbsp;=&nbsp;SPI_IOCON;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设置SPI控制口为输出,其它I/O为输入<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;WDTC&nbsp;=&nbsp;0xFF00;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设置WDTC,喂狗重装值<br />&nbsp;&nbsp;&nbsp;WDMOD&nbsp;=&nbsp;0x03;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设置并启动WDT<br />&nbsp;&nbsp;&nbsp;WdtFeed();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;进行喂狗操作&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;for(i=0;&nbsp;i&lt18;&nbsp;i++)&nbsp;<br />&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;HC595_SendDat(0x00);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DelayNS(5);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HC595_SendDat(0xFF);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DelayNS(5);<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;HC595_SendDat(0xFE);<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;while(1);&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;return(0);<br />}
zlgARM 发表于 2007-7-16 22:55 | 显示全部楼层

zhkxc

您好<br />&nbsp;&nbsp;&nbsp;&nbsp;先提供一些关于看门狗的关键信息。<br />&nbsp;&nbsp;&nbsp;&nbsp;看门狗是一个特殊的定时器,相对于普通定时器而言,它的特殊处在于溢出时无可选择地产生中断并且无法软件清除中断标志位,特殊处也在于它溢出时可产生复位,只有该复位才能清除中断标志位。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;不考虑其它复位源,并且看门狗定时器已经启动,那么能触发看门狗复位的因素一般只可能有二点:<br />&nbsp;&nbsp;&nbsp;&nbsp;1、错误的喂狗;<br />&nbsp;&nbsp;&nbsp;&nbsp;2、看门狗定时器溢出(往往由于主观上忘记喂狗,或者是主观上知道要喂狗,但是事实上没有喂狗。)<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;调试看门狗意外复位的情况,应该从这两个因素出发。<br />&nbsp;&nbsp;&nbsp;&nbsp;用户往往会忽视了几个地方的喂狗程序:<br />&nbsp;&nbsp;&nbsp;&nbsp;1、ISR里(ISR如用时太长,又没喂狗,看门狗定时器必然溢出);<br />&nbsp;&nbsp;&nbsp;&nbsp;2、所有延时程序里;<br />&nbsp;&nbsp;&nbsp;&nbsp;3、while&nbsp;(1)里。<br />&nbsp;&nbsp;&nbsp;&nbsp;从您提供的程序来看,很明显,您的这个程序必然触发看门狗定时器溢出。当程序的执行流执行到while&nbsp;(1)时,您的喂狗流程何在?<br />&nbsp;&nbsp;&nbsp;&nbsp;以上分析仅供参考,欢迎指正,谢谢!<br />&nbsp;&nbsp;&nbsp;&nbsp;
洪七公 发表于 2007-7-17 01:32 | 显示全部楼层

KEIL软件仿真可以找到出错的原因

  
 楼主| zhkxc 发表于 2007-7-18 12:37 | 显示全部楼层

谢谢 前辈

谢谢以上两位前辈的指点!!!<br /><br />没有你们的指点,我看书和写程序还会那么模糊;&nbsp;嘿嘿.我不用再逃避用狗狗了<br />再看开发板提供的详细资料,仔细看了&quot;伪中断&quot;讲得很仔细,很有收获.再看论坛以前发过的有关看门狗的主题.我采用了以下程序,问题得到基本解决,但是&quot;周立功开发板资料&quot;里面提到两个伪中断问题以及3种解决方案,我学习到第一种最好,可是我又自己能力还没有用那第一方案.暂时用以下程序,问题得到控制.<br />void&nbsp;ResetWDT()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;uint32&nbsp;tmp;<br />&nbsp;&nbsp;&nbsp;&nbsp;__asm<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MRS&nbsp;tmp,CPSR<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ORR&nbsp;tmp,tmp,#0x80<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MSR&nbsp;CPSR_c,tmp<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;WDFEED&nbsp;=&nbsp;0XAA;<br />&nbsp;&nbsp;&nbsp;&nbsp;WDFEED&nbsp;=&nbsp;0X55;<br />&nbsp;&nbsp;&nbsp;&nbsp;__asm<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MRS&nbsp;tmp,CPSR<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BIC&nbsp;tmp,tmp,#0x80<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MSR&nbsp;CPSR_c,tmp<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br />}<br />其实这就是采用的第2种解决方案(我的理解),在现在测试里面没有任何问题;等段时间产品的各种试验后看会有特殊情况发生不,理论上应该不会.哈哈.现在安心.<br /><br />再次谢谢zlgARM,洪七公两位前辈,继续看开发板资料学习,继续学习,继续学习,呵呵.<br /><br />仔细去再看伪中断,还模糊着呢.不逃避用看门狗,特别是无人职守产品;再多中断情况下,注适时的开关中断.
zlgARM 发表于 2007-7-18 16:41 | 显示全部楼层

zhkxc

您好!<br />&nbsp;&nbsp;&nbsp;不客气!也谢谢您提供了后续情况,最终的解决方案信息。
john1225cn 发表于 2011-10-20 18:17 | 显示全部楼层
受教了,谢谢!
午后苦丁茶 发表于 2011-10-24 10:02 | 显示全部楼层
看老贴,学知识。
riyuexing 发表于 2011-10-24 12:03 | 显示全部楼层
领教高手了,受益匪浅啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

15

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部