打印

LPC看门狗中断问题

[复制链接]
4506|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 yueyinji1989 于 2012-10-24 12:38 编辑

你们好,我在学习看门狗中断的时候遇到这样个问题。
上电后,不断喂狗,LED6闪烁,当我按下KEY键后,停止喂狗,LED6停止闪烁了,进入中断,我在中断那里设置了LED7,进入中断就亮的,可是一直都不亮,怀疑是进不去中断。IRQ中断已经允许了。请问是什么问题呢?谢谢!
代码中蓝色,看门狗中断,并设置LED7亮;
红色,喂狗,LED6闪烁,LED7灭,等待中断。
源代码
————————————————
/**功能:****************************************************************************
* 文件名:WDT_INT.C
* 功能:循环喂狗,正常时LED6点亮,按下KEY1键就停止喂狗,是看门溢出产生中断
         蜂鸣器报警,LED7亮
* 说明:
****************************************************************************/
#include "Config.h"
#include "Target.h"
#include   <intrinsics.h>
#define LED7 (1 << 7)  // P0.7控制LED7
#define LED6    (1 << 6)          // P0.6控制LED6,低电平点亮
#define KEY1    (1 << 16)  // P0.16连接KEY1
#define WDT  0   // WDT中断号
/*
********************************************************************************************************
** 函数名称 : WDT_Int()
** 功能描述 : WDT中断服务函数。
** 入口参数 :无
** 出口参数 :无
*******************************************************************************************************
*/
void WDT_Int(void)
{
        uint32 i;
IO0CLR  = LED7;   // LED报警
for (i=0; i<0x7fFFf; i++);
IO0SET = LED7;
WDMOD  = 0x00;   // 清除看门狗超时位WDTOF
VICIntEnClear = 1 << WDT; // 看门狗溢出中断只能通过禁止VIC的方式返回
VICVectAddr = 0x00;
}

/****************************************************************************
* 名称:main()
* 功能:循环喂狗,如果按下KEY1键就停止喂狗,看门狗溢出产生中断
****************************************************************************/
int  main(void)
{  uint32 i, j;
   TargetResetInit();//仿真时目标板不需要初始化,此语句需要屏蔽
    PINSEL0=0X0;
    PINSEL1=0X0;
    IO0DIR =0XC0;
    IO0SET = LED7;
    IO0SET=LED6;   
       /* 中断初始化 */
VICIntSelect = 0x00000000;  // 连接所有中断到向量中断
VICVectCntl0 = 0x20 | WDT;  // 分配WDT中断到slot0
VICVectAddr0 = (int)WDT_Int;  // 中断服务程序地址
WDMOD = 0x00;    // 清除看门狗超时位WDTOF
VICIntEnable = (1 << WDT);  // 中断使能
/* 初始化看门狗 */
WDTC  = 0x6006;    // 设定看门狗超时值
WDMOD = 0x01;    // 看门狗中断使能
        WDFEED = 0xAA;    // 第一次喂狗启动WDT
WDFEED = 0x55;
__enable_irq();
while (1)
{ /* 周期性喂狗,如果KEY1按下,就停止喂狗 */
       while((IO0PIN & KEY1) == 0);
        for(j = 0; j < 0xff; j++)
        {   /* 循环喂狗 */
            for(i = 0; i < 0x0FFF; i++);
            WDFEED = 0xAA;
  WDFEED = 0x55;
               
     }
        /* 闪烁LED6 */
        if((IO0SET & LED6) == 0) IO0SET = LED6;
          else IO0CLR = LED6;
                 IO0SET= LED7;  //关掉LED7
}
}

相关帖子

沙发
阿南| | 2012-10-24 12:09 | 只看该作者
看产生中断后是否跑飞,如果跑飞检查中断向量表是否有问题。

使用特权

评论回复
板凳
yueyinji1989|  楼主 | 2012-10-24 14:41 | 只看该作者
查了很久,仿真调试时,就是在KEY1按下那里停住了,是否是在这里跑飞了?那如何检查中断向量表呢?
2# 阿南

使用特权

评论回复
地板
阿南| | 2012-10-24 14:46 | 只看该作者
在仿真环境界面,切换到混合模式,可以看到C语言对应的汇编及PC地址,查看目前PC指那里去了,或者KEY那里到底为何停住。

使用特权

评论回复
5
yueyinji1989|  楼主 | 2012-10-24 15:18 | 只看该作者
看到了,但是如何改呢?
下图
4# 阿南

QQ截图20121024151638.jpg (26.33 KB )

QQ截图20121024151638.jpg

使用特权

评论回复
6
阿南| | 2012-10-24 16:58 | 只看该作者
你再单步执行看看,是否一直在这个while下循环,如果循环说明你的KEY一直保持在低状态,IO读有问题。

使用特权

评论回复
7
yueyinji1989|  楼主 | 2012-10-24 17:30 | 只看该作者
本帖最后由 yueyinji1989 于 2012-10-24 17:37 编辑

是的,单步之后继续在原地,我修改IO口后还是一样,请问要怎么解决呢?
高电平的时候,跳出while,继续喂狗,灯闪烁,当KEY打下进入低电平时,就是一直在while那里了。
6# 阿南

使用特权

评论回复
8
阿南| | 2012-10-24 20:33 | 只看该作者
KEY一直保持低电平吗?如果一直是低电平,那么在While里执行是正常情况。
那么此时你的看门狗中断应该还没有使能,所以重点去查看门狗中断的问题,仔细对一下配置。

使用特权

评论回复
9
yueyinji1989|  楼主 | 2012-10-25 09:09 | 只看该作者
VICIntSelect = 0x00000000;  // 连接所有中断到向量中断
VICVectCntl0 = 0x20 | WDT;  // 分配WDT中断到slot0
VICVectAddr0 = (int)WDT_Int;  // 中断服务程序地址


VICIntEnable = (1 << WDT);  // 中断使能,WDT=0

这里不是已经使能了么?


8# 阿南

使用特权

评论回复
10
阿南| | 2012-10-25 09:29 | 只看该作者
单步调试时到while时,查看一下CPSR寄存器看IRQ中断是否已经使能。

使用特权

评论回复
11
yueyinji1989|  楼主 | 2012-10-25 09:55 | 只看该作者
从开始一步步单步调试的时候,IRQ使能已经开启了,到了while那里单步的时候就一直停留在那里,没显示寄存器的值,就如上面截的那个图一样。
10# 阿南

使用特权

评论回复
12
阿南| | 2012-10-25 12:58 | 只看该作者
把CPSR状态寄存器窗口打开要看

使用特权

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

本版积分规则

42

主题

281

帖子

0

粉丝