TMS320/F283352014. 8. 20. 14:57

========================================================================================================

초기화부터 간단히 살펴보자. 우선 main문 부터 다룬다


/*-----------------------------------------------------------------------------

Step 1

Disable Global Interrupt & Interrupt Flag Clear

-----------------------------------------------------------------------------*/

DINT;

IER = 0x0000;

IFR = 0x0000;


전역 인터럽트를 off시켜주고 인터럽트 플래그를 클리어 하였다.


/*-----------------------------------------------------------------------------

Step 2

2.1 InitSysCtrl()

2.1.1 Disables the watchdog

    2.1.2 Set the PLLCR for proper SYSCLKOUT frequency

    2.1.3 Set the pre-scaler for the high and low frequency peripheral clocks

    2.1.4 Enable the clocks to the peripherals

2.2 Initialize GPIO MUX

-----------------------------------------------------------------------------*/

InitSysCtrl();


/* for EPWM1A, EPWM1B */

InitEPwm1Gpio();


InitSysCtrl() 함수를 통해 시스템 초기화를 시켜준다.

1.왓치독을 off시켜주었다.

2.SYSCLKOUT 주파수 설정을 위해 PLLCR을 설정하였다

3.High, Low주변회로를 위한 클럭설정을 한다

4.주변회로에 클럭분배를 하게한다.


InitEPwm1Gpio()함수를 통해 GPIOMUX를 초기화 시켜준다.


/*-----------------------------------------------------------------------------

Step 3

3.1 Initialize Peripheral Interrupt Expansion circuit

-----------------------------------------------------------------------------*/

InitPieCtrl();


InitPieCtrl() : PIE회로 초기화 함수

PIE회로를 disable시키고 각 PIEIER과 PIEIFR 레지스터를 clear시켜 놓는다.


/*-----------------------------------------------------------------------------

Step 4

4.1 Pie Vector Table Re-allocation

-----------------------------------------------------------------------------*/

InitPieVectTable();


PIE활성화 작업을 한다. 모든 인터럽트 벡터들을 Mapping시켜놨기 때문에 이 함수를 통해 모든 인터럽트 벡터들이 TI가 정한 디폴트 인터럽트 서비스 루틴에 연결되게 된다. 인터럽트 벡터의 서비스 루틴은 DefaultIsr.c에 기술되어 있다.


/*-----------------------------------------------------------------------------

Step 5

5.1 Interrupt Service routine re-mapping and Interrupt vector enable

-----------------------------------------------------------------------------*/

/* Interrupt Service Routine Re-mapping */

EALLOW;

PieVectTable.EPWM1_INT = &EPwm1Isr;

EDIS;


/* Enable PIE group 3 interrupt 1 for EPWM1_INT */

PieCtrlRegs.PIEIER3.bit.INTx1 = 1;


/* Enable CPU INT3 for EPWM1_INT */

IER |= M_INT3;



vectortable.zip

첨부한 벡터테이블을 참고하라

EPWM1_INT 의 인터럽트 함수를 EPwm1Isr로 명명하였다. 이는 사용자 정의 함수이다.


EALLOW : MRR보호영역 해제

EDIS : MRR보호


PieCtrlRegs.PIEIER3.bit.INTx1 = 1 : PIEIER과 IER레지스터를 set시키는 작업


/*-----------------------------------------------------------------------------

Step 6

    6.1 Initialize Periphrals for User Application

-----------------------------------------------------------------------------*/

/* Initialize EPWM1 Module */

InitEPwm1Module();


위는 사용자 정의함수이다. EPWM1 모듈을 초기화 시켜주기 위하여 작성되었다.

/*-----------------------------------------------------------------------------

Step 7

7.1 Initialize S/W modules and Variables

-----------------------------------------------------------------------------*/

BackTicker = 0;

IsrTicker = 0;


PwmCarrier = TBCLK / (EPwm1Regs.TBPRD+1);

PwmDuty = (float32)EPwm1Regs.CMPA.half.CMPA / (EPwm1Regs.TBPRD+1);


소프트웨어적인 초기화 작업이다. 나중에 설명하도록 한다.

/*-----------------------------------------------------------------------------

Step 8

8.1 Enable Global realtime interrupt DBGM

8.2 Enable Global Interrupt

-----------------------------------------------------------------------------*/

ERTM; /* Enable Global realtime interrupt DBGM */

EINT;   /* Enable Global interrupt INTM */


ERTM : 전역 인터럽트를 realtime으로 해준다.

EINt : 전역인터럽트를 사용가능하게 한다.

/*-----------------------------------------------------------------------------

Step 9

9.1 Idle Loop

-----------------------------------------------------------------------------*/

/* IDLE loop. Just sit and loop forever: */

for(;;)

{

BackTicker++;


CurrentCarrier = TBCLK / (EPwm1Regs.TBPRD+1);

CurrentDuty = (float32)EPwm1Regs.CMPA.half.CMPA / (EPwm1Regs.TBPRD+1);

}


작업내용이다. 나중에 설명하도록 한다.

}


========================================================================================================

ePWM1 모듈 초기화 함수를 아래와 같이 작성하였다.


void InitEPwm1Module(void)

{

/* Setup TBCLK */

EPwm1Regs.TBPRD = (SYSCLK/PWMCARRIER)-1; /* Set Timer Period */

EPwm1Regs.TBCTR = 0; /* Clear Counter */


/* Set Compare values */

EPwm1Regs.CMPA.half.CMPA = ((EPwm1Regs.TBPRD+1)>>1); /* Set Compare A value to 50% */


/* Setup counter mode */

EPwm1Regs.TBCTL.bit.CTRMODE = 0; /* Count Up (Asymmetric) */

EPwm1Regs.TBPHS.half.TBPHS = 0; /* Phase is 0 */

EPwm1Regs.TBCTL.bit.PHSEN = 0; /* Disable phase loading */

EPwm1Regs.TBCTL.bit.PRDLD = 0; /* Period Register is loaded from its shadow when CNTR=Zero */

EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0; /* Clock ratio to SYSCLKOUT */

EPwm1Regs.TBCTL.bit.CLKDIV = 0; /* TBCLK = SYSCLK / (HSPCLKDIV * CLKDIV) */


/* Setup shadowing */

EPwm1Regs.CMPCTL.bit.SHDWAMODE = 0; /* Enable Shadowing */

EPwm1Regs.CMPCTL.bit.LOADAMODE = 0; /* Load on CNTR=Zero */


/* Set actions */

EPwm1Regs.AQCTLA.bit.ZRO = 2; /* Set EPWM1A on CNTR=Zero */

EPwm1Regs.AQCTLA.bit.CAU = 1; /* Clear EPWM1A on event A, up count */


/* Set Interrupts */

EPwm1Regs.ETSEL.bit.INTSEL = 1; /* Select INT on CNTR=Zero */

EPwm1Regs.ETSEL.bit.INTEN = 1; /* Enable INT */

EPwm1Regs.ETPS.bit.INTPRD = 1; /* Generate INT on 1st event */

}

'TMS320 > F28335' 카테고리의 다른 글

DSP2812의 Endian  (0) 2015.01.11
PWM  (1) 2014.08.20
인터럽트 관련 소스  (0) 2014.08.20
2812와 달라진 28335의 주변회로  (0) 2014.08.20
SCI  (0) 2014.08.19
Posted by 십자성군