========================================================================================================
초기화부터 간단히 살펴보자. 우선 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;
첨부한 벡터테이블을 참고하라
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 |