320 likes | 956 Views
DSP TMS320F2812. ROBOTICS LAB. http://cafe.naver.com/roboticslab. Contents. 1. TMS320F2812 Interrupt. 2. TMS320F2812 CPU Timer. 3. TMS320F2812 GP Timer. TMS320F2812 Interrupt. 인터럽트 구조. TMS320F2812 Interrupt. 마스크 인터럽트 처리 과정 해당 코어 인터럽트가 발생하면 , IFR 레지스터의 해당 비트가 1 로 SET
E N D
DSP TMS320F2812 ROBOTICS LAB. http://cafe.naver.com/roboticslab
Contents 1. TMS320F2812 Interrupt 2. TMS320F2812 CPU Timer 3. TMS320F2812 GP Timer
TMS320F2812 Interrupt • 인터럽트 구조
TMS320F2812 Interrupt • 마스크 인터럽트 처리 과정 • 해당 코어 인터럽트가 발생하면, IFR 레지스터의 해당 비트가 1로 SET • IFR이 1로 Set된 비트 위치와 동일한 위치의 IER 비트가 1(on)로 되어 있고, INTM이 On 되어 있으면 C28x 코어는 인터럽트를 인식 코어 인터럽트 (IFR) “Latch” (IER) “스위치” (INTM) “주스위치” C28x Core /INT1 1 /INT2 0 /INT14 1
TMS320F2812 Interrupt • IFR & IER Pending : IFR Bit = 1 Absent : IFR Bit = 0 Enable : IER Bit = 1 Disable : IER Bit = 0
TMS320F2812 Interrupt • INTM 스위치 조작법 • INTM 스위치 : INTM = 0 일때, 스위치가 ON • Enable: INTM = 0 • Disable: INTM = 1 (reset value) • INTM 비트 조작은 어셈블리로만 가능: /*** 인라인 어셈블리를 이용한 조작법 ***/ asm(“ CLRC INTM”); //인터럽트 가동 asm(“ SETC INTM”); //인터럽트 해제
TMS320F2812 Interrupt • 벡터 확장 영역 Default Vector Table Remapped when ENPIE = 1 Memory 0 0xD00 PIE Vectors 256 W 0x3FFFC0 BROM Vectors 64 W 0x3FFFFF File: PieVect.c Used to initialize PIE vectors
TMS320F2812 Interrupt • 확장된 인터럽트의 처리 Interrupt Group1 INT1.1 1 INT1.2 1 /INT INT1.8 96 1 Peripheral Interrupts 12ⅹ8 = 96 28x Core Interrupt Logic /INT1 - /INT12 28x Core 12 Interrupts IFR IER INTM /INT13(TINT1 / XINT13) /INT14(TINT2) /NMI
TMS320F2812 Interrupt • 확장된 인터럽트의 주변 회로 활당
TMS320F2812 Interrupt • 인터럽트 설정(개별 인터럽트 처리 과정) PIE 회로 처리과정 CPU 처리과정
TMS320F2812 Interrupt • PIE 회로 관련 레지스터 PIEIFRx register (x = 1 to 12) PIEIERx register (x = 1 to 12) PIE Interrupt Acknowledge Register(PIEACK) PIECTRL register
TMS320F2812 Interrupt • PIE 벡터 확장 코드 – PieVect.c ※ 벡터 정의 부분 #include “DSP28_Device.h” const struct PIE_VECT_TABLE PieVectTableInit = { PIE_RESERVED, // Reserved space ~ ~ // Non-Peripheral Interrupts INT13_ISR, // XINT13 ~ // Group 1 PIE Vectors PDPINTA_ISR, // EV-A PDPINTB_ISR, // EV-B rsved_ISR, XINT1_ISR, XINT2_ISR, ADCINT_ISR, // ADC TINT0_ISR, // Timer 0 WAKEINT_ISR, // WD ~ ~ ~ ~ ~ ※ 벡터 정의 부분 void InitPieVectTable(void) { int16 i; Uint32 *Source = (void *)&PieVectTableInit; Uint32 *Dest = (void *)&PieVectTable; // DSP28_PieVect.h에 선언 EALLOW; for(i=0; i<128; i++) *Dest++ = * Source++; EDIS; // Enable the PIE Vector Table PiectrlRegs.PIECRTL.bit.ENPIE = 1; }
TMS320F2812 Interrupt • PIE 회로 초기화 코드 – PieCtrl.c ※ 레지스터 초기화 void InitPieCtrl(void) { // Disable Interrupts at the CPU level: DINT; // Disable the PIE PieCtrlRegs.PIECRTL.bit.ENPIE = 0; // Clear all PIEIER registers: PieCtrlRegs.PIEIER1.all = 0; PieCtrlRegs.PIEIER2.all = 0; PieCtrlRegs.PIEIER3.all = 0; ~~ PieCtrlRegs.PIEIER10.all = 0; PieCtrlRegs.PIEIER11.all = 0; PieCtrlRegs.PIEIER12.all = 0; // Clear all PIEIFR registers: PieCtrlRegs.PIEIFR1.all = 0; PieCtrlRegs.PIEIFR2.all = 0; PieCtrlRegs.PIEIFR3.all = 0; ~~ PieCtrlRegs.PIEIFR10.all = 0; PieCtrlRegs.PIEIFR11.all = 0; PieCtrlRegs.PIEIFR12.all = 0; } ※ 인터럽트 가동 void EnableInterrupts() { // Enable the PIE PieCtrlRegs.PIECRTL.bit.ENPIE = 1; // Enables PIE to drive a pulse into the CPU PieCtrlRegs.PIEACK.all = 0xFFFF; // Enable Interrupts at the CPU level EINT; }
TMS320F2812 Interrupt • 인터럽트 레지스터
TMS320F2812 Interrupt • Main()에서 인터럽트 설정 void main(void) { // Step 1. Initialize System Control: InitSysCtrl(); // Step 2. Initalize GPIO: // Step 3. Clear all interrupts and initialize PIE vector table: DINT; InitPieCtrl();: IER = 0x0000; IFR = 0x0000; InitPieVectTable(); EALLOW; PieVectTable.TINT0 = &cpu_timer0_isr; EDIS; // Step 4. Initialize all the Device Peripherals: InitCpuTimers(); ConfigCpuTimer(&CpuTimer0, 100, 1000000); StartCpuTimer0(); // Step 5. User specific code, enable interrupts: EALLOW; GpioMuxRegs.GPFMUX.bit.XF_GPIOF14 = 0; GpioMuxRegs.GPFDIR.bit.GPIOF14 = 1; EDIS; // Enable CPU INT1 which is connected to CPU-Timer 0: IER |= M_INT1; // Enable TINT0 in the PIE: Group 1 interrupt 7 PieCtrlRegs.PIEIER1.bit.INTx7 = 1; // Enable global Interrupts and higher priority real-time debug events: EINT; // Enable Global interrupt INTM ERTM; // Enable Global real time interrupt DBGM // Step 6. IDLE loop. Just sit and loop forever (optional): for(;;) backticker++; }
TMS320F2812 Interrupt • 인터럽트 테스트-DefaultISR.c // ----------------------------------------------------------- // PIE Group 1 - MUXed into CPU INT1 // ----------------------------------------------------------- // INT1.1 interrupt void PDPINTA_ISR( void ) // EV-A { // Insert ISR Code here // To receive more interrupts from this PIE group, acknowledge this interrupt // PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; // Next two lines for debug only to halt the processor here // Remove after inserting ISR Code asm (" ESTOP0"); for(;;); } // INT1.2 interrupt void PDPINTB_ISR(void) // EV-B { // Insert ISR Code here // To receive more interrupts from this PIE group, acknowledge this interrupt // PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; // Next two lines for debug only to halt the processor here // Remove after inserting ISR Code asm (" ESTOP0"); for(;;); } // INT1.3 - Reserved // ----------------------------------------------------------- // PIE Group 2 - MUXed into CPU INT2 // ----------------------------------------------------------- // INT2.1 interrupt void CMP1INT_ISR(void) // EV-A { // Insert ISR Code here // To receive more interrupts from this PIE group, acknowledge this interrupt // PieCtrlRegs.PIEACK.all = PIEACK_GROUP2; // Next two lines for debug only to halt the processor here // Remove after inserting ISR Code asm (" ESTOP0"); for(;;); } ※ 인터럽트 설정 확인 용이 ※인터럽트 확인 후 벡터 리맵핑 작업 추천 EALLOW; PieVectTable.TINT0 = &cpu_timer0_isr; EDIS;
TMS320F2812 Interrupt • 인터럽트 관련 코드 • DefaultISR.h • Device.h에서 include • DefaultISR 함수 선언 • PieCtrl.c • PIE 회로 초기화 • PIE 회로 가동 • PieVect.c • 벡터 레이블 선언 • PIE 벡터 확장 • Defaultisr.c • 테스트용 인터럽트 서비스 루틴
TMS320F2812 CPU Timer • CPU Timer • 총 3개의 Timer가 내장되어 있다. • Timer0, Timer1, Timer2 • 모두 32Bit Timer로 Down-Counting방식 • Timer1과 2는 Real Time OS(DSP/BIOS)를사용할 때, BIOS의 스케쥬링에 이용된다.
TMS320F2812 CPU Timer • CPU Timer의 구조와 동작 원리
TMS320F2812 CPU Timer • CPU Timer 관련 레지스터 Counter Register Period Register
TMS320F2812 CPU Timer • CPU Timer 관련 레지스터 Control Register
TMS320F2812 GP Timer • Event Manager
TMS320F2812 GP Timer • Event Manager
TMS320F2812 GP Timer • GP Timer
TMS320F2812 GP Timer • GP Timer 관련 레지스터 GP Timer Control Register A(GPTCONA) Timer x Period Register (TxPR, where x = 1, 2, 3, 4,) Timer x Compare Register (TxCMPR, where x = 1, 2, 3, 4,)
TMS320F2812 GP Timer • GP Timer 관련 레지스터 EVA Interrupt Mask Register A (EVAIMRA) EVA Interrupt Flag Register A (EVAIFRA)
TMS320F2812 GP Timer • GP Timer 관련 레지스터 Timer x Counter Register (TxCNT, where x = 1, 2, 3, or 4) Timer x Control Register (TxCON; x = 1, 2, 3, or 4)
실습(1) • CPU Timer를 이용한 LED 점멸 • 다음 프로젝트를 여시오. C:\tidcs\c28\dsp281x\v100\DSP281x_examples\ cpu_timer\Example_281xCpuTimer.pjt • LED 점멸 코드 구현 • 인터럽트 서비스에 다음을 구현하시오. • F14포트에 연결된 LED를 1초 간격으로 점멸 • G4포트에 연결된 LED를 10초 간격으로 점멸 • G5포트에 연결된 LED를 60초 간격으로 점멸
실습(2) • GP Timer를 이용한 LED 점멸 • 다음 프로젝트를 여시오. C:\tidcs\c28\dsp281x\v100\DSP281x_examples\ ev_timer_period\Example_281xEvTimerPeriod.pjt • LED 점멸 코드 구현 • 인터럽트 서비스에 다음을 구현하시오. • GP Timer1 인터럽트 서비스 루틴 : F14포트에 연결된 LED를 1초 간격으로 점멸 • GP Timer2 인터럽트 서비스 루틴 : G4포트에 연결된 LED를 10초 간격으로 점멸 • GP Timer3 인터럽트 서비스 루틴 : G5포트에 연결된 LED를 60초 간격으로 점멸
Thank You ! www.themegallery.com