主题 : 6410 SD卡启动的中断代码老不成功 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 98546
精华: 0
发帖: 6
金钱: 30 两
威望: 6 点
综合积分: 12 分
注册时间: 2013-11-29
最后登录: 2013-12-19
楼主  发表于: 2013-12-16 10:00

 6410 SD卡启动的中断代码老不成功


板子: 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启动时 中断是不能用的 ,因为发生中断时,不知道跳转到哪里去执行
好奇怪,求助大神!