2019/04/09 - [임베디드 프로세서/TMS320F28335] - 1ms 주기 LED Toggle 프로그램(1) - System 세팅
2019/04/09 - [임베디드 프로세서/TMS320F28335] - 1ms 주기 LED Toggle 프로그램(2) - GPIO 세팅
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를 어떻게 세팅을 하여 사용하는 지는 다음 블로그에서 설명하도록 하겠습니다.
'임베디드 엔지니어링 > TMS320F28335' 카테고리의 다른 글
DSP제어(TMS320F28335) : 1ms 주기 LED Toggle 프로그램(5) - LED 제어 (0) | 2019.04.10 |
---|---|
DSP제어(TMS320F28335) : 1ms 주기 LED Toggle 프로그램(4) - CPU Timer 세팅 (0) | 2019.04.10 |
DSP제어(TMS320F28335) : 1ms 주기 LED Toggle 프로그램(2) - GPIO 세팅 (0) | 2019.04.09 |
DSP제어(TMS320F28335) : 1ms 주기 LED Toggle 프로그램(1) - System 세팅 (0) | 2019.04.09 |
댓글