×
单片机 > 单片机程序设计 > 详情

mini2440硬件篇之中断

发布时间:2020-06-16 发布时间:
|

1. 硬件原理

arm有7种工作模式,除了用户模式,其他称为异常模式。异常模式有各自的一些寄存器,如sp栈指针,lr连接指针,程序状态保存寄存器SPSR,用于保存状态CPSR。CPSR的I和F位分别用于中断和快速中断的总开关。

1. 中断处理流程

2. 中断控制器收到中断信号,告诉CPU

3. CPU保存当前环境,然后调用中断服务程序ISR处理

4. ISR通过相关中断状态寄存器得知什么中断

5. 清除中断,通常通过读写某些标志寄存器

6. 恢复中断前的环境。


2. 芯片手册


3. mini2440电路图


由原理图可以看出,6个按键接到6个中断引脚,以EINT8为例,接在GPG0引脚。

4. S3C2440寄存器


1. 配置GPB8寄存器为中断引脚

2. 设置EXTINT寄存器,设置为下降沿触发中断

3. 使能外部中断寄存器EINTMASK

4. 设置中断模式为普通中断EINTMOD

5. 设置优先级

6. 使能中断寄存器INTMASK

7. 开启总中断,CPSR中的I,汇编打开


button.h


  1. /******************************************************************* 

  2.  * Copyright (C),2011-2012, XXX. 

  3.  * FileName: button.h  

  4.  * Author:HuangYinqing 

  5.  * Version:1.0 

  6.  * Date::2012-04-22 

  7.  * Description:按键驱动. 

  8.  * Function List: 

  9.  * History: 

  10.  ******************************************************************/  

  11. #ifndef __BUTTON_H__  

  12. #define __BUTTON_H__  

  13.   

  14. /*按键驱动调试等级*/  

  15. #define DBG_BUTTON_LEVEL 3  

  16.   

  17. #define BUTTON_CON_MASK ( (3<<0) | (3<<6) | (3<<10) | (3<<12) | (3<<14) | (3<<22) )  

  18. #define BUTTON_CON_EINT ( (2<<0) | (2<<6) | (2<<10) | (2<<12) | (2<<14) | (2<<22) )  

  19.   

  20. /*按键对应的引脚*/  

  21. #define BUTTON1_PIN     (1<<0)  

  22. #define BUTTON2_PIN     (1<<3)  

  23. #define BUTTON3_PIN     (1<<5)  

  24. #define BUTTON4_PIN     (1<<6)  

  25. #define BUTTON5_PIN     (1<<7)  

  26. #define BUTTON6_PIN     (1<<11)  

  27.   

  28. /*按键对应的中断*/  

  29. #define BUTTON1_EINT    (1<<8)  

  30. #define BUTTON2_EINT    (1<<11)  

  31. #define BUTTON3_EINT    (1<<13)  

  32. #define BUTTON4_EINT    (1<<14)  

  33. #define BUTTON5_EINT    (1<<15)  

  34. #define BUTTON6_EINT    (1<<19)  

  35.   

  36. /*函数声明*/  

  37. void KeyInit(void);  

  38.   

  39. #endif  

button.c



  1. /******************************************************************* 

  2.  * Copyright (C),2011-2012, XXX. 

  3.  * FileName: button.c  

  4.  * Author:HuangYinqing 

  5.  * Version:1.0 

  6.  * Date::2012-04-22 

  7.  * Description:按键驱动. 

  8.  * Function List: 

  9.  * History: 

  10.  ******************************************************************/  

  11. #include "common.h"  

  12. #include "core.h"  

  13. #include "drv.h"  

  14.   

  15. U8 button_irq[6] = {8, 11, 13, 14, 15, 19};  

  16.   

  17. /******************************************************************** 

  18. 函数功能:按键中断函数。 

  19. 入口参数:无。 

  20. 返    回:无。 

  21. 备    注:无。 

  22. ********************************************************************/  

  23. static void __irq KeyHandler(void)  

  24. {  

  25.     int i;  

  26.     static char flag = 1;  

  27.   

  28.     ClearPending(BIT_EINT8_23); //==在中断服务函数中,需要清除相应的标志寄存器  

  29.   

  30.     for(i=0; i<6; i++)  

  31.     {  

  32.         if( rEINTPEND & (1<

  33.         {  

  34.             rEINTPEND |= (1<

  35.               

  36.             DbgPrintX(DBG_BUTTON_LEVEL, "\rkey=%d\n", i+1);  

  37.             if(flag)  

  38.             {  

  39.                 LedOn(LED1_PIN);  

  40.                 flag = 0;  

  41.             }  

  42.             else  

  43.             {  

  44.                 LedOff(LED1_PIN);  

  45.                 flag = 1;  

  46.             }     

  47.         }  

  48.     }  

  49. }  

  50.   

  51. /******************************************************************** 

  52. 函数功能:按键初始化。 

  53. 入口参数:无。 

  54. 返    回:无。 

  55. 备    注:无。 

  56. ********************************************************************/  

  57. void KeyInit(void)  

  58. {  

  59.     /*设置外部引脚为第二功能(外部中断)*/  

  60.     rGPGCON &= ~BUTTON_CON_MASK;       

  61.     rGPGCON |= BUTTON_CON_EINT ;          

  62.       

  63.     /*设置下降沿触发中断*/  

  64.     rEXTINT1 &= ~0x000f0ff0;  

  65.     rEXTINT1 |= ( (0x2<<0) | (0x2<<12) | (0x2<<20) | (0x2<<24) | (0x2<<28) );  

  66.     rEXTINT2 &= ~(0xf<<12);                                         

  67.     rEXTINT2 |= 0x2<<12;  

  68.       

  69.     /*使能按键外部中断*/  

  70.     rEINTMASK &= ~( (1<<8) | (1<<11) | (1<<13) | (1<<14) | (1<<15) | (1<<19) );   

  71.       

  72.     rINTMOD &= ~BIT_EINT8_23;       //设置为普通中断模式  

  73.     rINTMSK &= ~BIT_EINT8_23;           //使能中断  

  74.       

  75.     pISR_EINT8_23 = (U32)KeyHandler;  

  76. }  



关键字:mini2440  硬件篇  中断 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
单片机电子密码锁仿真 可修改密码