板子: tiny6410,很多人都写过NAND启动的中断裸板,再写就不好玩了
启动代码 :
.globl _start
_start:
ldr sp, =0x0c002000
bl clock_init
bl ddr_init
ldr sp, =0x57000000
bl init_uart
/* 重定位 */
adr r0, _start /* _start指令的当前地址 */
ldr r1, =_start /* _start指令的链接地址 */
ldr r2, =bss_start /* bss段的起始链接地址 */
cmp r0, r1
beq clean_bss
copy_loop:
ldr r3, [r0], #4
str r3, [r1], #4
cmp r1,r2
bne copy_loop
clean_bss: /* 清除BSS段 */
ldr r0, =bss_start
ldr r1, =bss_end
mov r3, #0
cmp r0, r1
ldreq pc, =on_ddr
clean_loop:
str r3, [r0], #4
cmp r0, r1
bne clean_loop
ldr pc, =on_ddr
on_ddr:
ldr sp, =0x56000000
mrs r0, cpsr
bic r0,r0,#0x9f /* 清cpsr的I位,M4~M0 打开中断总开关 */
orr r0,r0,#0x12
msr cpsr,r0 /* 进入irq mode */
ldr sp, =0x55000000 /* 设置irq模式的栈 */
bl irq_init
mrs r0, cpsr
bic r0,r0,#0x9f /* 开总的中断开关,清M4~M0 */
orr r0,r0,#0x10 /* 进入usr模式 */
ldr sp, =0x54000000
ldr pc, =main // 打印main....,然后流水灯
halt:
b halt
.global irq
irq:
/* 1.保存现场 */
ldr sp, =0x53000000
bl debug // 这里打印 “debug ”
sub lr, lr, #4
stmdb sp!, {r0-r12, lr} /* lr 入栈 */
bl do_irq /* 2.处理异常 */
/* 3.恢复现场 */
ldmia sp!, {r0-r12, pc}^ /* 出栈,lr赋给pc */
irq_init :
int irq_init(void)
{
printf("irq_init A: \n\r");
/* 设置GPIO为外部中断 */
GPNCON &=~(0xfff);
GPNCON |= 0xaaa;
printf("irq_init B: \n\r");
/* 设置中断触发方式: 双边沿触发 */
EINT0CON0 &= ~(0xfff);
EINT0CON0 |= 0x777; /* k1-k6 */
EINT0PEND = 0x3ff; /* 使能中断之前先清中断 */
VIC0ADDRESS = 0;
EINT0MASK &=~(0x3f); /* 使能中断 */
/* 在中断控制器VIC0里使能这些中断
* EINT0-3 : VIC[0],EINT4-11:VIC[1]
*/
VIC0INTENABLE |= (0x3);
VIC0VECTADDR0 = (int)irq; /* 设置ISR地址 */
printf("irq_init C: \n\r");
VIC0VECTADDR1 = (int)irq;
}
现象: 将SD卡插上板子 SDBOOT ,灯流起来了 串口也有打印main....... irq_init A, irq_init B, irq_init C,却不能打印debug,也就是没进入中断,
当按下按键k1-k6时,流水灯突然就停住了 ,重启板子, 灯又流起来了
好怪;怀疑SD启动时 中断是不能用的 ,因为发生中断时,不知道跳转到哪里去执行
好奇怪,求助大神!