主题 : tiny6410 裸机中断程序 不能触发中断 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 67317
精华: 0
发帖: 1
金钱: 5 两
威望: 1 点
贡献值: 0 点
综合积分: 2 分
注册时间: 2012-04-10
最后登录: 2012-04-23
楼主  发表于: 2012-04-18 15:28

 tiny6410 裸机中断程序 不能触发中断

   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;
}
主函数里面什么都没有做
我不知道自己错在什么地方了,为什么触发不了中断。
共同进步
级别: 新手上路
UID: 67586
精华: 0
发帖: 5
金钱: 25 两
威望: 5 点
贡献值: 0 点
综合积分: 10 分
注册时间: 2012-04-13
最后登录: 2012-05-13
1楼  发表于: 2012-04-19 08:59
一般中断堆栈空间的设定是在初始化程序中做的,而不是在中断程序中分配的!