打印
[ZLG-ARM]

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

[复制链接]
1747|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
AARON238|  楼主 | 2008-7-17 12:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#define WDT     0            // WDT中断号

#define  WDTTIMES     5            // WDT 时间S

/**********************************************************************************************
功能:进入临界段。
入口参数:无。
返回:无。
备注:该函数使用的是将中断分配寄存器清0的方法来关中断。比起用软中断,运行速度要快。
      如果要开某个中断,则应该先调用一次该函数,然后再修改中断备份变量CopyOfVICIntEnable
      的值,而不能直接修改VICIntEnable的值。否则会出错。
**********************************************************************************************/
void IRQDisable(void)
{
if(OSEnCrCount==0)   //如果前面未关中断
  {
   IRQREG = VICIntEnable ;
   VICIntEnClr=0xFFFFFFFF;           //将VICIntEnable清除,禁止中断
  }
OSEnCrCount++;  //进入临界段次数加1
}
//////////////////////////////////End of function//////////////////////////////////////////////


/**********************************************************************************************
功能:退出临界段
入口参数:无。
返回:无。
备注:无。
**********************************************************************************************/
void IRQEnable(void)
{
if(OSEnCrCount>=1)  //如果进入临界段的次数大于等于1次
  {
   OSEnCrCount--;    //则次数减1
   if(OSEnCrCount==0)  //如果减次数减到0,则要开中断
    {
     VICIntEnable = IRQREG ;
     //打开所需要开的中断
    }
  }
}
/*
*********************************************************************************************************
** 函数名称 :WDT_Int()
** 函数功能 :看门狗中断服务程序
** 入口参数 :无
** 出口参数 :无
*********************************************************************************************************
*/
void __irq WDT_Int (void)
{
WDMOD  = 0x00 ;                        // 清除看门狗超时位WDTOF
VICIntEnClr = 1 ;                // 看门狗溢出中断只能通过禁止VIC的方式返回
VICVectAddr = 0x00;                    // 通知VIC中断结束
}


//喂狗涵数两秒种之内调用一次
void WEIWDT(void)
{
IRQDisable();
  WDFEED = 0xAA;                // 看门狗喂狗
  WDFEED = 0x55;
IRQEnable();
}

//看门狗设置
 void WDTinit(void)
 {
 WDTC = 15000000 * WDTTIMES ;
 WDMOD = 0x03 ;
  //WDMOD = 0x01 ; //看门狗中断使能位(只能置位)
 //WDMOD = 0x03 ; //看门狗复位使能位/ 中断使能位(只能置位)
 WDFEED = 0xaa ;
 WDFEED = 0x55 ;

 VICVectCntl12 = 0x20 | WDT;            // 分配WDT中断到slot0
 VICVectAddr12 = (uint32)WDT_Int;        // 中断服务程序地址
 VICIntEnable = 1 << WDT;            // 中断使能
 }

相关帖子

沙发
AARON238|  楼主 | 2008-7-17 12:48 | 只看该作者

帮帮忙吧

帮帮忙吧!!各位大哥!

使用特权

评论回复
板凳
AARON238|  楼主 | 2008-7-17 14:56 | 只看该作者

没人回答啊??

使用特权

评论回复
地板
aaron238| | 2008-7-18 13:29 | 只看该作者

都没人帮忙???

已经解决了!用软件中断
//喂狗涵数
void __swi(0) WEIWDT (void) ;   
void  __SWI_0  (void)
{
  WDFEED = 0xAA;                // 看门狗喂狗
  WDFEED = 0x55;
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

56

主题

487

帖子

1

粉丝