ROBOTICS LAB. http://cafe.naver.com/roboticslab DSP TMS320F2812 ROBOTICS LAB. http://cafe.naver.com/roboticslab
Contents 1. TMS320F2812 Interrupt 2. TMS320F2812 CPU Timer 3. TMS320F2812 GP Timer http://cafe.naver.com/roboticslab
TMS320F2812 Interrupt 인터럽트 구조 인터럽트 요청이 발생하고, 10~11 사이클이 지나면, 인터럽트 서비스 함수가 수행된다. 칩 자체에서 Context Save를 하기에, 추가적인 지연이 발생하지 않는다. 코어 자체는 16개의 인터럽트만을 처리할 수 있다. PIE라는 회로를 통하여 96개까지 관리할 수 있다. http://cafe.naver.com/roboticslab
TMS320F2812 Interrupt 마스크 인터럽트 처리 과정 코어 인터럽트 (IFR) “Latch” (IER) “스위치” 해당 코어 인터럽트가 발생하면, IFR 레지스터의 해당 비트가 1로 SET IFR이 1로 Set된 비트 위치와 동일한 위치의 IER 비트가 1(on)로 되어 있고, INTM이 On 되어 있으면 C28x 코어는 인터럽트를 인식 코어 인터럽트 (IFR) “Latch” (IER) “스위치” (INTM) “주 스위치” C28x Core /INT1 1 /INT2 /INT14 1 http://cafe.naver.com/roboticslab
TMS320F2812 Interrupt IFR & IER Pending : IFR Bit = 1 Absent : IFR Bit = 0 Enable : IER Bit = 1 Disable : IER Bit = 0 http://cafe.naver.com/roboticslab
TMS320F2812 Interrupt INTM 스위치 조작법 INTM 스위치 : INTM = 0 일때, 스위치가 ON Enable: INTM = 0 Disable: INTM = 1 (reset value) INTM 비트 조작은 어셈블리로만 가능: /*** 인라인 어셈블리를 이용한 조작법 ***/ asm(“ CLRC INTM”); //인터럽트 가동 asm(“ SETC INTM”); //인터럽트 해제 http://cafe.naver.com/roboticslab
Used to initialize PIE vectors TMS320F2812 Interrupt 벡터 확장 영역 Default Vector Table Remapped when ENPIE = 1 Priority Vector Offset 1 5 6 7 8 9 10 11 12 13 14 15 16 17 18 Reset INT 1 INT 2 INT 3 INT 4 INT 5 INT 6 INT 7 INT 8 INT 9 INT 10 INT 11 INT 12 INT 13 INT 14 00 02 04 06 08 0A 0C 0E 1A 1C 19 4 2 DlogInt RtosInt EmuInt 1E 20 22 3 - NMI Illegal 24 26 User 1-12 28-3E Memory 0xD00 PIE Vectors 256 W 코어 인터럽트는 BROM 벡터 영역에 할당되어 있다.(최대 32개의 벡터가 실리 수 있다) MC 모드에서만 활성화 된다. Core인터럽트가 PIE 회로에 의해 확장되어서 PIE 벡터 영역으로 재 활당이 된다. 즉, 개별 인터럽트는 벡터 확장을 통해서 고유의 벡터를 부여받게 된다. 0x3FFFC0 BROM Vectors 64 W 0x3FFFFF File: PieVect.c Used to initialize PIE vectors http://cafe.naver.com/roboticslab
Peripheral Interrupts 12ⅹ8 = 96 TMS320F2812 Interrupt 확장된 인터럽트의 처리 Interrupt Group1 최대 96개의 개별 인터럽트 처리 INT 1.y interrupt group INT 2.y interrupt group INT 3.y interrupt group INT 4.y interrupt group INT 5.y interrupt group INT 6.y interrupt group INT 7.y interrupt group INT 8.y interrupt group INT 9.y interrupt group INT 10.y interrupt group INT 11.y interrupt group INT 12.y interrupt group INT1.1 1 INT1.2 1 /INT 96 INT1.8 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 http://cafe.naver.com/roboticslab
TMS320F2812 Interrupt 확장된 인터럽트의 주변 회로 활당 http://cafe.naver.com/roboticslab
TMS320F2812 Interrupt 인터럽트 설정(개별 인터럽트 처리 과정) PIE 회로 처리과정 CPU 처리과정 http://cafe.naver.com/roboticslab
PIE Interrupt Acknowledge Register(PIEACK) TMS320F2812 Interrupt PIE 회로 관련 레지스터 PIEIFRx register (x = 1 to 12) PIEIERx register (x = 1 to 12) PIE Interrupt Acknowledge Register(PIEACK) PIECTRL register http://cafe.naver.com/roboticslab
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; } http://cafe.naver.com/roboticslab
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; } http://cafe.naver.com/roboticslab
TMS320F2812 Interrupt 인터럽트 레지스터 http://cafe.naver.com/roboticslab
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++; } http://cafe.naver.com/roboticslab
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 // 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; http://cafe.naver.com/roboticslab
TMS320F2812 Interrupt 인터럽트 관련 코드 DefaultISR.h Device.h에서 include PieCtrl.c PIE 회로 초기화 PIE 회로 가동 PieVect.c 벡터 레이블 선언 PIE 벡터 확장 Defaultisr.c 테스트용 인터럽트 서비스 루틴 http://cafe.naver.com/roboticslab
TMS320F2812 CPU Timer CPU Timer 총 3개의 Timer가 내장되어 있다. Timer0, Timer1, Timer2 모두 32Bit Timer로 Down-Counting방식 Timer1과 2는 Real Time OS(DSP/BIOS)를 사용할 때, BIOS의 스케쥬링에 이용된다. http://cafe.naver.com/roboticslab
TMS320F2812 CPU Timer CPU Timer의 구조와 동작 원리 http://cafe.naver.com/roboticslab
TMS320F2812 CPU Timer CPU Timer 관련 레지스터 Counter Register Period Register http://cafe.naver.com/roboticslab
TMS320F2812 CPU Timer CPU Timer 관련 레지스터 Control Register Name Description Bit15 TIF CPU-Timer Interrupt Flag Bit14 TIE CPU-Timer Interrupt Enable Bit11 FREE CPU-Timer Emulation Mode Bit10 SOFT Bit5 TRB CPU-Timer Reload Bit Bit4 TSS CPU-Timer Stop Status Bit http://cafe.naver.com/roboticslab
TMS320F2812 GP Timer Event Manager http://cafe.naver.com/roboticslab
TMS320F2812 GP Timer Event Manager 예) 타이머가 넘쳤을 때(Overflow), 타이머가 0으로 떨어 졌을 때(Underflow), 비교 설정된 값과 일치했을 때(Compare), 주기 값과 일치 했을 때(Period) 등과 같은 사건이 발생했을 때, 인터럽트를 발생 시킨 다던지, 아니면, 개발자가 지시한 내용대로 회로를 시간에 맞춰서 움직는 역할을 한다. http://cafe.naver.com/roboticslab
TMS320F2812 GP Timer GP Timer http://cafe.naver.com/roboticslab
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,) http://cafe.naver.com/roboticslab
TMS320F2812 GP Timer GP Timer 관련 레지스터 EVA Interrupt Mask Register A (EVAIMRA) EVA Interrupt Flag Register A (EVAIFRA) http://cafe.naver.com/roboticslab
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) http://cafe.naver.com/roboticslab
실습(1) CPU Timer를 이용한 LED 점멸 다음 프로젝트를 여시오. LED 점멸 코드 구현 C:\tidcs\c28\dsp281x\v100\DSP281x_examples\ cpu_timer\Example_281xCpuTimer.pjt LED 점멸 코드 구현 인터럽트 서비스에 다음을 구현하시오. F14포트에 연결된 LED를 1초 간격으로 점멸 G4포트에 연결된 LED를 10초 간격으로 점멸 G5포트에 연결된 LED를 60초 간격으로 점멸 http://cafe.naver.com/roboticslab
실습(2) GP Timer를 이용한 LED 점멸 다음 프로젝트를 여시오. 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초 간격으로 점멸 http://cafe.naver.com/roboticslab
Address/Data Bus use to external ADC Plan 3차 Peripherals Operation (5월 28일) CPU/GP Timer ADC 4차 Peripherals Operation (6월 ?일) Flesh Memory Control IQMath 3차 Application (6월 ?일) Address/Data Bus use to external ADC 4차 Application (6월 ?일) Step Motor Drive IR Sensor Interface http://cafe.naver.com/roboticslab
Thank You ! www.themegallery.com