-- 作者:wangxinxin
-- 发布时间:2010-12-10 12:04:35
-- 关于F2812中用C语言来实现中断的说明
关于F2812中用C语言来实现中断的说明: 1.首先在.cmd中定位系统中断表: MEMORY { PAGE 0 : ...................................... PAGE 1 : ...................................... PIE_VECT : origin = 0x000D00, length = 0x000100 7 @\' f# G+ T1 g
...................................... }
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);这里有些一问,一下应该为函数名?? ) M. w, G3 ^+ v) c* h e5 o
// Define Vector Table: struct PIE_VECT_TABLE { : y5 r# r\' m( }4 F# \\! d! _7 z
// 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. 8 r: r, N5 P. b" o$ J2 C6 ]
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; % ^! U6 d* R6 Q9 ?
// 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; # c" P/ a, `\' g. t\' Y\' V: l
// 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; ) X+ e1 w- d" o% S5 `1 h# o
// 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; . n) v4 d; T, }9 H% Y7 l7 K
// 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; : F: C6 l( m* Y) x
// 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; \' R0 L2 H0 L4 M e- X0 p
// 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 = { 0 e/ r* {5 P7 u k. \\7 a
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, # T& u6 w: U0 R# J! j
// 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 : N\' }3 w, d# q7 r
// 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 _4 }) S" s$ N( k+ k( `5 R# l\' T$ @
// 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, ( A( Z, `9 g8 I, i% t% ~: L2 E
// 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, + I( b) D4 S\' a5 W
// 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, 9 c$ u# B O8 L e- J# ]
// Group 12 PIE Vectors rsvd_ISR, rsvd_ISR, rsvd_ISR, rsvd_ISR, rsvd_ISR, rsvd_ISR, rsvd_ISR, rsvd_ISR, }; $ l; q3 G X) h) K+ y
//--------------------------------------------------------------------------- // InitPieVectTable: //--------------------------------------------------------------------------- // This function initializes the PIE vector table to a known state. // This function must be executed after boot time. // 6 I6 S1 Q9 M4 Q) a/ g$ L
void InitPieVectTable(void) { int16 i; Uint32 *Source = (void *) &ieVectTableInit; Uint32 *Dest = (void *) &ieVectTable;
EALLOW; for(i=0; i < 128; i++) *Dest++ = *Source++; EDIS; [/ t; }+ q! a6 n9 W/ |
// Enable the PIE Vector Table PieCtrl.PIECRTL.bit.ENPIE = 1;
} 5.中断服务程序: 让以上的数值指向你所要的服务程序,例如: PieVectTable.TINT2 = &ISRTimer2; 那么,ISRTimer2也就成了中断服务程序, ×××切记:一定要在主程序的开始先声明该程序: interrupt void ISRTimer2(void); 6 U |2 W: o" G; N* r" {/ S# v* C
............. ............. 然后按照您的需要编制该程序: interrupt void ISRTimer2(void) { CpuTimer2.InterruptCount++; } " z. p8 _* J1 d% v6 t8 q. o: W$ p
|