본문 바로가기
임베디드 엔지니어링/TMS320F28335

DSP제어(TMS320F28335) : 1ms 주기 LED Toggle 프로그램(3) - PIE 세팅

by Bennyziio 2019. 4. 10.
반응형

2019/04/09 - [임베디드 프로세서/TMS320F28335] - 1ms 주기 LED Toggle 프로그램(1) - System 세팅

 

1ms 주기 LED Toggle 프로그램(1) - System 세팅

◆ GPIO Toggle 기능을 이용하여 30MHz 오실레이터를 이용하여 150Mhz 클럭을 설정 후 1ms 주기로 제어하는 프로그램을 구현하고자 하였습니다. 추가로 500ms 에서 동작하는 것도 추가를 해 보았으며, 이를 오실로..

bennyziiolab.tistory.com

2019/04/09 - [임베디드 프로세서/TMS320F28335] - 1ms 주기 LED Toggle 프로그램(2) - GPIO 세팅

 

1ms 주기 LED Toggle 프로그램(2) - GPIO 세팅

2019/04/09 - [임베디드 프로세서/TMS320F28335] - 1ms 주기 LED Toggle 프로그램(1) - System 세팅 1ms 주기 LED Toggle 프로그램(1) - System 세팅 ◆ GPIO Toggle 기능을 이용하여 30MHz 오실레이터를 이용하여..

bennyziiolab.tistory.com

GPIO 초기값 세팅후 실제 동작을 하기에 앞서 PIE 초기화에 대해서 다루어 보도록 하겠습니다. 우선 소스코드를 먼저 보여드릴게요.

 

// Step 3. Clear all interrupts and initialize PIE vector table:
// Disable CPU interrupts
   DINT;

// Initialize the 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 DSP2833x_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 DSP2833x_DefaultIsr.c.
// This function is found in DSP2833x_PieVect.c.
   InitPieVectTable();

// Interrupts that are used in this example are re-mapped to
// ISR functions found within this file.
   EALLOW;  // This is needed to write to EALLOW protected registers
   PieVectTable.TINT0 = &cpu_timer0_isr;
   PieVectTable.XINT13 = &cpu_timer1_isr;
   PieVectTable.TINT2 = &cpu_timer2_isr;

   EDIS;    // This is needed to disable write to EALLOW protected registers

PIE는 Peripheral Interrupt Expansion의 약자로 확장된 주변장치 인터럽트라고 직역해 볼 수 있습니다.

 

순서를 보면 DINT로 전역 인터럽트를 해제하고 InitPieCtrl() 함수를 콜하게 됩니다.

InitPieCtrl() 함수에서 개별 인터럽트 설정 및 플래그 비트를 모두 클리어 해주는데 이는 DSP2833x_PieCtrl.c에서 확인할 수 있습니다.

//
// InitPieCtrl - This function initializes the PIE control registers to a known
// state.
//
void 
InitPieCtrl(void)
{
    //
    // Disable Interrupts at the CPU level
    //
    DINT;
    
    //
    // Disable the PIE
    //
    PieCtrlRegs.PIECTRL.bit.ENPIE = 0;

    //
    // Clear all PIEIER registers
    //
    PieCtrlRegs.PIEIER1.all = 0;
    PieCtrlRegs.PIEIER2.all = 0;
    PieCtrlRegs.PIEIER3.all = 0;	
    PieCtrlRegs.PIEIER4.all = 0;
    PieCtrlRegs.PIEIER5.all = 0;
    PieCtrlRegs.PIEIER6.all = 0;
    PieCtrlRegs.PIEIER7.all = 0;
    PieCtrlRegs.PIEIER8.all = 0;
    PieCtrlRegs.PIEIER9.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.PIEIFR4.all = 0;
    PieCtrlRegs.PIEIFR5.all = 0;
    PieCtrlRegs.PIEIFR6.all = 0;
    PieCtrlRegs.PIEIFR7.all = 0;
    PieCtrlRegs.PIEIFR8.all = 0;
    PieCtrlRegs.PIEIFR9.all = 0;
    PieCtrlRegs.PIEIFR10.all = 0;
    PieCtrlRegs.PIEIFR11.all = 0;
    PieCtrlRegs.PIEIFR12.all = 0;
}	

위 함수가 해당 InitPieCtrl() 함수의 코드인데 PIEIER 레지스터를 모두 0으로 clear 해주는 것을 볼 수 있습니다.

 

다음은 Core 인터럽트 설정 스위치 클리어 및 플래그 비트 클리어 구문을 볼 수 있는데요.

// Disable CPU interrupts and clear all CPU interrupt flags:
   IER = 0x0000;
   IFR = 0x0000;

CPU 인터럽트와 CPU 인터럽트 플래그 또한 0으로 Clear 해주어야 합니다.

 

다음으로 InitPieVectTable() 개별 인터럽트 확장 함수로서 인터럽트 벡터 테이블로서 이를 간단히 설명하자면 벡터는 위치를 가지고 있는 거라고 알고 계실것입니다. 즉 인터럽트의 주소값을 포인터로 지정해둔 것을 초기화 해준다로 설명할 수 있겠는데요. 초기화라는 개념은 결국 가장 깨끗한 상태로 만들어 동작이 원할하게 할 수 있는 배경을 만들어 주는 거라고 생각하시면 좋을 듯 합니다.

InitPieVectTable() 함수는 DSP2833x_PieVect.c 파일에서 확인할 수 있습니다.

//
// 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;
    volatile Uint32 *Dest = (void *) &PieVectTable;
        
    EALLOW;	
    for(i=0; i < 128; i++)
    {
        *Dest++ = *Source++;
    }
    EDIS;

    //
    // Enable the PIE Vector Table
    //
    PieCtrlRegs.PIECTRL.bit.ENPIE = 1;	
}

다음으로 저는 cpu_timer0_isr을 이용하여 1ms 마다 FLAG를 띄워서 메인문에서 무한루프로 작성을 하여야 했기 때문에 다음과 같이 설정해주었습니다.

// Interrupts that are used in this example are re-mapped to
// ISR functions found within this file.
   EALLOW;  // This is needed to write to EALLOW protected registers
   PieVectTable.TINT0 = &cpu_timer0_isr;

이렇게 해주어야 cpu_timer0_isr을 설정해 줄 수 있는데요 저기서 TINT0는 아래 그림을 참조하시면 이해하실 수 있습니다.

인터럽트를 설정하기 위해 위와 같이 하였고 이제 다시 레지스터를 보호하기 위해 EDIS를 사용하여 보호기능을 설정합니다.

단순히 현재까지는 32비트 CPU Timer 0를 인터럽트로 사용하기 위해서 설정해준 상황이며 이제 CPU-Timer 0를 어떻게 세팅을 하여 사용하는 지는 다음 블로그에서 설명하도록 하겠습니다.

반응형

댓글