OK6410裸机程序(三)——外部中断

OK6410裸机程序(三)——外部中断

  

       s3c6410具有187个多功能I/O端口,其实有127个可以被配置成外部中断。这127个引脚,可分成10个组。每个中断引脚,都有相对应的中断号,如(GPN0 = Ext.Interrupt[0]).

      这里给大家分一下:

      EINT0    GPN0--->GPN15        GPL8--->GPL14         GPM0--->GPM4

      EINT1    GPA0--->GPA7           GPB0--->GPB6

      EINT2    GPC0--->GPC7

      EINT3    GPD0--->GPD5

      EINT4    GPF0--->GPF14

      EINT5    GPG0--->GPG7

      EINT6    GPH0--->GPH9

      EINT7    GPO0--->GPO15

      EINT8    GPP0--->GPP14

      EINT9    GPQ0--->GPQ9

      每个引脚可以对应一个外部中断。

      下面我们就来看看GPIO与中断设置相关的寄存器有哪些:

        1.GPxCON:将GPIO配置成外部中断模式。

        2.EINTxCON:外部中断触发方式选择:(000=低电平 001=高电平 01x=边沿下降触发 10x=边沿上升触发
                                  11x=边沿触发)。

        3.EINTxPEND:外部中断检测寄存器(只读,常用于中断处理函数。来检测哪个外部中断产生,从而对相应                                 中断处理)。

        4.EINTxMASK: 外部中断使能、屏蔽寄存器。

        5.EINTxFLCON:滤波器使能寄存器。

        6.PRIORITY:外部中断优先控制寄存器(当同一时间有二个或多个外部中断,可设置它们的优先级)。

        我们在初始化外部中断的GPIO部分时,只要设置GPXCON ,EINTXCON,EINTXMASK,EINTXFLTCON.

            通过上面对GPIO的初始化后。中断信号就可以顺利通过GPIO,去向VIC(向量中断控制器)。

           上面说的这些外部中断在GPIO里分成了九组,但是具体反应到VIC里他们占用哪些中断号呢?这里贴一下:

             NO              SOURCES                          Description                                                   Group

              0                INT_EINT0                         External interrupt 0 ~ 3                                VIC0
              1                INT_EINT1                         External interrupt 4 ~ 11                              VIC0

             32              INT_EINT2                         External interrupt 12 ~ 19                             VIC1
             33              INT_EINT3                         External interrupt 20 ~ 27                             VIC1

             53              INT_EINT4                         External interrupt Group 1 ~ Group 9           VIC1

            注:这里有多个外部中断共用一个中断号情况,这里就要有它们之间的优先级决定,它们执行的先后顺序。

           这里我们使用VIC,当然要先开启VIC,这个是在协处理器cp15里设置的 VE位

          

           ;开启中断VECT
           mrc p15,0,r0,c1,c0,0
           orr r0,r0,#(1<<24)
           mcr p15,0,r0,c1,c0,0

 

           这样我们的VIC就能用了。

          这里就简单了,就这么几个重要的寄存器

           1.VICxINTSELECT :选择中断方式FIQ or IRQ(0为IRQ,1为FIQ)。

           2.VICxINTENCLEAR:中断禁止,设置寄存器相应位为1。

           3.VICxADDRESS:中断清除寄存器,向寄存器中定入任意值,即可清除。

           4. VICxVECTADDR : 设置中断处理程序的地址。

           5. VICxINTENABLE : 使能GPIO传过来的中断信号,相应位置1,使能。

       其实设置到这里外部中断就能正确运行了,但是还有许多别的寄存器,比如设置什么优先级的,大家如果需要就添上去。

        ARM得知来了个中断,就和VIC进行一系列的握手,得到VICADDRESS,就开始执行我们的中断处理程序了。

          另一个重要的内容,就是中断处理程序里清除中断。

       我们要clear 一下EINTXPEND,clear 一下VICXADDRESS。

         注:我们在编程的时候一定要开ARM11的总中断。不能中断也还是进不去。

          开总中断:

          

     ;允许中断,开启CPU总中断
      MRS R0, CPSR         ;将CPSR保存至R0寄存器中
      BIC R0, R0, #0x80    ;R0 = R0 & ~0x80,清除中断位
      MSR CPSR_c, R0 


 


 

 

         

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值