电子大神的日记本,供应链专家的功夫茶盘,在这里记录、分享与共鸣。

登录以开始

2812中关于c语言中断处理的问题

关于F2812中用C语言来实现中断的说明:
1.首先在.cmd中定位系统中断表:
MEMORY
{
PAGE 0 :?
?......................................
PAGE 1 :?
?......................................
?? PIE_VECT?? : origin = 0x000D00, length = 0x000100

?......................................?????????
}
?
?
SECTIONS
{
?? ...................................?
?? PieVectTable????? : > PIE_VECT,?? PAGE = 1
?.....................................
}
2.在C中制定该中断的结构体:
#pragma DATA_SECTION(PieVectTable,"PieVectTable");
struct PIE_VECT_TABLE PieVectTable;(在DSP28_GlobalVariableDefs.C中初始化)
3.用一组常数(按照中断向量的顺序)初始化该名字为PIE_VECT_TABLE的表:
typedef interrupt void(*PINT)(void);

// Define Vector Table:
struct PIE_VECT_TABLE {

// Reset is never fetched from this table.??
// It will always be fetched from 0x3FFFC0 in either
// boot ROM or XINTF Zone 7 depending on the state of
// the XMP/MC input signal.? On the F2810 it is always
// fetched from boot ROM.

????? PINT???? PIE1_RESERVED;??
????? PINT???? PIE2_RESERVED;
????? PINT???? PIE3_RESERVED;
????? PINT???? PIE4_RESERVED;
????? PINT???? PIE5_RESERVED;
????? PINT???? PIE6_RESERVED;
????? PINT???? PIE7_RESERVED;
????? PINT???? PIE8_RESERVED;
????? PINT???? PIE9_RESERVED;
????? PINT???? PIE10_RESERVED;
????? PINT???? PIE11_RESERVED;
????? PINT???? PIE12_RESERVED;
????? PINT???? PIE13_RESERVED;

// Non-Peripheral Interrupts:
????? PINT???? XINT13;??? // XINT13
????? PINT???? TINT2;???? // CPU-Timer2
????? PINT???? DATALOG;?? // Datalogging interrupt
????? PINT???? RTOSINT;?? // RTOS interrupt
????? PINT???? EMUINT;??? // Emulation interrupt
????? PINT???? XNMI;????? // Non-maskable interrupt
????? PINT???? ILLEGAL;?? // Illegal operation TRAP
????? PINT???? USER0;???? // User Defined trap 0
????? PINT???? USER1;???? // User Defined trap 1
????? PINT???? USER2;???? // User Defined trap 2
????? PINT???? USER3;???? // User Defined trap 3
????? PINT???? USER4;???? // User Defined trap 4
????? PINT???? USER5;???? // User Defined trap 5
????? PINT???? USER6;???? // User Defined trap 6
????? PINT???? USER7;???? // User Defined trap 7
????? PINT???? USER8;???? // User Defined trap 8
????? PINT???? USER9;???? // User Defined trap 9
????? PINT???? USER10;??? // User Defined trap 10
????? PINT???? USER11;??? // User Defined trap 11
??????
// Group 1 PIE Peripheral Vectors:
????? PINT???? PDPINTA;?? // EV-A
????? PINT???? PDPINTB;?? // EV-B
????? PINT???? rsvd1_3;
????? PINT???? XINT1;?????
????? PINT???? XINT2;
????? PINT???? ADCINT;??? // ADC
????? PINT???? TINT0;???? // Timer 0
????? PINT???? WAKEINT;?? // WD
???????????
// Group 2 PIE Peripheral Vectors:
????? PINT???? CMP1INT;?? // EV-A
????? PINT???? CMP2INT;?? // EV-A
????? PINT???? CMP3INT;?? // EV-A
????? PINT???? T1PINT;??? // EV-A
????? PINT???? T1CINT;??? // EV-A
????? PINT???? T1UFINT;?? // EV-A
????? PINT???? T1OFINT;?? // EV-A
????? PINT???? rsvd2_8;
??????
// Group 3 PIE Peripheral Vectors:
????? PINT???? T2PINT;??? // EV-A
????? PINT???? T2CINT;??? // EV-A
????? PINT???? T2UFINT;?? // EV-A
????? PINT???? T2OFINT;?? // EV-A
????? PINT???? CAPINT1;?? // EV-A
????? PINT???? CAPINT2;?? // EV-A
????? PINT???? CAPINT3;?? // EV-A
????? PINT???? rsvd3_8;
??????
// Group 4 PIE Peripheral Vectors:
????? PINT???? CMP4INT;?? // EV-B
????? PINT???? CMP5INT;?? // EV-B
????? PINT???? CMP6INT;?? // EV-B
????? PINT???? T3PINT;??? // EV-B
????? PINT???? T3CINT;??? // EV-B
????? PINT???? T3UFINT;?? // EV-B
????? PINT???? T3OFINT;?? // EV-B
????? PINT???? rsvd4_8;??????
?????
// Group 5 PIE Peripheral Vectors:
????? PINT???? T4PINT;??? // EV-B
????? PINT???? T4CINT;??? // EV-B
????? PINT???? T4UFINT;?? // EV-B
????? PINT???? T4OFINT;?? // EV-B
????? PINT???? CAPINT4;?? // EV-B
????? PINT???? CAPINT5;?? // EV-B
????? PINT???? CAPINT6;?? // EV-B
????? PINT???? rsvd5_8;?????

// Group 6 PIE Peripheral Vectors:
????? PINT???? SPIRXINTA; // SPI-A
????? PINT???? SPITXINTA; // SPI-A
????? PINT???? rsvd6_3;
????? PINT???? rsvd6_4;
????? PINT???? MRINTA;??? // McBSP-A
????? PINT???? MXINTA;??? // McBSP-A
????? PINT???? rsvd6_7;
????? PINT???? rsvd6_8;
??????
// Group 7 PIE Peripheral Vectors:
????? PINT???? rsvd7_1;
????? PINT???? rsvd7_2;
????? PINT???? rsvd7_3;
????? PINT???? rsvd7_4;
????? PINT???? rsvd7_5;
????? PINT???? rsvd7_6;
????? PINT???? rsvd7_7;
????? PINT???? rsvd7_8;

// Group 8 PIE Peripheral Vectors:
????? PINT???? rsvd8_1;
????? PINT???? rsvd8_2;
????? PINT???? rsvd8_3;
????? PINT???? rsvd8_4;
????? PINT???? rsvd8_5;
????? PINT???? rsvd8_6;
????? PINT???? rsvd8_7;
????? PINT???? rsvd8_8;

// Group 9 PIE Peripheral Vectors:???
????? PINT???? RXAINT;??? // SCI-A
????? PINT???? TXAINT;??? // SCI-A
????? PINT???? RXBINT;??? // SCI-B
????? PINT???? TXBINT;??? // SCI-B
????? PINT???? ECAN0INTA; // eCAN
????? PINT???? ECAN1INTA; // eCAN
????? PINT???? rsvd9_7;
????? PINT???? rsvd9_8;

// Group 10 PIE Peripheral Vectors:
????? PINT???? rsvd10_1;
????? PINT???? rsvd10_2;
????? PINT???? rsvd10_3;
????? PINT???? rsvd10_4;
????? PINT???? rsvd10_5;
????? PINT???? rsvd10_6;
????? PINT???? rsvd10_7;
????? PINT???? rsvd10_8;
????????????
// Group 11 PIE Peripheral Vectors:
????? PINT???? rsvd11_1;
????? PINT???? rsvd11_2;
????? PINT???? rsvd11_3;
????? PINT???? rsvd11_4;
????? PINT???? rsvd11_5;
????? PINT???? rsvd11_6;
????? PINT???? rsvd11_7;
????? PINT???? rsvd11_8;

// Group 12 PIE Peripheral Vectors:
????? PINT???? rsvd12_1;
????? PINT???? rsvd12_2;
????? PINT???? rsvd12_3;
????? PINT???? rsvd12_4;
????? PINT???? rsvd12_5;
????? PINT???? rsvd12_6;
????? PINT???? rsvd12_7;
????? PINT???? rsvd12_8;
};
然后在使我们在.cmd文件中定义的表有以上属性:
extern struct PIE_VECT_TABLE PieVectTable;(在.h文件中)
4.初始化该表(在.c文件中)使之能够为主程序所使用:
const struct PIE_VECT_TABLE PieVectTableInit = {

????? PIE_RESERVED,? // Reserved space
????? PIE_RESERVED,???
????? PIE_RESERVED,???
????? PIE_RESERVED,???
????? PIE_RESERVED,???
????? PIE_RESERVED,???
????? PIE_RESERVED,???
????? PIE_RESERVED,???
????? PIE_RESERVED,???
????? PIE_RESERVED,???
????? PIE_RESERVED,???
????? PIE_RESERVED,???
????? PIE_RESERVED,??

// Non-Peripheral Interrupts
????? INT13_ISR,???? // XINT13 or CPU-Timer 1
????? INT14_ISR,???? // CPU-Timer2
????? DATALOG_ISR,?? // Datalogging interrupt
????? RTOSINT_ISR,?? // RTOS interrupt
????? EMUINT_ISR,??? // Emulation interrupt
????? NMI_ISR,?????? // Non-maskable interrupt
????? ILLEGAL_ISR,?? // Illegal operation TRAP
????? USER0_ISR,???? // User Defined trap 0
????? USER1_ISR,???? // User Defined trap 1
????? USER2_ISR,???? // User Defined trap 2
????? USER3_ISR,???? // User Defined trap 3
????? USER4_ISR,???? // User Defined trap 4
????? USER5_ISR,???? // User Defined trap 5
????? USER6_ISR,???? // User Defined trap 6
????? USER7_ISR,???? // User Defined trap 7
????? USER8_ISR,???? // User Defined trap 8
????? USER9_ISR,???? // User Defined trap 9
????? USER10_ISR,??? // User Defined trap 10
????? USER11_ISR,??? // User Defined trap 11

// Group 1 PIE Vectors
????? PDPINTA_ISR,?? // EV-A
????? PDPINTB_ISR,?? // EV-B
????? rsvd_ISR,
????? XINT1_ISR,?????
????? XINT2_ISR,
????? ADCINT_ISR,??? // ADC
????? TINT0_ISR,???? // Timer 0
????? WAKEINT_ISR,?? // WD

// Group 2 PIE Vectors
????? CMP1INT_ISR,?? // EV-A
????? CMP2INT_ISR,?? // EV-A
????? CMP3INT_ISR,?? // EV-A
????? T1PINT_ISR,??? // EV-A
????? T1CINT_ISR,??? // EV-A
????? T1UFINT_ISR,?? // EV-A
????? T1OFINT_ISR,?? // EV-A
????? rsvd_ISR,
??????
// Group 3 PIE Vectors
????? T2PINT_ISR,??? // EV-A
????? T2CINT_ISR,??? // EV-A
????? T2UFINT_ISR,?? // EV-A
????? T2OFINT_ISR,?? // EV-A
????? CAPINT1_ISR,?? // EV-A
????? CAPINT2_ISR,?? // EV-A
????? CAPINT3_ISR,?? // EV-A
????? rsvd_ISR,
??????
// Group 4 PIE Vectors
????? CMP4INT_ISR,?? // EV-B
????? CMP5INT_ISR,?? // EV-B
????? CMP6INT_ISR,?? // EV-B
????? T3PINT_ISR,??? // EV-B
????? T3CINT_ISR,??? // EV-B
????? T3UFINT_ISR,?? // EV-B
????? T3OFINT_ISR,?? // EV-B
????? rsvd_ISR,??????
?????
// Group 5 PIE Vectors
????? T4PINT_ISR,??? // EV-B
????? T4CINT_ISR,??? // EV-B
????? T4UFINT_ISR,?? // EV-B
????? T4OFINT_ISR,?? // EV-B
????? CAPINT4_ISR,?? // EV-B
????? CAPINT5_ISR,?? // EV-B
????? CAPINT6_ISR,?? // EV-B
????? rsvd_ISR,?????

// Group 6 PIE Vectors
????? SPIRXINTA_ISR,?? // SPI-A
????? SPITXINTA_ISR,?? // SPI-A
????? rsvd_ISR,
????? rsvd_ISR,
????? MRINTA_ISR,??? // McBSP-A
????? MXINTA_ISR,??? // McBSP-A
????? rsvd_ISR,
????? rsvd_ISR,
??????
// Group 7 PIE Vectors
????? rsvd_ISR,???
????? rsvd_ISR,???
????? rsvd_ISR,???
????? rsvd_ISR,???
????? rsvd_ISR,???
????? rsvd_ISR,???
????? rsvd_ISR,???
????? rsvd_ISR,??

// Group 8 PIE Vectors
????? rsvd_ISR,???
????? rsvd_ISR,???
????? rsvd_ISR,???
????? rsvd_ISR,???
????? rsvd_ISR,???
????? rsvd_ISR,???
????? rsvd_ISR,???
????? rsvd_ISR,???
??????
// Group 9 PIE Vectors?????
????? SCIRXINTA_ISR, // SCI-A
????? SCITXINTA_ISR, // SCI-A
????? SCIRXINTB_ISR, // SCI-B
????? SCITXINTB_ISR, // SCI-B
????? ECAN0INTA_ISR, // eCAN
????? ECAN1INTA_ISR, // eCAN
????? rsvd_ISR,???
????? rsvd_ISR,???
??????
// Group 10 PIE Vectors
????? rsvd_ISR,???
????? rsvd_ISR,???
????? rsvd_ISR,???
????? rsvd_ISR,???
????? rsvd_ISR,???
????? rsvd_ISR,???
????? rsvd_ISR,???
????? rsvd_ISR,???
????????????
// Group 11 PIE Vectors
????? rsvd_ISR,???
????? rsvd_ISR,???
????? rsvd_ISR,???
????? rsvd_ISR,???
????? rsvd_ISR,???
????? rsvd_ISR,???
????? rsvd_ISR,???
????? rsvd_ISR,??

// Group 12 PIE Vectors
????? rsvd_ISR,???
????? rsvd_ISR,???
????? rsvd_ISR,???
????? rsvd_ISR,???
????? rsvd_ISR,???
????? rsvd_ISR,???
????? rsvd_ISR,???
????? rsvd_ISR,???
};

//---------------------------------------------------------------------------
// InitPieVectTable:?
//---------------------------------------------------------------------------
// This function initializes the PIE vector table to a known state.
// This function must be executed after boot time.
//

void InitPieVectTable(void)
{
?int16?i;
?Uint32 *Source = (void *) &PieVectTableInit;
?Uint32 *Dest = (void *) &PieVectTable;
??
?EALLOW;?
?for(i=0; i < 128; i++)
??*Dest++ = *Source++;?
?EDIS;

?// Enable the PIE Vector Table
?PieCtrl.PIECRTL.bit.ENPIE = 1;?
???
}
5.中断服务程序:
让以上的数值指向你所要的服务程序,例如:
PieVectTable.TINT2 = &ISRTimer2;
那么,ISRTimer2也就成了中断服务程序,
×××切记:一定要在主程序的开始先声明该程序:
interrupt void ISRTimer2(void);

.............
.............
然后按照您的需要编制该程序:
interrupt void ISRTimer2(void)
{
?CpuTimer2.InterruptCount++;
}

博主
google12
google12's Blog
google12
点击跳转