主题 : 请求关于裸机程序 中断例子的问题 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 91999
精华: 0
发帖: 8
金钱: 45 两
威望: 9 点
综合积分: 16 分
注册时间: 2013-05-21
最后登录: 2013-07-01
楼主  发表于: 2013-06-09 10:39

 请求关于裸机程序 中断例子的问题

管理提醒: 本帖被 xoom 从 友善之臂官方客服中心 移动到本区(2013-06-13)
新买210开发板,学习到中断例子 15.int 时遇到问题,求解。
问题及现象:
例子只用了Eint16接收第一个按键的中断,我想改成同时用Eint17接收第二个按键的中断,增加了相应代码(isr_key2等),经过多次实验还是不行。第二按键能触发中断,但不执行isr_key2中断服务程序,仍然执行isr_key1的中断服务,即不管我按哪个按键,都只执行isr_key1这个中断服务,不知为什么会这样,求解。

下面是代码:

#include "stdio.h"
#include "int.h"


#define     GPH2CON     (*(volatile unsigned long *) 0xE0200C40)
#define     GPH2DAT        (*(volatile unsigned long *) 0xE0200C44)

#define     GPH2_0_EINT16     (0xf<<(0*4))
#define     GPH2_1_EINT17     (0xf<<(1*4))
#define     GPH2_2_EINT18     (0xf<<(2*4))
#define     GPH2_3_EINT19     (0xf<<(3*4))

#define        EXT_INT_0_CON              ( *((volatile unsigned long *)0xE0200E00) )
#define        EXT_INT_1_CON              ( *((volatile unsigned long *)0xE0200E04) )
#define        EXT_INT_2_CON              ( *((volatile unsigned long *)0xE0200E08) )
#define        EXT_INT_3_CON              ( *((volatile unsigned long *)0xE0200E0C) )

#define        EXT_INT_0_MASK           ( *((volatile unsigned long *)0xE0200F00) )
#define        EXT_INT_1_MASK           ( *((volatile unsigned long *)0xE0200F04) )
#define        EXT_INT_2_MASK           ( *((volatile unsigned long *)0xE0200F08) )
#define        EXT_INT_3_MASK           ( *((volatile unsigned long *)0xE0200F0C) )

#define        EXT_INT_0_PEND           ( *((volatile unsigned long *)0xE0200F40) )
#define        EXT_INT_1_PEND           ( *((volatile unsigned long *)0xE0200F44) )
#define        EXT_INT_2_PEND           ( *((volatile unsigned long *)0xE0200F48) )
#define        EXT_INT_3_PEND           ( *((volatile unsigned long *)0xE0200F4C) )

void uart_init();
void buzzer_init();//自己添加的
void buzzer_on();//自己添加的
void buzzer_off();//自己添加的



// 延时函数
void delay(unsigned long count)
{
    volatile unsigned long i = count;
    while (i--);
}

void isr_key1(void)
{
    printf("we get company:EINT16_31,key1 press\r\n");    
    // clear VIC0ADDR
    intc_clearvectaddr();                    
    // clear pending bit    
    EXT_INT_2_PEND |= 1<<0;        
    buzzer_on();//自己添加的
    delay(100000);//自己添加的
    buzzer_off();//自己添加的
}

void isr_key2(void)//自己添加的
{
    printf("we get company:EINT17_31,key2 press\r\n");    
    // clear VIC0ADDR
    intc_clearvectaddr();                    
    // clear pending bit    
    EXT_INT_2_PEND |= 1<<1;        
    buzzer_on();
    delay(1000000);
    buzzer_off();
}

int main(void)
{
    int c = 0;

    // 初始化串口
    uart_init();

    //初始化蜂鸣器
    buzzer_init();//自己添加的

    // 中断相关初始化
    system_initexception();                        
    
    printf("**************Int test *************** \r\n");

    // 外部中断相关的设置
    // 1111 = EXT_INT[16]
    GPH2CON |= 0xF;    
    GPH2CON |= GPH2_1_EINT17;    //自己添加的
    // 010 = Falling edge triggered
    EXT_INT_2_CON |= 1<<1;    
    EXT_INT_2_CON |= 1<<5;//自己添加的
    // unmasked
    EXT_INT_2_MASK &= ~(1<<0);
    EXT_INT_2_MASK &= ~(1<<1);//自己添加的
    
    // 设置中断EINT16_31的处理函,NUM_EINT16_31=16
    intc_setvectaddr(NUM_EINT16_31, isr_key1);    
    // 使能中断EINT16_31
    intc_enable(NUM_EINT16_31);
    // 设置中断EINT17_31的处理函,NUM_Reserved17=17//自己添加的
    intc_setvectaddr(NUM_Reserved17, isr_key2);
    // 使能中断EINT17_31//自己添加的
    intc_enable(NUM_Reserved17);
    
    while (1)
    {  
        printf("%d\r\n",c++);
        delay(0x100000);
    }
}
级别: 侠客
UID: 89673
精华: 0
发帖: 52
金钱: 260 两
威望: 52 点
综合积分: 104 分
注册时间: 2013-04-01
最后登录: 2016-06-30
1楼  发表于: 2013-11-22 16:25