打印
[ZLG-ARM]

LPC21XX外部中断问题。。

[复制链接]
2927|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wyh1989|  楼主 | 2010-10-25 21:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我编写了一个 外部中断程序,,,可是,我设置的是低电平触发,但是却不触发,如果我换成高电平触发,就不停的触发,,,,这是怎么回事啊????我的程序没问题,都是在 书上一行一行抄的!!!!绝对没问题,,,电路也没问题,,,可是怎么回事呢???是不是外部中断存在BUG啊????大家有没有遇到同样情况的啊??指教小弟下吧,,,,谢谢了。。。。。

相关帖子

沙发
wyh1989|  楼主 | 2010-10-26 08:55 | 只看该作者
可能是我说的太片面了,大家看不懂,我说的详细点。。
程序的功能很简单,就是外部中断0的两个引脚P0.1和P0.16我同时使用,之后我想判断是哪一个引脚触发了中断,,,,设置的是高电平触发,,,,但是怪事就是,一个引脚为高电平的时候,中断不触发,必须是有两个引脚同时为高电平,它才触发!!!这是怎么回事呢??按书上说的,多个引脚触发中断时,是相或的,所以一个引脚接高,另一个就肯定输出高电平了,为什么两个要同时接高电平呢???
还有一点就是,我在中断函数中,判断是哪个引脚触发的时候,使用的方法是将P0.1和P0.16引脚转换为GPIO模式,之后再进行读取,因为看书上说,IOPIN这个寄存器是GPIO功能时才能有效使用的,所以,我就转换为GPIO了,之后在中断程序的结尾,我又将这两个引脚转回了外部中断,大家有没有什么好的判断方法呢???我的方法有问题吗???即使没问题也过于繁琐了吧??!!!
程序如下:
#include "lpc21xx.h"
#define        uint8        unsigned char
#define uint16        unsigned int               
#define        uint32        unsigned long

void IRQ_eint0()  __irq
{
        PINSEL0=PINSEL0&0xFFFFFFF3;          //设置为 GPIO功能
        PINSEL1=PINSEL1&0xFFFFFFFC;           //设置为 GPIO功能
        IODIR0=IODIR0&0xFFFEFFFD;  //检测IO口的电平值,从而判断哪一个引脚触发了中断

        if(IOPIN0&2)//判断P0.1是否按下
                {  
                        if(IOPIN0&1)           //对LED灯取反
                                   {
                                         IOCLR0=1;                 
                                         
                                }
                         else
                                 {
                                        IOSET0=1;
                                       
                                }
                }

         if(IOPIN0&65536)//判断P0.16是否按下
                 {
                        if(IOPIN0&4)
                                {
                                        IOCLR0=4;         //对LED灯取反
                                       
                                }
                         else
                                 {
                                        IOSET0=4;
                                       
                                }
                }
        PINSEL0=PINSEL0|3<<2;                //恢复到第一个中断触发引脚P0.1
        PINSEL1=(PINSEL1|1)&0xFFFFFFFD;//恢复到第二个中断触发引脚P0.16   
       
        while( (EXTINT&1)!=0 )
                   {         
                                EXTINT = 0x0F;  // 清除EINT0中断标志
                   }
        VICVectAddr=0;
}       

void main()
{
        PINSEL0=(PINSEL0&0x0FFFFFFFC)&0x0FFFFFFCF;  //P0.0=GPIO  P0.2=GPIO        
        IODIR0=IODIR0|5;//设置P0.0  和  P0.2  方向输出
        IOSET0=5; //输出给LED灯

        PINSEL0=PINSEL0|3<<2;                //第一个中断触发引脚P0.1
        PINSEL1=(PINSEL1|1)&0xFFFFFFFD;//第二个中断触发引脚P0.16
        EXTMODE=EXTMODE&0x0FE;                //外部中断0 电平触发
        EXTPOLAR=EXTPOLAR|1;        //外部中断0 高电平触发
        VICIntSelect=VICIntSelect&0xFFFFBFFF;//ENT0 是IRQ
        VICVectCntl0=0x2E;                  //ENTO 分配 最高优先级
        VICVectAddr0=(uint32)IRQ_eint0;        //ENT0 的中断函数地址
       
        EXTINT=0x0F;  //清0 外部中断标志位                               
        VICIntEnable=1<<14;                         //ENT0 中断使能
        while(1);                                                       
}

使用特权

评论回复
板凳
wyh1989|  楼主 | 2010-10-26 09:10 | 只看该作者
这是我的电路图,开始的时候,引脚全部接地:

之后当一个引脚接高电平的时候,没有任何反应:

只有在两个引脚都为高电平的时候,才能触发中断,而我设置的是“高电平触发”:



大家说,是不是我的电路图有点毛病啊???大家指教,谢谢了!!!



我图片没传上去,不好意思,,,,我的两个引脚各接了一个双掷开关,就是开始的时候“接地”,之后为了触发中断,在开关的另一端接了上拉电阻,,,,这电路有问题吗????

使用特权

评论回复
地板
wyh1989|  楼主 | 2010-10-26 09:13 | 只看该作者
对了,刚才看别人的帖子,说什么 “勘误表”,就是LPC硬件的BUG,,,大家说,我这个问题是不是硬件 的问题呢????大家谁有LPC2100的中文勘误表啊??   我只能找到英文的,中文的找不到。。。。

使用特权

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

本版积分规则

0

主题

7

帖子

1

粉丝