?? example_281xswprioritizedinterrupts.c
字號:
//###########################################################################
//
// FILE: Example_281xSWPrioritizedInterrupts.c
//
// TITLE: DSP281x Software Prioritized Interrupt Example.
//
// ASSUMPTIONS:
//
// This program requires the DSP281x V1.00 header files.
// As supplied, this project is configured for "boot to H0" operation.
//
// Other then boot mode pin configuration, no other hardware configuration
// is required.
//
//
// DESCRIPTION:
//
// For most applications, the hardware prioritization of the
// the PIE module is sufficient. For applications that need custom
// prioritization, this example illustrates an example of
// how this can be done through software.
//
// For more information on F2810/12 interrupt priorities, refer to the
// ReadMe_Example_28xISRPriorities.pdf file included with this example.
//
// This program simulates interrupt conflicts by writing to the
// PIEIFR registers. This will simulate multiple interrupts coming into
// the PIE block at the same time.
//
// The interrupt service routine routines are software prioritized
// by the table found in the DSP281x_SWPrioritizedIsrLevels.h file.
//
// 1) Before compiling you must set the Global and Group interrupt priorities
// in the DSP281x_SWPrioritizedIsrLevels.h file.
//
// 2) Compile the code, load, and run
//
// 3) At the end of each test there is a hard coded breakpoint (ESTOP0). When code
// stops at the breakpoint, examine the ISRTrace buffer to see the order
// in which the ISR's completed. All PIE interrupts will add to the
// ISRTrace.
//
// The ISRTrace will consist of a list of hex values as shown:
//
// 0x00wx <- PIE Group w interrup x finished first
// 0x00yz <- PIE Group y interrupt z finished next
//
// 4) If desired, set a new set of Global and Group interrupt priorites
// and repeat the test to see the change.
//
//
// Watch Variables:
// ISRTrace[50] Trace of ISR's in the order they complete
// After each test, examine this buffer
// to determine if the ISR's completed in
// the order desired.
//
//###########################################################################
//
// Ver | dd mmm yyyy | Who | Description of changes
// =====|=============|======|===============================================
// 1.00| 11 Sep 2003 | L.H. | Changes since previous version (v.58 Alpha)
// | | | Corrected a number of comments. Re-structured
// | | | the flow of each testcase to make more sense.
//###########################################################################
#include "DSP281x_Device.h" // DSP281x Headerfile Include File
#include "DSP281x_Examples.h" // DSP281x Examples Include File
// Define which interrupts are used in the PIE for each group.
#define ISRS_GROUP1 (M_INT1|M_INT2|M_INT4|M_INT5|M_INT6|M_INT7|M_INT8)
#define ISRS_GROUP2 (M_INT1|M_INT2|M_INT3|M_INT4|M_INT5|M_INT6|M_INT7)
#define ISRS_GROUP3 (M_INT1|M_INT2|M_INT3|M_INT4|M_INT5|M_INT6|M_INT7)
#define ISRS_GROUP4 (M_INT1|M_INT2|M_INT3|M_INT4|M_INT5|M_INT6|M_INT7)
#define ISRS_GROUP5 (M_INT1|M_INT2|M_INT3|M_INT4|M_INT5|M_INT6|M_INT7)
#define ISRS_GROUP6 (M_INT1|M_INT2|M_INT5|M_INT6)
#define ISRS_GROUP9 (M_INT1|M_INT2|M_INT3|M_INT4|M_INT5)
// This array will be used as a trace to check the order that the
// interrupts were serviced
Uint16 ISRTrace[50];
Uint16 ISRTraceIndex; // used to update an element in the trace buffer
void main(void)
{
Uint16 i;
// Step 1. Initialize System Control:
// PLL, WatchDog, enable Peripheral Clocks
// This example function is found in the DSP281x_SysCtrl.c file.
InitSysCtrl();
// Step 2. Initalize GPIO:
// This example function is found in the DSP281x_Gpio.c file and
// illustrates how to set the GPIO to it's default state.
// InitGpio(); // Skipped for this example
// Step 3. Clear all interrupts and initialize PIE vector table:
// Disable CPU interrupts
DINT;
// Initialize PIE control registers to their default state.
// The default state is all PIE interrupts disabled and flags
// are cleared.
// This function is found in the DSP281x_PieCtrl.c file.
InitPieCtrl();
// Disable CPU interrupts and clear all CPU interrupt flags:
IER = 0x0000;
IFR = 0x0000;
// Initialize the PIE vector table with pointers to the shell Interrupt
// Service Routines (ISR).
// This will populate the entire table, even if the interrupt
// is not used in this example. This is useful for debug purposes.
// The shell ISR routines are found in DSP281x_DefaultIsr.c.
// This function is found in DSP281x_PieVect.c.
InitPieVectTable();
// Step 4. Initialize all the Device Peripherals:
// This function is found in DSP281x_InitPeripherals.c
// InitPeripherals(); // Not required for this example
// Step 5. User specific code, enable interrupts:
// CASE 1:
// Force all group 1 interrupts at once by writing to the PIEIFR1 register
// Prepare for the test:
// Disable interrupts
// Clear the trace buffer, PIE Control Register, CPU IER and IFR registers
DINT;
for(i = 0; i < 50; i++) ISRTrace[i] = 0;
ISRTraceIndex = 0;
InitPieCtrl();
IER = 0;
IFR &= 0;
// Enable the PIE block
PieCtrlRegs.PIECRTL.bit.ENPIE = 1;
// Enable PIE group 1 interrupt 1-8
PieCtrlRegs.PIEIER1.all = 0x00FF;
// Make sure PIEACK for group 1 is clear (default after reset)
PieCtrlRegs.PIEACK.all = M_INT1;
// Enable CPU INT1
IER |= M_INT1;
// Force all valid interrupts for Group 1
PieCtrlRegs.PIEIFR1.all = ISRS_GROUP1;
// Enable global Interrupts CPU level:
EINT; // Enable Global interrupt INTM
// Wait for all Group 1 interrupts to be serviced
while(PieCtrlRegs.PIEIFR1.all != 0x0000 ){}
// Stop here and check the ISRTrace to determine which order the
// ISR Routines completed. The order is dependant on the priority
// assigned in the DSP281x_SWPrioritizedIsrLevels.h file
//
// The ISRTrace will contain a list of values corresponding to the
// interrupts serviced in the order they were serviced.
// For example if the ISRTrace looks like this
// 0x0014 ISR Group 1 interrupt 4
// 0x0017 ISR Group 1 interrupt 7
// 0x0016 ISR Group 1 interrupt 6
// 0x0000 end of trace
asm(" ESTOP0");
// CASE 2:
// Force all group 2 interrupts at once by writing to the PIEIFR2 register
// Prepare for the test:
// Disable interrupts
// Clear the trace buffer, PIE Control Register, CPU IER and IFR registers
DINT;
for(i = 0; i < 50; i++) ISRTrace[i] = 0;
ISRTraceIndex = 0;
InitPieCtrl();
IER = 0;
IFR &= 0;
// Enable the PIE block
PieCtrlRegs.PIECRTL.bit.ENPIE = 1;
// Enable PIE group 2 interrupts 1-8
PieCtrlRegs.PIEIER2.all = 0x00FF;
// Enable CPU INT2
IER |= (M_INT2);
// Make sure PIEACK for group 2 is clear (default after reset)
PieCtrlRegs.PIEACK.all = M_INT2;
// Force all valid interrupts for Group 2
PieCtrlRegs.PIEIFR2.all = ISRS_GROUP2;
// Enable Global interrupts
EINT;
// Wait for all group 2 interrupts to be serviced
while(PieCtrlRegs.PIEIFR2.all != 0x0000 ){}
// Stop here and check the order the ISR's were serviced in the
// ISRTrace
asm(" ESTOP0");
// CASE 3:
// Force all group 3 interrupts at once by writing to the PIEIFR3 register
// Prepare for the test:
// Disable interrupts
// Clear the trace buffer, PIE Control Register, CPU IER and IFR registers
DINT;
for(i = 0; i < 50; i++) ISRTrace[i] = 0;
ISRTraceIndex = 0;
InitPieCtrl();
IER = 0;
IFR &= 0;
// Enable the PIE block
PieCtrlRegs.PIECRTL.bit.ENPIE = 1;
// Enable PIE group 3 interrupts 1-8
PieCtrlRegs.PIEIER3.all = 0x00FF;
// Make sure PIEACK for group 3 is clear (default after reset)
PieCtrlRegs.PIEACK.all = M_INT3;
// Enable CPU INT3
IER |= (M_INT3);
// Force all valid interrupts for Group 3
PieCtrlRegs.PIEIFR3.all = ISRS_GROUP3;
// Enable Global interrupts
EINT;
// Wait for all group 3 interrupts to be serviced
while(PieCtrlRegs.PIEIFR3.all != 0x0000 ){}
// Stop here and check the order the ISR's were serviced in the
// ISRTrace
asm(" ESTOP0");
// CASE 4:
// Force all group 4 interrupts at once by writing to the PIEIFR4 register
// Prepare for the test:
// Disable interrupts
// Clear the trace buffer, PIE Control Register, CPU IER and IFR registers
DINT;
for(i = 0; i < 50; i++) ISRTrace[i] = 0;
ISRTraceIndex = 0;
InitPieCtrl();
IER = 0;
IFR &= 0;
// Enable the PIE block
PieCtrlRegs.PIECRTL.bit.ENPIE = 1;
// Enable PIE group 4 interrupts 1-8
PieCtrlRegs.PIEIER4.all = 0x00FF;
// Make sure PIEACK for group 3 is clear (default after reset)
PieCtrlRegs.PIEACK.all = M_INT4;
// Enable CPU INT4
IER |= (M_INT4);
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -