Example_281xSWPrioritizedInterrupts.c
上传用户:qingfan3
上传日期:2014-10-27
资源大小:31439k
文件大小:18k
源码类别:

DSP编程

开发平台:

C/C++

  1. //###########################################################################
  2. //
  3. // FILE:   Example_281xSWPrioritizedInterrupts.c
  4. //
  5. // TITLE:  DSP281x Software Prioritized Interrupt Example.
  6. //
  7. // ASSUMPTIONS:
  8. //
  9. //          This program requires the DSP281x V1.00 header files.  
  10. //          As supplied, this project is configured for "boot to H0" operation. 
  11. //
  12. //          Other then boot mode pin configuration, no other hardware configuration
  13. //          is required.
  14. //  
  15. //
  16. // DESCRIPTION:
  17. //
  18. //          For most applications, the hardware prioritization of the 
  19. //          the PIE module is sufficient.  For applications that need custom
  20. //          prioritization, this example illustrates an example of
  21. //          how this can be done through software. 
  22. //
  23. //          For more information on F2810/12 interrupt priorities, refer to the
  24. //          ReadMe_Example_28xISRPriorities.pdf file included with this example.
  25. //
  26. //          This program simulates interrupt conflicts by writing to the
  27. //          PIEIFR registers.  This will simulate multiple interrupts coming into
  28. //          the PIE block at the same time. 
  29. //
  30. //          The interrupt service routine routines are software prioritized
  31. //          by the table found in the DSP281x_SWPrioritizedIsrLevels.h file.
  32. //
  33. //          1) Before compiling you must set the Global and Group interrupt priorities
  34. //             in the DSP281x_SWPrioritizedIsrLevels.h file.
  35. //
  36. //          2) Compile the code, load, and run
  37. //
  38. //          3) At the end of each test there is a hard coded breakpoint (ESTOP0).  When code
  39. //             stops at the breakpoint, examine the ISRTrace buffer to see the order
  40. //             in which the ISR's completed.    All PIE interrupts will add to the
  41. //             ISRTrace.
  42. //
  43. //             The ISRTrace will consist of a list of hex values as shown:
  44. //
  45. //                                  0x00wx    <- PIE Group w interrup x finished first
  46. //                                  0x00yz    <- PIE Group y interrupt z finished next
  47. //
  48. //          4) If desired, set a new set of Global and Group interrupt priorites
  49. //             and repeat the test to see the change.
  50. //          
  51. //
  52. //          Watch Variables:
  53. //                ISRTrace[50]           Trace of ISR's in the order they complete
  54. //                                       After each test, examine this buffer
  55. //                                       to determine if the ISR's completed in
  56. //                                       the order desired. 
  57. //
  58. //###########################################################################
  59. //
  60. //  Ver | dd mmm yyyy | Who  | Description of changes
  61. // =====|=============|======|===============================================
  62. //  1.00| 11 Sep 2003 | L.H. | Changes since previous version (v.58 Alpha)
  63. //      |             |      | Corrected a number of comments.  Re-structured
  64. //      |             |      | the flow of each testcase to make more sense.
  65. //###########################################################################
  66. #include "DSP281x_Device.h"     // DSP281x Headerfile Include File
  67. #include "DSP281x_Examples.h"   // DSP281x Examples Include File
  68. // Define which interrupts are used in the PIE for each group.
  69. #define ISRS_GROUP1  (M_INT1|M_INT2|M_INT4|M_INT5|M_INT6|M_INT7|M_INT8)
  70. #define ISRS_GROUP2  (M_INT1|M_INT2|M_INT3|M_INT4|M_INT5|M_INT6|M_INT7)
  71. #define ISRS_GROUP3  (M_INT1|M_INT2|M_INT3|M_INT4|M_INT5|M_INT6|M_INT7)
  72. #define ISRS_GROUP4  (M_INT1|M_INT2|M_INT3|M_INT4|M_INT5|M_INT6|M_INT7)
  73. #define ISRS_GROUP5  (M_INT1|M_INT2|M_INT3|M_INT4|M_INT5|M_INT6|M_INT7)
  74. #define ISRS_GROUP6  (M_INT1|M_INT2|M_INT5|M_INT6)
  75. #define ISRS_GROUP9  (M_INT1|M_INT2|M_INT3|M_INT4|M_INT5)
  76. // This array will be used as a trace to check the order that the
  77. // interrupts were serviced
  78. Uint16  ISRTrace[50];
  79. Uint16  ISRTraceIndex;  // used to update an element in the trace buffer
  80. void main(void)
  81. {
  82.    Uint16 i;
  83. // Step 1. Initialize System Control:
  84. // PLL, WatchDog, enable Peripheral Clocks
  85. // This example function is found in the DSP281x_SysCtrl.c file.
  86.    InitSysCtrl();
  87. // Step 2. Initalize GPIO: 
  88. // This example function is found in the DSP281x_Gpio.c file and
  89. // illustrates how to set the GPIO to it's default state.
  90. // InitGpio();  // Skipped for this example  
  91. // Step 3. Clear all interrupts and initialize PIE vector table:
  92. // Disable CPU interrupts 
  93.    DINT;
  94. // Initialize PIE control registers to their default state.
  95. // The default state is all PIE interrupts disabled and flags
  96. // are cleared.  
  97. // This function is found in the DSP281x_PieCtrl.c file.
  98.    InitPieCtrl();
  99.    
  100. // Disable CPU interrupts and clear all CPU interrupt flags:
  101.    IER = 0x0000;
  102.    IFR = 0x0000;   
  103. // Initialize the PIE vector table with pointers to the shell Interrupt 
  104. // Service Routines (ISR).  
  105. // This will populate the entire table, even if the interrupt
  106. // is not used in this example.  This is useful for debug purposes.
  107. // The shell ISR routines are found in DSP281x_DefaultIsr.c.
  108. // This function is found in DSP281x_PieVect.c.
  109.    InitPieVectTable();
  110.    
  111. // Step 4. Initialize all the Device Peripherals:
  112. // This function is found in DSP281x_InitPeripherals.c
  113. // InitPeripherals(); // Not required for this example
  114.  
  115. // Step 5. User specific code, enable interrupts:
  116. // CASE 1:
  117. //     Force all group 1 interrupts at once by writing to the PIEIFR1 register
  118.        // Prepare for the test:
  119.    // Disable interrupts 
  120.    // Clear the trace buffer, PIE Control Register, CPU IER and IFR registers
  121.    DINT;
  122.    for(i = 0; i < 50; i++) ISRTrace[i] = 0;
  123.    ISRTraceIndex = 0;
  124.        InitPieCtrl();
  125.        IER = 0;
  126.        IFR &= 0;
  127.        
  128.        // Enable the PIE block
  129.        PieCtrlRegs.PIECRTL.bit.ENPIE = 1;   
  130.        // Enable PIE group 1 interrupt 1-8
  131.        PieCtrlRegs.PIEIER1.all = 0x00FF;
  132.        // Make sure PIEACK for group 1 is clear (default after reset)
  133.        PieCtrlRegs.PIEACK.all = M_INT1;
  134.        // Enable CPU INT1
  135.        IER |= M_INT1;
  136.        // Force all valid interrupts for Group 1
  137.        PieCtrlRegs.PIEIFR1.all = ISRS_GROUP1;
  138.        
  139.        // Enable global Interrupts CPU level:
  140.    EINT;   // Enable Global interrupt INTM
  141.    
  142.    // Wait for all Group 1 interrupts to be serviced
  143.    while(PieCtrlRegs.PIEIFR1.all != 0x0000 ){}
  144.    
  145.        // Stop here and check the ISRTrace to determine which order the 
  146.        // ISR Routines completed.  The order is dependant on the priority
  147.        // assigned in the DSP281x_SWPrioritizedIsrLevels.h file
  148.        // 
  149.        // The ISRTrace will contain a list of values corresponding to the
  150.        // interrupts serviced in the order they were serviced. 
  151.    // For example if the ISRTrace looks like this
  152.    //        0x0014     ISR Group 1 interrupt 4
  153.    //        0x0017     ISR Group 1 interrupt 7
  154.    //        0x0016     ISR Group 1 interrupt 6
  155.    //        0x0000     end of trace
  156.    asm("        ESTOP0");
  157. // CASE 2:
  158. //     Force all group 2 interrupts at once by writing to the PIEIFR2 register
  159.        // Prepare for the test:
  160.    // Disable interrupts 
  161.    // Clear the trace buffer, PIE Control Register, CPU IER and IFR registers
  162.    DINT;
  163.    for(i = 0; i < 50; i++) ISRTrace[i] = 0;
  164.    ISRTraceIndex = 0;
  165.        InitPieCtrl();
  166.        IER = 0;
  167.        IFR &= 0;
  168.        // Enable the PIE block
  169.        PieCtrlRegs.PIECRTL.bit.ENPIE = 1;   
  170.        
  171.        // Enable PIE group 2 interrupts 1-8 
  172.        PieCtrlRegs.PIEIER2.all = 0x00FF;
  173.        
  174.        // Enable CPU INT2
  175.        IER |= (M_INT2);
  176.    // Make sure PIEACK for group 2 is clear (default after reset)
  177.        PieCtrlRegs.PIEACK.all = M_INT2;
  178.        // Force all valid interrupts for Group 2
  179.        PieCtrlRegs.PIEIFR2.all = ISRS_GROUP2;  
  180.    // Enable Global interrupts
  181.    EINT;
  182.    
  183.    // Wait for all group 2 interrupts to be serviced
  184.    while(PieCtrlRegs.PIEIFR2.all != 0x0000 ){}
  185.    
  186.        // Stop here and check the order the ISR's were serviced in the
  187.        // ISRTrace
  188.    asm("        ESTOP0");
  189.    
  190.    
  191. // CASE 3:
  192. //     Force all group 3 interrupts at once by writing to the PIEIFR3 register
  193.        // Prepare for the test:
  194.    // Disable interrupts 
  195.    // Clear the trace buffer, PIE Control Register, CPU IER and IFR registers
  196.    DINT;
  197.    for(i = 0; i < 50; i++) ISRTrace[i] = 0;
  198.    ISRTraceIndex = 0;
  199.        InitPieCtrl();
  200.        IER = 0;
  201.        IFR &= 0;
  202.        // Enable the PIE block
  203.        PieCtrlRegs.PIECRTL.bit.ENPIE = 1;   
  204.               
  205.        // Enable PIE group 3 interrupts 1-8 
  206.        PieCtrlRegs.PIEIER3.all = 0x00FF;
  207.    // Make sure PIEACK for group 3 is clear (default after reset)
  208.        PieCtrlRegs.PIEACK.all = M_INT3;
  209.        // Enable CPU INT3
  210.        IER |= (M_INT3);
  211.        // Force all valid interrupts for Group 3
  212.        PieCtrlRegs.PIEIFR3.all = ISRS_GROUP3;  
  213.    // Enable Global interrupts
  214.    EINT;
  215.    
  216.    // Wait for all group 3 interrupts to be serviced
  217.    while(PieCtrlRegs.PIEIFR3.all != 0x0000 ){}
  218.    
  219.        // Stop here and check the order the ISR's were serviced in the
  220.        // ISRTrace
  221.    asm("        ESTOP0");            
  222.    
  223. // CASE 4:
  224. //     Force all group 4 interrupts at once by writing to the PIEIFR4 register
  225.        // Prepare for the test:
  226.    // Disable interrupts 
  227.    // Clear the trace buffer, PIE Control Register, CPU IER and IFR registers
  228.    DINT;
  229.    for(i = 0; i < 50; i++) ISRTrace[i] = 0;
  230.    ISRTraceIndex = 0;
  231.        InitPieCtrl();
  232.        IER = 0;
  233.        IFR &= 0;
  234.        // Enable the PIE block
  235.        PieCtrlRegs.PIECRTL.bit.ENPIE = 1;   
  236.        
  237.        // Enable PIE group 4 interrupts 1-8 
  238.        PieCtrlRegs.PIEIER4.all = 0x00FF;
  239.    // Make sure PIEACK for group 3 is clear (default after reset)
  240.        PieCtrlRegs.PIEACK.all = M_INT4;
  241.        
  242.        // Enable CPU INT4
  243.        IER |= (M_INT4);
  244.        // Force all valid interrupts for Group 4
  245.        PieCtrlRegs.PIEIFR4.all = ISRS_GROUP4; 
  246.    // Enable Global interrupts
  247.    EINT;
  248.    // Wait for all group 4 interrupts to be serviced
  249.    while(PieCtrlRegs.PIEIFR4.all != 0x0000 ){}
  250.    
  251.        // Stop here and check the order the ISR's were serviced in the
  252.        // ISRTrace
  253.    asm("        ESTOP0");
  254.    
  255. // CASE 5:
  256. //     Force all group 5 interrupts at once by writing to the PIEIFR5 register
  257.        // Prepare for the test:
  258.    // Disable interrupts 
  259.    // Clear the trace buffer, PIE Control Register, CPU IER and IFR registers
  260.    DINT;
  261.    for(i = 0; i < 50; i++) ISRTrace[i] = 0;
  262.    ISRTraceIndex = 0;
  263.        InitPieCtrl();
  264.        IER = 0;
  265.        IFR &= 0;
  266.        // Enable the PIE block
  267.        PieCtrlRegs.PIECRTL.bit.ENPIE = 1;   
  268.               
  269.        // Enable PIE group 5 interrupts 1-8 
  270.        PieCtrlRegs.PIEIER5.all = 0x00FF;
  271.    // Make sure PIEACK for group 5 is clear (default after reset)
  272.        PieCtrlRegs.PIEACK.all = M_INT5;
  273.        // Enable CPU INT5
  274.        IER |= (M_INT5);
  275.        // Force all valid interrupts for Group 5
  276.        PieCtrlRegs.PIEIFR5.all = ISRS_GROUP5;  
  277.    // Enable Global interrupts
  278.    EINT;
  279.    
  280.    // Wait for all group 5 interrupts to be serviced
  281.    while(PieCtrlRegs.PIEIFR5.all != 0x0000 ){}
  282.    
  283.        // Stop here and check the order the ISR's were serviced in the
  284.        // ISRTrace
  285.    asm("        ESTOP0");
  286.    
  287. // CASE 6:
  288. //     Force all group 6 interrupts at once by writing to the PIEIFR6 register
  289.        // Prepare for the test:
  290.    // Disable interrupts 
  291.    // Clear the trace buffer, PIE Control Register, CPU IER and IFR registers
  292.    DINT;
  293.    for(i = 0; i < 50; i++) ISRTrace[i] = 0;
  294.    ISRTraceIndex = 0;
  295.        InitPieCtrl();
  296.        IER = 0;
  297.        IFR &= 0;
  298.        // Enable the PIE block
  299.        PieCtrlRegs.PIECRTL.bit.ENPIE = 1;   
  300.               
  301.        // Enable PIE group 6 interrupts 1-8 
  302.        PieCtrlRegs.PIEIER6.all = 0x00FF;
  303.    // Make sure PIEACK for group 6 is clear (default after reset)
  304.        PieCtrlRegs.PIEACK.all = M_INT6;    
  305.               
  306.        // Enable CPU INT6
  307.        IER |= (M_INT6);
  308.        // Force all valid interrupts for Group 6
  309.        PieCtrlRegs.PIEIFR6.all = ISRS_GROUP6;  
  310.    // Enable Global interrupts
  311.    EINT;
  312.    
  313.    
  314.    // Wait for all group 6 interrupts to be serviced
  315.    while(PieCtrlRegs.PIEIFR6.all != 0x0000 ){}
  316.    
  317.        // Stop here and check the order the ISR's were serviced in the
  318.        // ISRTrace
  319.    asm("        ESTOP0");
  320. // CASE 8:
  321. //     Force all group 9 interrupts at once by writing to the PIEIFR4 register
  322.        // Prepare for the test:
  323.    // Disable interrupts 
  324.    // Clear the trace buffer, PIE Control Register, CPU IER and IFR registers
  325.    DINT;
  326.    for(i = 0; i < 50; i++) ISRTrace[i] = 0;
  327.    ISRTraceIndex = 0;
  328.        InitPieCtrl();
  329.        IER = 0;
  330.        IFR &= 0;    
  331.        // Enable the PIE block
  332.        PieCtrlRegs.PIECRTL.bit.ENPIE = 1;   
  333.        
  334.        // Enable PIE group 9 interrupts 1-8 
  335.        PieCtrlRegs.PIEIER9.all = 0x00FF;
  336.        
  337.    // Make sure PIEACK for group 9 is clear (default after reset)
  338.        PieCtrlRegs.PIEACK.all = M_INT9;
  339.        // Enable CPU INT9
  340.        IER |= (M_INT9);
  341.        // Force all valid interrupts for Group 9
  342.        PieCtrlRegs.PIEIFR9.all = ISRS_GROUP9;  
  343.    // Enable Global interrupts
  344.    EINT;
  345.    // Wait for all group 9 interrupts to be serviced
  346.    while(PieCtrlRegs.PIEIFR9.all != 0x0000 ){}
  347.    
  348.        // Stop here and check the order the ISR's were serviced in the
  349.        // ISRTrace
  350.    asm("        ESTOP0");
  351.    
  352. // CASE 9:
  353. //     Force all group 1 and group 2 interrupts at once
  354.        // Setup next test - fire interrupts from Group 1 and Group 2
  355.        // Prepare for the test:
  356.    // Disable interrupts 
  357.    // Clear the trace buffer, PIE Control Register, CPU IER and IFR registers
  358.    DINT;
  359.    for(i = 0; i < 50; i++) ISRTrace[i] = 0;
  360.    ISRTraceIndex = 0;
  361.        InitPieCtrl();
  362.        IER = 0;
  363.        IFR &= 0;
  364.        // Enable the PIE block
  365.        PieCtrlRegs.PIECRTL.bit.ENPIE = 1;   
  366.        // Enable PIE group 1 and group 2 interrupts 1-8 
  367.        PieCtrlRegs.PIEIER1.all = 0x00FF;
  368.        PieCtrlRegs.PIEIER2.all = 0x00FF;
  369.    // Make sure PIEACK for group 1 & 2 are clear (default after reset)
  370.        PieCtrlRegs.PIEACK.all = (M_INT3 | M_INT2);
  371.        // Enable CPU INT1 and INT2
  372.        IER |= (M_INT1|M_INT2);
  373.               
  374.        // Force all valid interrupts for Group 1 and from Group 2
  375.        PieCtrlRegs.PIEIFR1.all = ISRS_GROUP1;  
  376.        PieCtrlRegs.PIEIFR2.all = ISRS_GROUP2;  
  377.    // Enable Global interrupts
  378.    EINT;
  379.    
  380.    // Wait for all group 1 and group 2 interrupts to be serviced
  381.    while(PieCtrlRegs.PIEIFR1.all != 0x0000 
  382.       || PieCtrlRegs.PIEIFR2.all != 0x0000 ){}
  383.    
  384.    // Check the ISRTrace to determine which order the ISR Routines completed
  385.    asm("        ESTOP0");    
  386. // CASE 10:
  387. //     Force all group 1 and group 2 and group 3 interrupts at once
  388.        // Prepare for the test:
  389.    // Disable interrupts 
  390.    // Clear the trace buffer, PIE Control Register, CPU IER and IFR registers
  391.    DINT;
  392.    for(i = 0; i < 50; i++) ISRTrace[i] = 0;
  393.    ISRTraceIndex = 0;
  394.        InitPieCtrl();
  395.        IER = 0;
  396.        IFR &= 0;
  397.        // Enable the PIE block
  398.        PieCtrlRegs.PIECRTL.bit.ENPIE = 1;   
  399.        
  400.        // Enable PIE group 1, 2 and 3 interrupts 1-8 
  401.        PieCtrlRegs.PIEIER1.all = 0x00FF;
  402.        PieCtrlRegs.PIEIER2.all = 0x00FF;
  403.        PieCtrlRegs.PIEIER3.all = 0x00FF;
  404.    // Make sure PIEACK for group 1, 2 & 3 are clear (default after reset)
  405.        PieCtrlRegs.PIEACK.all = (M_INT3|M_INT2|M_INT3);
  406.        // Enable CPU INT1, INT2 & INT3
  407.        IER |= (M_INT1|M_INT2|M_INT3);
  408.        
  409.        // Force all valid interrupts for Group1, 2 and 3
  410.        PieCtrlRegs.PIEIFR1.all = ISRS_GROUP1;  
  411.        PieCtrlRegs.PIEIFR2.all = ISRS_GROUP2;  
  412.        PieCtrlRegs.PIEIFR3.all = ISRS_GROUP3;  
  413.    // Enable Global interrupts
  414.    EINT;
  415.    
  416.    // Wait for all group 1 and group 2 and group 3 interrupts to be serviced
  417.    while(PieCtrlRegs.PIEIFR1.all != 0x0000 
  418.       || PieCtrlRegs.PIEIFR2.all != 0x0000 
  419.       || PieCtrlRegs.PIEIFR3.all != 0x0000 ) {}
  420.       
  421.    // Check the ISRTrace to determine which order the ISR Routines completed
  422.    asm("        ESTOP0");
  423. // CASE 11:
  424. //     Force all used PIE interrupts at once
  425.        // Prepare for the test:
  426.    // Disable interrupts 
  427.    // Clear the trace buffer, PIE Control Register, CPU IER and IFR registers
  428.    DINT;
  429.    for(i = 0; i < 50; i++) ISRTrace[i] = 0;
  430.    ISRTraceIndex = 0;
  431.        InitPieCtrl();
  432.        IER = 0;
  433.        IFR &= 0;
  434.        // Enable the PIE block
  435.        PieCtrlRegs.PIECRTL.bit.ENPIE = 1;   
  436.        // Enable all PIE group iterrupts 1-8 
  437.        PieCtrlRegs.PIEIER1.all = 0x00FF;
  438.        PieCtrlRegs.PIEIER2.all = 0x00FF;
  439.        PieCtrlRegs.PIEIER3.all = 0x00FF;
  440.        PieCtrlRegs.PIEIER4.all = 0x00FF;
  441.        PieCtrlRegs.PIEIER5.all = 0x00FF;
  442.        PieCtrlRegs.PIEIER6.all = 0x00FF;
  443.        PieCtrlRegs.PIEIER9.all = 0x00FF;
  444.    // Make sure PIEACK for group 1, 2, 3, 4, 5, 6 and 9 are clear (default after reset)
  445.        PieCtrlRegs.PIEACK.all = (M_INT1|M_INT2|M_INT3|M_INT4|M_INT5|M_INT6|M_INT9);
  446.        // Enable CPU INT1, INT2, INT3, INT4, INT5, INT6 and INT9
  447.        IER |= (M_INT1|M_INT2|M_INT3|M_INT4|M_INT5|M_INT6|M_INT9);
  448.               
  449.        // Force all valid interrupts for all PIE groups
  450.        PieCtrlRegs.PIEIFR1.all = ISRS_GROUP1;  
  451.        PieCtrlRegs.PIEIFR2.all = ISRS_GROUP2;  
  452.        PieCtrlRegs.PIEIFR3.all = ISRS_GROUP3;  
  453.        PieCtrlRegs.PIEIFR4.all = ISRS_GROUP4;  
  454.        PieCtrlRegs.PIEIFR5.all = ISRS_GROUP5;  
  455.        PieCtrlRegs.PIEIFR6.all = ISRS_GROUP6;  
  456.        PieCtrlRegs.PIEIFR9.all = ISRS_GROUP9;  
  457.    // Enable Global interrupts - CPU level
  458.    EINT;
  459.    
  460.    // Wait for all group interrupts to be serviced
  461.    while(PieCtrlRegs.PIEIFR1.all != 0x0000 
  462.       || PieCtrlRegs.PIEIFR2.all != 0x0000 
  463.       || PieCtrlRegs.PIEIFR3.all != 0x0000 
  464.           || PieCtrlRegs.PIEIFR4.all != 0x0000 
  465.       || PieCtrlRegs.PIEIFR5.all != 0x0000 
  466.       || PieCtrlRegs.PIEIFR6.all != 0x0000 
  467.       || PieCtrlRegs.PIEIFR9.all != 0x0000 ) {}
  468.       
  469.    // Check the ISRTrace to determine which order the ISR Routines completed
  470.    asm("        ESTOP0");
  471. //===========================================================================
  472. // No more.
  473. //===========================================================================