[ZLG-ARM] 怎么在 C 里关闭中断! 我用的 WDT 这样关不行??帮忙分析下?

[复制链接]
 楼主| AARON238 发表于 2008-7-17 12:45 | 显示全部楼层 |阅读模式
#define&nbsp;WDT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;WDT中断号<br /><br />#define&nbsp;&nbsp;WDTTIMES&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;WDT&nbsp;时间S<br /><br />/**********************************************************************************************<br />功能:进入临界段。<br />入口参数:无。<br />返回:无。<br />备注:该函数使用的是将中断分配寄存器清0的方法来关中断。比起用软中断,运行速度要快。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果要开某个中断,则应该先调用一次该函数,然后再修改中断备份变量CopyOfVICIntEnable<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;的值,而不能直接修改VICIntEnable的值。否则会出错。<br />**********************************************************************************************/<br />void&nbsp;IRQDisable(void)<br />{<br />if(OSEnCrCount==0)&nbsp;&nbsp;&nbsp;//如果前面未关中断<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;IRQREG&nbsp;=&nbsp;VICIntEnable&nbsp;;<br />&nbsp;&nbsp;&nbsp;VICIntEnClr=0xFFFFFFFF;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//将VICIntEnable清除,禁止中断<br />&nbsp;&nbsp;}<br />OSEnCrCount++;&nbsp;&nbsp;//进入临界段次数加1<br />}<br />//////////////////////////////////End&nbsp;of&nbsp;function//////////////////////////////////////////////<br /><br /><br />/**********************************************************************************************<br />功能:退出临界段<br />入口参数:无。<br />返回:无。<br />备注:无。<br />**********************************************************************************************/<br />void&nbsp;IRQEnable(void)<br />{<br />if(OSEnCrCount&gt=1)&nbsp;&nbsp;//如果进入临界段的次数大于等于1次<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;OSEnCrCount--;&nbsp;&nbsp;&nbsp;&nbsp;//则次数减1<br />&nbsp;&nbsp;&nbsp;if(OSEnCrCount==0)&nbsp;&nbsp;//如果减次数减到0,则要开中断<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VICIntEnable&nbsp;=&nbsp;IRQREG&nbsp;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//打开所需要开的中断<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;}<br />}<br />/*<br />*********************************************************************************************************<br />**&nbsp;函数名称&nbsp;:WDT_Int()<br />**&nbsp;函数功能&nbsp;:看门狗中断服务程序<br />**&nbsp;入口参数&nbsp;:无<br />**&nbsp;出口参数&nbsp;:无<br />*********************************************************************************************************<br />*/<br />void&nbsp;__irq&nbsp;WDT_Int&nbsp;(void)<br />{<br />WDMOD&nbsp;&nbsp;=&nbsp;0x00&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;清除看门狗超时位WDTOF<br />VICIntEnClr&nbsp;=&nbsp;1&nbsp;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;看门狗溢出中断只能通过禁止VIC的方式返回<br />VICVectAddr&nbsp;=&nbsp;0x00;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;通知VIC中断结束<br />}<br /><br /><br />//喂狗涵数两秒种之内调用一次<br />void&nbsp;WEIWDT(void)<br />{<br />IRQDisable();<br />&nbsp;&nbsp;WDFEED&nbsp;=&nbsp;0xAA;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;看门狗喂狗<br />&nbsp;&nbsp;WDFEED&nbsp;=&nbsp;0x55;<br />IRQEnable();<br />}<br /><br />//看门狗设置<br />&nbsp;void&nbsp;WDTinit(void)<br />&nbsp;{<br />&nbsp;WDTC&nbsp;=&nbsp;15000000&nbsp;*&nbsp;WDTTIMES&nbsp;;<br />&nbsp;WDMOD&nbsp;=&nbsp;0x03&nbsp;;<br />&nbsp;&nbsp;//WDMOD&nbsp;=&nbsp;0x01&nbsp;;&nbsp;//看门狗中断使能位(只能置位)<br />&nbsp;//WDMOD&nbsp;=&nbsp;0x03&nbsp;;&nbsp;//看门狗复位使能位/&nbsp;中断使能位(只能置位)<br />&nbsp;WDFEED&nbsp;=&nbsp;0xaa&nbsp;;<br />&nbsp;WDFEED&nbsp;=&nbsp;0x55&nbsp;;<br /><br />&nbsp;VICVectCntl12&nbsp;=&nbsp;0x20&nbsp;|&nbsp;WDT;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;分配WDT中断到slot0<br />&nbsp;VICVectAddr12&nbsp;=&nbsp;(uint32)WDT_Int;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;中断服务程序地址<br />&nbsp;VICIntEnable&nbsp;=&nbsp;1&nbsp;&lt&lt&nbsp;WDT;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;中断使能<br />&nbsp;}
 楼主| AARON238 发表于 2008-7-17 12:48 | 显示全部楼层

帮帮忙吧

帮帮忙吧!!各位大哥!
 楼主| AARON238 发表于 2008-7-17 14:56 | 显示全部楼层

没人回答啊??

  
aaron238 发表于 2008-7-18 13:29 | 显示全部楼层

都没人帮忙???

已经解决了!用软件中断<br />//喂狗涵数<br />void&nbsp;__swi(0)&nbsp;WEIWDT&nbsp;(void)&nbsp;;&nbsp;&nbsp;&nbsp;<br />void&nbsp;&nbsp;__SWI_0&nbsp;&nbsp;(void)<br />{<br />&nbsp;&nbsp;WDFEED&nbsp;=&nbsp;0xAA;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;看门狗喂狗<br />&nbsp;&nbsp;WDFEED&nbsp;=&nbsp;0x55;<br />}<br />
您需要登录后才可以回帖 登录 | 注册

本版积分规则

57

主题

488

帖子

1

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