zoukankan      html  css  js  c++  java
  • 2440 外部中断

    2440外部中断的使用

    1、设置io为外部中断引脚

      通过2440数据手册可以知道需要使用io的外部中断需要配置那些位

      

      a、通过上面的表格可以看出,如果要使用io的外部中断需要把对应的位设置为10

      例如:GPF0和GPF2这两个io需要使用外部中断

    GPFCON &= ~((3<<0)|(3<<4));//清除相应位
    GPFCON |=  ((2<<0)|(2<<4));//设置相应位为外部中断引脚

      

      b、通过上面这个表格可以看出,需要设置外部中断的触发,可以通过设置相对应的位实现,低电平,高电平,下降沿,上升沿,双边沿触发

       例如:GPF0和GPF2这两个io需要使用双边沿触发,就是下降沿上升沿都触发。

        

    EXTINT0 |= ((7<<0)|(7<<8));// config eint0 and eint2 is both edge triggered双边沿触发

      

        c、通过上面这个表格可以看出,外部中断的使能是需要操作EINTMASK这个寄存器的。外部中断0-3不需要设置这个寄存器,默认是使能的。

        例如:需要EINT11 和EINT19的外部中断可以这样设置

        

    EINTMASK &=~(1<<11);//使能外部中断11
    EINTMASK &=~(1<<19);//使能外部中断19

        通过上面三个步骤,外部中断的IO设置就可以了

    2、设置中断控制器允许外部中断

        

          这里需要设置,INTMSK寄存器,使得中断屏蔽寄存器无效,不屏蔽对应的中断。

          例如:这里关闭了,EINT0,TINT2,EINT8_23的中断屏蔽      

    INTMSK &=~((1<<0)|(1<<2)|(1<<5));

    3、开启中断总开关CPSR的I位

      

         

    //保存现场
            ldr sp, =0x33d00000//指定sp到64m的最高地址
            sub lr,lr,#4
            stmdb sp!,{r0-r12,lr}//保存r0-r12 和lr寄存器中的值到堆栈中
            //lr是异常处理完后的返回地址,也要保存
            //处理函数
            bl interrupt_fun
            //恢复现场    
            ldmia sp!,{r0-r12,pc}^// 恢复现场,从堆栈中取出r0-r12 和lr寄存器的值

    //切换到urs mode
        mrs r0,cpsr    //读出cpsr
        bic r0,r0,#0xf //修改m4-m0为0xb10000,进入urs模式
        bic r0,r0,#(1<<7)// 开启cpu的中断允许开关
        msr cpsr,r0    //将r0存入cpsr
        //设置sp
        ldr sp,=0x33f00000

        中断向量表:

     

    _start:
        b hede         //Reset addr                复位地址         0x0
        ldr pc,undefin  //Undefined instructoin 未定义异常        0x4
        ldr pc,swi_addrs//software interrupt    软中断             0x8
        b halt           //pretetch abort                         0xc
        b halt         //data abort                          0x10
        b halt         //reserved                            0x14
        ldr pc,irq_addrs //irq interrupt        中断异常         0x18
        b halt         //fiq                    快中断异常        0x1c

    4、处理中断

      a、分辨中断源通过 INTOFFSET中的值判断是什么中断

      

        

    int bit = INTOFFSET;
        //调用对应的处理函数
        if(bit ==0 ||bit == 2 ||bit == 5)
            {
                key_eint_irq(bit);
            }

      b、中断处理  EINTPEND(外部中断等待寄存器)寄存器中存放的值判断是外部中断几

        

      c、清除中断  清除中断是从源头开始清除的 。

        1)清除EINTPEND中的对应位  EINTPEND是一个可读可写的寄存器,所以只需要读出什么值,就写入什么值就可以清除中断等待位

          

         2)清除SRCPND寄存器

          

         3)清除INTPND寄存器

          

  • 相关阅读:
    微信OpenID获取
    2015总结及2016目标
    python start
    csv到mysql数据库如何分割
    读书 --- 老码识途
    读书--编写高质量代码 改善C#程序的157个建议2
    读书--编写高质量代码 改善C#程序的157个建议
    BinarySearch
    在aspx中写c#
    AWS 2020 Innovate所有视频
  • 原文地址:https://www.cnblogs.com/hjxzjp/p/8735188.html
Copyright © 2011-2022 走看看