INT_Test.c
上传用户:jinguanrq
上传日期:2022-06-04
资源大小:724k
文件大小:7k
源码类别:

uCOS

开发平台:

C/C++

  1. /*--- include files ---*/
  2. #include "44blib.h"
  3. #include "44b.h"
  4. #include "def.h"
  5. #ifdef __cplusplus
  6. extern "C" {
  7. #endif
  8. #define KEY_VALUE_MASK 0x0f
  9. /*--- extern function ---*/
  10. void KeyIsr(void) __attribute__ ((interrupt ("IRQ")));
  11. void Eint4567Isr(void) __attribute__ ((interrupt ("IRQ")));
  12. inline int key_read();
  13. unsigned char IntNesting = 0;
  14. unsigned char which_int  = 0;
  15. /* keyboard control address */
  16. volatile U8 *keyboard_base = (U8 *)0x06000000;
  17. /*********************************************************************************************
  18. * name: init_Ext4567
  19. * func:
  20. * para: none
  21. * ret: none
  22. * modify:
  23. * comment:
  24. *********************************************************************************************/
  25. void init_Eint(void)
  26. {
  27. /* enable interrupt */
  28.     rI_ISPC    = 0x3ffffff;
  29. rEXTINTPND = 0xf;                          // clear EXTINTPND reg
  30. rINTMOD    = 0x0;
  31. rINTCON    = 0x1;
  32. rINTMSK    = ~(BIT_GLOBAL|BIT_EINT1|BIT_EINT4567);
  33. /* set EINT interrupt handler */
  34.     pISR_EINT4567 = (int)Eint4567Isr;
  35.     pISR_EINT1    = (int)KeyIsr;
  36.     
  37.    /* PORT G */
  38.     rPCONG  = 0xffff;                          // EINT7~0
  39. rPUPG   = 0x0;                             // pull up enable     
  40. rEXTINT = rEXTINT|0x22220020;              // EINT1、EINT4567 falling edge mode
  41.     rI_ISPC    |= (BIT_EINT1|BIT_EINT4567);
  42. rEXTINTPND = 0xf;                          // clear EXTINTPND reg
  43. }
  44. /*********************************************************************************************
  45. * name: Test_Eint
  46. * func:
  47. * para: none
  48. * ret: none
  49. * modify:
  50. * comment:
  51. *********************************************************************************************/
  52. void Test_Eint(void)
  53. {
  54.     unsigned int save_G,save_PG;
  55.   int value = -1;
  56.     init_Eint();
  57.     which_int=0;
  58.     
  59.     Uart_Printf(" External Interrupt Test for Embest S3CEV40.n");
  60.     Uart_Printf("nnInterrupt Controler Configration concern with Registers:n");
  61.     Uart_Printf("         rINTCON = 0x%xn",rINTCON);
  62.     Uart_Printf("         rINTPND = 0x%xn", rINTPND);   
  63.     Uart_Printf("         rINTMSK = 0x%xn", rINTPND);
  64.     rINTCON=0x1;   /**** Vectored interrupt test(S3C44B0X). ****/
  65.     Uart_Printf("n ***** Vectored interrupt test(S3C44B0X). ***** n");
  66.    
  67.     Uart_Printf("Please Select the trigger:n"
  68. "  1> Falling triggern"
  69. "  2> Rising triggern"
  70. "  3> Both Edge triggern" 
  71. "  4> Low level triggern"
  72. "  5> High level triggern"
  73. "n   any key to exit...n");
  74.     
  75.     save_G=rPCONG;
  76.     save_PG=rPUPG;
  77.     rPCONG=0xffff; //EINT7~0
  78.     rPUPG=0x0; //pull up enable     
  79.     switch(Uart_Getch())
  80.     {
  81. case '1':
  82.     rEXTINT = 0x22222222; // Falling edge mode 
  83.     break;
  84. case '2':
  85.     rEXTINT = 0x44444444; // Rising edge mode
  86.     break;
  87. case '3':
  88.     rEXTINT = 0x77777777; // Both edge mode
  89.     break;
  90. case '4':
  91.     rEXTINT = 0x0;        // "0" level mode
  92.     break;
  93. case '5':
  94.     Uart_Printf("EINT1(connect to Keyboard) was pulled up. n");//rEXTINT=0x11111111; //"1" level mode
  95.     //rEXTINT = 0x11111111;  // "1" level mode
  96.     rINTMSK    |= BIT_EINT4567;
  97.     while(!which_int);
  98.     break;
  99. default:
  100.     rPCONG=save_G;
  101.     rPUPG=save_PG;
  102.     return;
  103.     }
  104.     Uart_Printf("Press the EINT buttons(SB2/SB3)!!!");
  105.     Uart_Printf("(push buttons may have glitch noise problem)n");
  106.     rINTMSK=~(BIT_GLOBAL|BIT_EINT1|BIT_EINT4567);  
  107.     while(!which_int);
  108.     switch(which_int)
  109.     {
  110. case 1:
  111.     Uart_Printf("EINT4 had been occured...n");
  112.     break;
  113. case 2:
  114.     Uart_Printf("EINT5 had been occured...n");
  115.     break;
  116. case 4:      // SB2 --- up 0-F
  117.         which_int=0;
  118.         IntNesting=1;    // Allow to Nesting.
  119.     Uart_Printf("EINT6 had been occured...n");
  120.         led1_on();
  121.         //D8Led_Direction(0);
  122.         led1_off();
  123.     break;
  124. case 8:              // SB3 --- down F-0
  125.         which_int=0;
  126.         IntNesting=1;    // Allow to Nesting.
  127.     Uart_Printf("EINT7 had been occured...n");
  128.         led2_on();
  129.         //D8Led_Direction(1);
  130.         led2_off();
  131.     break;
  132. case 9:
  133.     Uart_Printf("EINT1 had been occured...(Look 8Led)n");
  134.             value = key_read();
  135.             if(value > -1)
  136. Digit_Led_Symbol(value);
  137. default :
  138.     break;
  139.     }
  140.     IntNesting = 0;
  141.     rINTMSK=BIT_GLOBAL;
  142.     rPCONG=save_G;
  143.     rPUPG=save_PG;
  144.     which_int=0;
  145.     
  146.     Uart_Printf("n         rINTCON = 0x%xn",rINTCON);
  147.     Uart_Printf("         rINTPND = 0x%xn", rINTPND);
  148.     rINTCON=0x5;
  149. }
  150. /*********************************************************************************************
  151. * name: Eint4567Isr
  152. * func:
  153. * para: none
  154. * ret: none
  155. * modify:
  156. * comment:
  157. *********************************************************************************************/
  158. void Eint4567Isr(void)
  159. {
  160.     
  161.     if(IntNesting)
  162.      {
  163.       IntNesting++;
  164.         Uart_Printf("IntNesting = %dn",IntNesting);//An Extern Intrrupt had been occur before dealing with one. 
  165.      }
  166.     which_int  = rEXTINTPND;
  167.     rEXTINTPND = 0xf; //clear EXTINTPND reg.
  168.     rI_ISPC   |= BIT_EINT4567; //clear pending_bit
  169. }
  170. /*********************************************************************************************
  171. * name:
  172. * func:
  173. * para: none
  174. * ret: none
  175. * modify:
  176. * comment:
  177. *********************************************************************************************/
  178. void KeyIsr(void)
  179. {
  180.     which_int  = 9;
  181.     rI_ISPC    = BIT_EINT1; //clear pending_bit
  182.     Uart_Printf("Key press is:%dn",(char)key_read());
  183. }
  184. /*********************************************************************************************
  185. * name: key_read
  186. * func: read key value
  187. * para: none
  188. * ret: key value, -1 -- error
  189. * modify:
  190. * comment:
  191. ********************************************************************************************/
  192. inline int key_read()
  193. {
  194. int value;
  195. char temp;
  196. /* read line 1 */
  197. temp = *(keyboard_base+0xfd);
  198. /* not 0xF mean key down */
  199. if(( temp & KEY_VALUE_MASK) != KEY_VALUE_MASK)
  200. {
  201. if( (temp&0x1) == 0 )
  202. value = 3;
  203. else if( (temp&0x2) == 0 )
  204. value = 2;
  205. else if( (temp&0x4) == 0 )
  206. value = 1;
  207. else if( (temp&0x8) == 0 )
  208. value = 0;
  209. return value;
  210. }
  211. /* read line 2 */
  212. temp = *(keyboard_base+0xfb);
  213. /* not 0xF mean key down */
  214. if(( temp & KEY_VALUE_MASK) != KEY_VALUE_MASK)
  215. {
  216. if( (temp&0x1) == 0 )
  217. value = 7;
  218. else if( (temp&0x2) == 0 )
  219. value = 6;
  220. else if( (temp&0x4) == 0 )
  221. value = 5;
  222. else if( (temp&0x8) == 0 )
  223. value = 4;
  224. return value;
  225. }
  226. /* read line 3 */
  227. temp = *(keyboard_base+0xf7);
  228. /* not 0xF mean key down */
  229. if(( temp & KEY_VALUE_MASK) != KEY_VALUE_MASK)
  230. {
  231. if( (temp&0x1) == 0 )
  232. value = 0xb;
  233. else if( (temp&0x2) == 0 )
  234. value = 0xa;
  235. else if( (temp&0x4) == 0 )
  236. value = 9;
  237. else if( (temp&0x8) == 0 )
  238. value = 8;
  239. return value;
  240. }
  241. /* read line 4 */
  242. temp = *(keyboard_base+0xef);
  243. /* not 0xF mean key down */
  244. if(( temp & KEY_VALUE_MASK) != KEY_VALUE_MASK)
  245. {
  246. if( (temp&0x1) == 0 )
  247. value = 0xf;
  248. else if( (temp&0x2) == 0 )
  249. value = 0xe;
  250. else if( (temp&0x4) == 0 )
  251. value = 0xd;
  252. else if( (temp&0x8) == 0 )
  253. value = 0xc;
  254. return value;
  255. }
  256. return -1;
  257. }
  258. #ifdef __cplusplus
  259.  }
  260. #endif