主题 : 6410 中断 复制链接 | 浏览器收藏 | 打印
邮箱:yucejun@126.com,欢迎讨论!
级别: 侠客
UID: 34734
精华: 0
发帖: 101
金钱: 510 两
威望: 102 点
贡献值: 0 点
综合积分: 202 分
注册时间: 2010-12-20
最后登录: 2018-07-15
楼主  发表于: 2011-01-12 09:05

 6410 中断

在下对6410中断不了解,下面是我尝试写的6410中断程序(当然它是不能工作的),我不知道错在哪?希望看出问题的大侠帮我指出。
程序简析:
1 配置GPN0~5 GPL11~12作外部中断脚,mini6410板的8个按键。
2 配置外部中断寄存器
   EINT0CON0  0x222         下降沿   EINT0~5
      EINT0CON1  0x22 << 4   下降沿   EINT19 20
      EINT0FLTCON0  设置滤波
   EINT0MASK  打开屏蔽
3  配置中断寄存器
  rVIC0INTSELECT
     rVIC0VECTADDR
     rVIC0INTENABLE
4 打开CPSR IRQ
5 死循环,等待按键中断
硬件说明:按键一端接6410(有上拉电阻),另一端接地。
环境说明:uboot相当于裸机,uboot里汇编中转到do_irq(),但运行没有进这个函数。我采用的是读VICxADDRESS的寄存器方式,在do_irq()里读。
/********************************************************************/
void key_int_init(void)
{
unsigned long temp;

//configuration  //GPN0~5 GPL11~12
//configed as Ext. Interrupt, and disable pull-up/down
writel(readl(rGPNCON) & (~0xFFF) | 0xAAA, rGPNCON);
writel(readl(rGPNPUD) & (~0xFFF) | 0x0, rGPNPUD);
writel(readl(rGPLCON1) & (~(0xFF << 12)) | (0x33 << 12), rGPLCON1);
writel(readl(rGPLPUD ) & (~(0xFF << 22)) | (0x00 << 12), rGPLPUD);

//config extern interrupt registers
writel(readl(rEINT0CON0) & (~0xFFF) | 0x222, rEINT0CON0);
writel(readl(rEINT0CON1) & (~(0xFF << 4)) | (0x22 << 4), rEINT0CON1);
writel(readl(rEINT0FLTCON0) & (~0xFFFFFF) | 0x808080, rEINT0FLTCON0); //EINT0~5
writel(readl(rEINT0FLTCON2) & (~(0xFFFF << 8)) | (0x8080 << 8), rEINT0FLTCON2); //EINT19 20
writel(~0x1F003F, rEINT0MASK);

//config interrupt registers
writel(readl(rVIC0INTSELECT) & (~0x3), rVIC0INTSELECT);  //irq 0,1
writel(readl(rVIC1INTSELECT) & (~0x3), rVIC1INTSELECT);  //irq 32,33
writel((unsigned int *)key_isr, rVIC0VECTADDR(0));
writel((unsigned int *)key_isr, rVIC0VECTADDR(1));
writel((unsigned int *)key_isr, rVIC1VECTADDR(0));
writel((unsigned int *)key_isr, rVIC1VECTADDR(1));
writel(0x3, rVIC0INTENABLE); //enable 0,1
writel(0x3, rVIC1INTENABLE); //ebable 32,33

__asm__ __volatile__("mrs %0, cpsr\n" "bic %0, %0, #0x80\n" "msr cpsr_c, %0":"=r"(temp)
        ::"memory"); //enable interrupts
//估计: %0 代表 r0
}
while(1);
/**************************************************/
邮箱:yucejun@126.com,欢迎讨论!
级别: 侠客
UID: 34734
精华: 0
发帖: 101
金钱: 510 两
威望: 102 点
贡献值: 0 点
综合积分: 202 分
注册时间: 2010-12-20
最后登录: 2018-07-15
1楼  发表于: 2011-01-13 16:44
没有人做过6410裸机中断么?
邮箱:yucejun@126.com,欢迎讨论!
级别: 侠客
UID: 34734
精华: 0
发帖: 101
金钱: 510 两
威望: 102 点
贡献值: 0 点
综合积分: 202 分
注册时间: 2010-12-20
最后登录: 2018-07-15
2楼  发表于: 2011-01-17 09:21
没有人回。。