我试过了 没有成功 ……
下面是我的代码 只针对EINT0的调试
1. main.c
#include "utils.h"
#include "s3c6410_addr.h"
#include "interrupt.h"
void delay(void)
{
int i = 0;
for(i = 0; i <500000; i++);
}
void beep_init(void)
{
rGPFCON |= 1<<28;
rGPFCON &= ~(1<<29);
}
void beep_on(void)
{
rGPFDAT |= 1<<14;
}
void beep_off(void)
{
rGPFDAT &= ~(1<<14);
}
void beep(void)
{
beep_on();
delay();
beep_off();
delay();
}
void key_init(void)
{
/* rGPNCON = rGPNCON & ~(0xff << 0) | (0xaa << 0);//eint
rEINT0CON0 = rEINT0CON0 | (0x22 << 0);//both edge
rEINT0MASK = rEINT0MASK & ~(0xf);*/
rGPNCON |= 1<<1;
rGPNCON &= ~(1<<0);
rEINT0CON0 &= ~(1<<2);
rEINT0CON0 |= 1<<1;
rEINT0MASK &= ~(1<<0);
rVIC0INTENABLE |= 1<<0;
}
void key_isr(void) __irq
{
if(rEINT0PEND & 0x1)
Uart_Printf("EINT0 is occurred\n");
else if(rEINT0PEND & 0x2)
Uart_Printf("EINT1 is occurred\n");
else if(rEINT0PEND & 0x4)
Uart_Printf("EINT2 is occurred\n");
else if(rEINT0PEND & 0x8)
Uart_Printf("EINT3 is occurred\n");
else
Uart_Printf("no EINT\r\n");
//Uart_Printf("key interrupt occurred\n");
rEINT0PEND &= ~(16);
INTC_ClearVectAddr();
}
void _main(void)
{
beep_init();
Uart_Init();
Port_Init();
key_init();
INTC_Init();
INTC_SetIntISR(0,key_isr);
INTC_Enable(0);
while(1)
{
if(rVIC0IRQSTATUS &(1<<0))
{
beep();
}
rEINT0PEND &= 0x1;
//INTC_ClearVectAddr();
}
}
2. startup.s
INCLUDE s3c6410.inc
INCLUDE image_cfg.inc
INCLUDE MemParam_mDDR.inc
IMPORT _main ; C entrypoint for Steppingstone loader.
;------------------------------------------------------------------------------
;
; Memory Start Entry
;
; 内存里直接启动时入口
;
;------------------------------------------------------------------------------
; PRESERVE8 //因为我用的是rvds4,这句必不可少
AREA Init, CODE, READONLY
global MemStart
ENTRY
MemStart
mrc p15,0,r0,c1,c0,0
orr r0,r0,#(1<<24)
mcr p15,0,r0,c1,c0,0
b _main
end
-----------------------------------------------------------------
RO_BASE 0x50000000
Place at begining of image
Symbol: startup.o section: Init
-info totals -entry MemStart -ro-base 0x50000000 -first startup.o(Init)
--------------------------------------------------------------------------------------------------
vankee的代码 始终没有出来效果,然后我想知道EINT是否发生了,就修改了while里面的语句。
main函数里面的while循环 通过按键可以让beep()被执行,也就是蜂鸣会响,也就是说中断是触发了吧?
但是isr函数却始终没有跳跃过去啊……就是Uart打印没有出现啊。
各位高手能否帮忙看看,到底是不是
INTC_Init();
INTC_SetIntISR(0,key_isr);
INTC_Enable(0);
这三个函数以后,isr程序就就绪了,只等中断来,然后硬件通过VIC就执行isr了呢?没有其他地方应该修改调整的么?