管理提醒: 本帖被 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);
}
}