当前位置:   article > 正文

armlinux-外部中断

armlinux-外部中断

s3c2440的中断框图

如果我们单纯配置一个按键的外部中断,就不存在子中断与优先级的问题。

由于是按键的外部中断,通过引脚的高低电平来触发。所以我们要先配置引脚的功能。

我们使用按键1,终端源为EINT8,对应引脚GPG0

通过用户手册可以看到,我们需要初始化IO口配置的寄存器有

1.端口G控制寄存器(GPGCON)

2.外部中断控制寄存器(EXTINT1)

3.外部中断屏蔽寄存器(EINTMASK)

1.对应GPGCON寄存器0位

2.

3.

还要初始化中断的寄存器:  中断屏蔽(INTMSK)寄存器

  1. void eint11_init(void)
  2. {
  3. //配置GPG0为EINT8
  4. GPGCON &= ~(0x3 << 0);
  5. GPGCON |= (0x2 << 0);
  6. //设置EINT11为下降沿触发
  7. EXTINT1 &= ~(0x7 << 0);
  8. EXTINT1 |= (0x2 << 0);
  9. //使能中断
  10. EINTMASK &= ~(0x1 << 8);
  11. //设置中断屏蔽寄存器,可服务
  12. INTMSK &= ~(0x1 << 5);
  13. }

我们还要配置程序状态寄存器CPRS的I位,打开中断

I=1时,IRQ(中断模式)被禁止;I=0时,IRQ中断生效

在汇编端

  1. mrs r0, cpsr
  2. bic r0, r0, #(1<<7)
  3. msr cpsr_c, r0 ;使能I位(IRQ
  4. mrs r0, cpsr
  5. bic r0, r0, #0x1f
  6. orr r0, r0, #0x12
  7. msr cpsr_c, r0 ;切换工作模式到IRQ
  8. ldr sp, =0x40000c00 ;初始化IRQ的栈

当按键后,中断会导致程序进入异常处理第七句

所以在这里写处理函数,类似于中断回调

进入deal_irq

红色区域是对中断的处理,自定义。蓝色是对中断的关闭,需要用到的寄存器就是代码上的那些。

应该遵守先关前面的中断源开关,再关后面的挂起标志。因为是前者产生的后者,不关前者就会一直产生后者。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/394380
推荐阅读
相关标签
  

闽ICP备14008679号