打印

2440中断过程与2410中断过程有什么不同吗?

[复制链接]
1798|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xiaowu5016|  楼主 | 2009-5-16 10:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我按照阿南给的按键中断例子改了下按键的中断口而已
然后下载到2440上运行,但是就是没有反应,经自己检查,好像没有错误了

#include "def.h"
#include "option.h"
#include "2440addr.h"
#include "2440lib.h" 
//#include "uart.h" 

#define KEY1 (1 << 0)//GPF0,EINT0
#define KEY2 (1 << 2)//GPF2,EINT2
#define KEY3 (1 << 3)//GPG3,EINT11
#define KEY4 (1 << 11)//GPG11,EINT19


#define LED1 (1 << 4)//GPF4
#define LED2 (1 << 5)//GPF5
#define LED3 (1 << 6)//GPF6
#define LED4 (1 << 7)//GPF7 



/*******************************************************************************************
函数原形:void __irq IRQ_KEY(void)
功能描述:键盘中断处理程序,当产生键盘中断后将读取键值,重新刷新LED显示
参    数:无            
*******************************************************************************************/
 void __irq IRQ_KEY(void)
{
   // unsigned int i;
    ClearPending(BIT_EINT8_23);
    rEINTPEND = 0xffffff;
    rGPGCON = rGPGCON & (~((3 << 6) | (3 << 22)));//设置为输入状态
    if (rGPGDAT & KEY3){
        rGPFDAT |= LED3; 
    }
    else {
        rGPFDAT &= ~LED3; 
    }
    if (rGPGDAT & KEY4){
        rGPFDAT |= LED4; 
    }
    else {
        rGPFDAT &= ~LED4; 
    }
    rGPGCON |= ((2 << 6) | (2 << 22));//重新设置外部中断输入功能
}
 
/*******************************************************************************************
函数原形:void __irq IRQ_KEY(void)
功能描述:键盘中断初始化,将按键输入管脚设置成外部中断输入功能,双边沿触发,IRQ中断模式
参    数:无            
*******************************************************************************************/
void EINT_Init(void)
{  
    //==============================设置IO口为中断输入模式=============================
    rGPGCON &= (~((3 << 6) | (3 << 22)));//将相应位清零
    rGPGCON |= ((2 << 6) | (2 << 22));
    //rGPGCON[23:22],[7:6]=10b,即GPG[11,9]为外部中断输入功能
    //=================================================================================
    
    //===============================设置外部中断控制寄存器=======================
     
    rEXTINT1 = rEXTINT1 & (~(7 << 12)) | (6 << 12);//EINT11下降沿触发中断
    rEXTINT2 = rEXTINT2 & (~(7 << 12)) | (6 << 12);//EINT19下降沿触发中断    
    //============================================================================
    

    pISR_EINT8_23 = (unsigned int)IRQ_KEY;//中断服务程序入口
    
    
    rPRIORITY = 0x00000000;        // 使用默认的固定的优先级
    ClearPending(BIT_EINT8_23); // 清除中断标志位

    rEINTPEND = 0xffffff;       //清除外部中断未决寄存器的全部位
    rINTMOD = 0x00000000;        // 所有中断均为IRQ中断
    rINTMSK &= (~BIT_EINT8_23); //使能外部中断0,2,8_23 
    rEINTMASK &= (~((1 << 11) | (1 << 19)));  //使能EINT11,EINT19
}

void Main(void)
{
    


    
    rGPFCON = (rGPFCON & 0x00ff) | 0x5500;//设置GPF[7:4](LED[4:1])为输出功能
    rGPFDAT |= LED1 | LED2 | LED3 | LED4;
    EINT_Init();
    while (1);
    
} // end of main(...) 

相关帖子

沙发
阿南| | 2009-5-16 16:47 | 只看该作者

基本相同,分析中断就要进入汇编代码,否则没有意义

调试时,最好是在IRQ的中断入口0x18处设置一个断点,然后单步的调试分析它是如何一步步执行到您最终的中断服务程序的

使用特权

评论回复
板凳
xiaowu5016|  楼主 | 2009-5-18 20:41 | 只看该作者

请问中断里面的INTPND寄存器怎么理解

S3C2440的数据手册里面说INTPND只有一位设置成1,这个怎么理解
如果我有中断0和中断2,那怎么设置呢?

使用特权

评论回复
地板
myitlover| | 2009-5-24 14:59 | 只看该作者

你只是写了个中断8~23的服务程序

#define KEY1 (1 << 0)//GPF0,EINT0
#define KEY2 (1 << 2)//GPF2,EINT2

这两个用的是外部中断0和2
程序里没有对应的中断服务程序,当然没反应了

使用特权

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

本版积分规则

18

主题

67

帖子

0

粉丝