Startup
INCLUDE s3c6410.inc
IMPORT _main ; C entrypoint for Steppingstone loader.
IMPORT _do_irp
EXPORT asm_handle_irq
AREA |C$$code|, CODE, READONLY
ENTRY
global Start
global asm_handle_irq
Start
;------------------------------------
; Disable WatchDog Timer
; 关闭看门狗复位
;------------------------------------
ldr r0, =WTCON
ldr r1, =0x0
str r1, [r0]
; open the vector
mrs r0,cpsr
orr r0 ,r0,#0x00000080
msr cpsr_c,r0
;------------------------------------
; Enable VIC Port @Andrew Huang
;------------------------------------
mrc p15,0,r0,c1,c0,0
orr r0,r0,#(1<<24)
mcr p15,0,r0,c1,c0,0
b _main
asm_handle_irq
mov sp,#0x52000000 ; 设置堆栈指针
sub lr,lr,#4 ; 修正返回地址
stmfd sp!,{r0-r3,r12,lr} ; 保存程序执行现场
bl _do_irp ; 跳入中断处理程序
ldmfd sp!,{r0-r3,r12,pc} ; 恢复程序执行现场,返回继续执行
DCB "ABCDabcd"
END
中断初始化函数
void vector_init(void)
{
//配置按键外部中断模式
rGPNCON = (rGPNCON & ~(0xffU << 0))|(0xaaU<<0);
rGPNPUD = (rGPNPUD & ~(0xffU << 0))|(0x00U<<0); //禁止上拉/下拉电阻
/*外部中断控制部分*/
//配置按键外部中断触发方式,边沿触发方式01x
rEINT0CON0 |=0x00000033 ;
//EINT0过滤使能[0-7] 7、6=1
rEINT0FLTCON0 |=0x000000CC ;//使能过滤器 选择数字滤波器
//使能外部中断EINT0
rEINT0MASK &=0xFFFFFFF0 ;
//清除外部中断标志位
rEINT0PEND=0x0000000F;
rPRIORITY =0xffffffff;
/*VIC0控制部分*/
//配置中断使能寄存器 GPN0属于VIC0,对应于VIC0中的00寄存器
rVIC0INTENABLE |=0x0000000F ;
//中断选择寄存器,是置为IRQ 还是FRQ
rVIC0INTSELECT &=0xFFFFFFF0; //设置IRQ模式,其实可以不设,上电自动复位
//设置中断服务程序
VIC0VECTADDR=asm_handle_irq;
}
中断服务函数
void _do_irp(void)
{
//show
Uart_SendByte('o');
rVIC0SOFTINTENCLEAR |=0xf;
//clear interrupt pending srf
rEINT0PEND|=0x0000000f; //该位写入1表示清除,写0无影响
rVIC0IRQSTATUS = (rVIC0IRQSTATUS & ~(0x1U << 0))|(0x00U<<0); //禁止上拉/下拉电阻
//清除VICXADDRESS
rVIC0ADDRESS=0x00000000; //向寄存器写入任何值都可以清除当前中断。只有在终端服务快要结束的时候才可以进行写入操作。
rVIC1ADDRESS=0x00000000; //向寄存器写入任何值都可以清除当前中断。只有在终端服务快要结束的时候才可以进行写入操作。
// (*(volatile unsigned long *)(0x71200f00))=0;
}
主函数里面什么都没有做
我不知道自己错在什么地方了,为什么触发不了中断。