int.c
上传用户:zbk8730
上传日期:2017-08-10
资源大小:12168k
文件大小:5k
源码类别:

uCOS

开发平台:

C/C++

  1. //====================================================================
  2. // File Name : 2440int.c
  3. // Function  : S3C2440 FIQ, Priority Interrupt Test
  4. // Program   : Shin, On Pil (SOP)
  5. // Date      : May 03, 2002
  6. // Version   : 0.0
  7. // History
  8. //   0.0 : Programming start (March 12, 2002) -> SOP
  9. //   0.1 : modified for s3c2440 (May xx, 2003) -> DonGo
  10. //====================================================================
  11. #include <string.h>
  12. #include "def.h"
  13. #include "option.h"
  14. #include "2440addr.h"
  15. #include "2440lib.h"
  16. #include "2440slib.h" 
  17. #include "int.h"
  18. #include "eint.h"
  19. #include "swi.h"
  20. #include "swis.h"
  21. volatile int fiqCnt0, fiqCnt1;
  22. void * func_int_test[][2]=
  23. {
  24. //                           "0123456789012345678"
  25. //Power mode test
  26. (void *)Test_Eint, "External INT    ",
  27. (void *)Test_Fiq, "FIQ test        ",
  28. (void *)Change_IntPriorities, "Change priority ",
  29. (void *)Test_SwiIrq, "SWI Irq         ",
  30. 0,0
  31. };
  32. void Test_Int(void)
  33. {
  34. int i;
  35. Uart_Printf("Interrupt test.n");
  36. while(1)
  37. {
  38. i=0;
  39. Uart_Printf("nn");
  40. while(1)
  41. {   //display menu
  42. Uart_Printf("%2d:%s",i,func_int_test[i][1]);
  43. i++;
  44. if((int)(func_int_test[i][0])==0)
  45. {
  46. Uart_Printf("n");
  47. break;
  48. }
  49. if((i%3)==0)
  50. Uart_Printf("n");
  51. }
  52. Uart_Printf("nSelect ("-1" to exit) : ");
  53. i = Uart_GetIntNum();
  54. if(i==-1) break; // return.
  55. if(i>=0 && (i<((sizeof(func_int_test)-1)/8)) ) // select and execute...
  56. ( (void (*)(void)) (func_int_test[i][0]) )();
  57. }
  58. Uart_Printf("Interrupt test end.n");
  59. }
  60. static void __irq T0Int(void)           //FIQ
  61. {
  62.     ClearPending(BIT_TIMER0);
  63.     fiqCnt0 += 1;
  64. }
  65. //--------------------------------------------------------------------
  66. static void __irq T1Int(void)           //IRQ
  67. {
  68.     ClearPending(BIT_TIMER1);           //Timer1 Clear Interrupt
  69.     fiqCnt1 += 1;
  70.     
  71.     if(fiqCnt0!=fiqCnt1)
  72.         fiqCnt1 = 0; 
  73.     if(fiqCnt0==10000)                  //Because FIQ interrupt has higher priority,
  74.         rTCON   = 0x0;                  //fiqCnt0 will always be same with fiqCnt1.
  75. }
  76. //**********************[ Test_Fiq ]**********************************
  77. void Test_Fiq(void)
  78. {
  79.     int intmod;
  80.     Uart_Printf("[ FIQ Interrupt Test ]n");
  81.     Uart_Printf("[ Set Timer0 with FIQ Interrupt ]n");
  82.     fiqCnt0     = 0;
  83.     fiqCnt1     = 0;    
  84.     pISR_FIQ    = (U32)T0Int;                   //Timer0 FIQ interrupt
  85.     pISR_TIMER1 = (U32)T1Int;                   //Timer1 Interrupt
  86.     intmod      = rINTMOD;                      //Interrupt Mode backup
  87.     rINTMOD     = BIT_TIMER0;                   //Timer0 FIQ mode
  88.     rSRCPND     = BIT_TIMER0 | BIT_TIMER1;      //Timer0,1 To clear the previous pending states
  89.     rINTPND     = BIT_TIMER0 | BIT_TIMER1;      //Timer0,1 Interrupt request
  90. //PWM Timer control
  91. //==============================================================================
  92. //Timer input clock Frequency = PCLK /{prescaler value + 1} / {divider value}
  93. // {prescaler value} = 0 ~ 255
  94. // {divider value}   = 2,4,8,16
  95. //==============================================================================        
  96.     rTCFG0  = 0x0;      //Dead zone length, Prescaler0=Timer0,1  Prescaler1=Timer2,3,4
  97.     rTCFG1  = 0x0;      //Select DMA request channel All Interrupt, Select MUX input for PWM Timer0~4 = 1/2    
  98.     rTCNTB0 = 2570;     //0xa0a, Timer0 count buffer register
  99.     rTCNTB1 = 2570;     //0xa0a, Timer1 count buffer register
  100.     rTCON   = 0xa0a;    //1010 0000 1010 Timer0,1:Auto-Reload,Inverter off, Update TCNTB0,1, TCMPB0,1, Stop
  101.     rTCON   = 0x909;    //1001 0000 1001 Timer0,1:Auto-Reload,Inverter off, No operation, Start for Timer0,1
  102.     
  103.     rINTMSK = ~(BIT_TIMER0 | BIT_TIMER1);       //Timer0,1 Interrupt service is available
  104.     while(fiqCnt1<10000)
  105.     {
  106.         if((fiqCnt1%100)==0)   
  107.            Uart_Printf(".");
  108.     }
  109.     rTCON = 0x0;        //One-shot, Inverter off, No operation, Dead zone disable, Stop
  110.     Delay(1);
  111.     Uart_Printf("nfiqCnt0 = %d, fiqCnt1 = %d (10000,10000)n",fiqCnt0,fiqCnt1);
  112.     rINTMOD = intmod;
  113.     rINTMSK = BIT_ALLMSK;
  114. }
  115. //***************[ Change_IntPriorities ]*************************
  116. void Change_IntPriorities(void)
  117. {
  118.     int key;
  119. //    rINTMOD = 0x0;
  120. //    rINTMSK = ~(BIT_ALLMSK);
  121. //    rINTSUBMSK = ~(BIT_SUB_ALLMSK);
  122.     
  123.     Uart_Printf("[ Interrupt Controller Priority Policy ]nn");
  124.     Uart_Printf("1. Reverse Priority   2. Priority Rotate Off   3. Defaultnn");
  125.     Uart_Printf("Select : ");
  126.     key = Uart_Getch();
  127.     Uart_Printf("%cnn",key);    
  128.     
  129.     switch(key)
  130.     {
  131.        case '1':
  132.           Uart_Printf("Reverse priority is selected.n");
  133.           rPRIORITY = 0x7f;             //Arbiter 0 to 6 group priority rotate enable
  134.           rPRIORITY = (0x3fff<<7);      //Arbiter 0 and 5 are group priority order set.(REQ 4-1-2-3)
  135.                                         //Arbiter 1 to 4 and 6 are group priority order set.(REQ 0-4-1-2-3-5)
  136.           break;
  137.        case '2':
  138.           Uart_Printf("Priority rotate off is selected.n");
  139.           rPRIORITY = 0x0;              //Arbiter 0 to 6 group priority does not rotate
  140.           break;
  141.        case '3':
  142.           Uart_Printf("Default mode is selected.n");
  143.           rPRIORITY = 0x7f;             //Arbiter 0 to 6 group priority rotate enable
  144.           break;
  145.        default:
  146.           break;
  147.     }
  148.     
  149. //    rINTMSK = BIT_ALLMSK;
  150. //    rINTSUBMSK = BIT_SUB_ALLMSK;    
  151. }