TMS320/Study2016. 5. 23. 13:40

http://embed-avr.tistory.com/43

http://blog.naver.com/sigsaly/220688515740

http://blog.naver.com/seim_ryu/110020328222

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

28XDSP의 MMR선언과 배치 방법 정리  (0) 2014.08.11
구조체 명명법, MMR 관련 헤더 파일 종류  (0) 2014.08.11
28계열의 MMR선언 및 조작(2)  (0) 2014.08.11
28계열의 MMR선언 및 조작(1)  (0) 2014.08.11
MMR이란?  (0) 2014.08.08
Posted by 십자성군
TMS320/F283352016. 3. 9. 00:33

DSP2833x_SysCtrl.c


위 파일에서 InitPeripheralClocks 함수가 있다.

이 함수에서는 HISPCP/LOSPCP 프리스케일 세팅뿐만 아니라 dsp28335에서 제공하는 각종 기능성 레지스터들의 기능 여부를 선택할 수 있다. 아래의 빨간 글씨 부분이다.


void InitPeripheralClocks(void)

{

   EALLOW;


// HISPCP/LOSPCP prescale register settings, normally it will be set to default values

   SysCtrlRegs.HISPCP.all = 0x0001; //HSPCLK=SYSCLKOUT/2=75MHz

   //SysCtrlRegs.LOSPCP.all = 0x0003; //LSPCLK=SYSCLKOUT/6=25MHz

   SysCtrlRegs.LOSPCP.all = 0x0002; //LSPCLK=SYSCLKOUT/4=37.5MHz


// XCLKOUT to SYSCLKOUT ratio.  By default XCLKOUT = 1/4 SYSCLKOUT

   // XTIMCLK = SYSCLKOUT/2

   XintfRegs.XINTCNF2.bit.XTIMCLK = 1;

   // XCLKOUT = XTIMCLK/2

   XintfRegs.XINTCNF2.bit.CLKMODE = 1;

   // Enable XCLKOUT

   XintfRegs.XINTCNF2.bit.CLKOFF = 0;


// Peripheral clock enables set for the selected peripherals.

// If you are not using a peripheral leave the clock off

// to save on power.

//

// Note: not all peripherals are available on all 2833x derivates.

// Refer to the datasheet for your particular device.

//

// This function is not written to be an example of efficient code.


   SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1;    // ADC


   // *IMPORTANT*

   // The ADC_cal function, which  copies the ADC calibration values from TI reserved

   // OTP into the ADCREFSEL and ADCOFFTRIM registers, occurs automatically in the

   // Boot ROM. If the boot ROM code is bypassed during the debug process, the

   // following function MUST be called for the ADC to function according

   // to specification. The clocks to the ADC MUST be enabled before calling this

   // function.

   // See the device data manual and/or the ADC Reference

   // Manual for more information.


   ADC_cal();



   SysCtrlRegs.PCLKCR0.bit.I2CAENCLK = 0;   // I2C

   SysCtrlRegs.PCLKCR0.bit.SCIAENCLK = 1;   // SCI-A

   SysCtrlRegs.PCLKCR0.bit.SCIBENCLK = 1;   // SCI-B

   SysCtrlRegs.PCLKCR0.bit.SCICENCLK = 0;   // SCI-C

   SysCtrlRegs.PCLKCR0.bit.SPIAENCLK = 1;   // SPI-A

   SysCtrlRegs.PCLKCR0.bit.MCBSPAENCLK = 0; // McBSP-A

   SysCtrlRegs.PCLKCR0.bit.MCBSPBENCLK = 0; // McBSP-B

   SysCtrlRegs.PCLKCR0.bit.ECANAENCLK=0;    // eCAN-A

   SysCtrlRegs.PCLKCR0.bit.ECANBENCLK=0;    // eCAN-B


   SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;   // Disable TBCLK within the ePWM

   SysCtrlRegs.PCLKCR1.bit.EPWM1ENCLK = 1;  // ePWM1

   SysCtrlRegs.PCLKCR1.bit.EPWM2ENCLK = 0;  // ePWM2

   SysCtrlRegs.PCLKCR1.bit.EPWM3ENCLK = 0;  // ePWM3

   SysCtrlRegs.PCLKCR1.bit.EPWM4ENCLK = 0;  // ePWM4

   SysCtrlRegs.PCLKCR1.bit.EPWM5ENCLK = 0;  // ePWM5

   SysCtrlRegs.PCLKCR1.bit.EPWM6ENCLK = 0;  // ePWM6

   SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;   // Enable TBCLK within the ePWM


   SysCtrlRegs.PCLKCR1.bit.ECAP3ENCLK = 0;  // eCAP3

   SysCtrlRegs.PCLKCR1.bit.ECAP4ENCLK = 0;  // eCAP4

   SysCtrlRegs.PCLKCR1.bit.ECAP5ENCLK = 0;  // eCAP5

   SysCtrlRegs.PCLKCR1.bit.ECAP6ENCLK = 0;  // eCAP6

   SysCtrlRegs.PCLKCR1.bit.ECAP1ENCLK = 0;  // eCAP1

   SysCtrlRegs.PCLKCR1.bit.ECAP2ENCLK = 0;  // eCAP2

   SysCtrlRegs.PCLKCR1.bit.EQEP1ENCLK = 1;  // eQEP1

   SysCtrlRegs.PCLKCR1.bit.EQEP2ENCLK = 1;  // eQEP2


   SysCtrlRegs.PCLKCR3.bit.CPUTIMER0ENCLK = 1; // CPU Timer 0

   SysCtrlRegs.PCLKCR3.bit.CPUTIMER1ENCLK = 1; // CPU Timer 1

   SysCtrlRegs.PCLKCR3.bit.CPUTIMER2ENCLK = 0; // CPU Timer 2


   SysCtrlRegs.PCLKCR3.bit.DMAENCLK = 0;       // DMA Clock

   SysCtrlRegs.PCLKCR3.bit.XINTFENCLK = 1;     // XTIMCLK

   SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1;    // GPIO input clock


   EDIS;

}

Posted by 십자성군
TMS320/F283352015. 7. 31. 18:15

C++ 클래스를 사용할 때 발생한 경고문이다.

.sysmem 섹션을 아래와 같이 생성해주면 된다.




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

Baudrate 설정  (0) 2016.10.09
InitPeripheralClocks  (0) 2016.03.09
cmd 메모리 문제  (0) 2015.07.31
DSP2812의 자료형과 그 길이  (0) 2015.01.11
DSP2812의 Endian  (0) 2015.01.11
Posted by 십자성군
TMS320/F283352015. 7. 31. 18:12

#10099-D 에러는 주로 메모리 공간이 부족해서 발생한다.


예를들어 C++로 클래스를 사용하여 프로젝트를 작성한다던지, acos같은 수학함수를 사용할 때 이다.

이와 관련된 해결방법이 기재된 URL을 링크한다.


1. 

https://e2e.ti.com/support/microcontrollers/c2000/f/171/t/169691


2.

http://processors.wiki.ti.com/index.php/C28x_Compiler_-_Understanding_Linking

or

http://processors.wiki.ti.com/index.php/C28x_Compiler_-_Understanding_Linking


나는 2번의 방법으로 해결하였다.

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

InitPeripheralClocks  (0) 2016.03.09
10247-D creating output section ".sysmem" without SECTIONS specification  (0) 2015.07.31
DSP2812의 자료형과 그 길이  (0) 2015.01.11
DSP2812의 Endian  (0) 2015.01.11
PWM  (1) 2014.08.20
Posted by 십자성군
TMS320/F283352015. 1. 11. 02:10

typedef int                 int16;

typedef long                int32;

typedef long long           int64;

typedef unsigned int        Uint16;

typedef unsigned long       Uint32;

typedef unsigned long long  Uint64;

typedef float               float32;

typedef long double         float64;


또한 char는 2바이트로 이루어져 있다.

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

10247-D creating output section ".sysmem" without SECTIONS specification  (0) 2015.07.31
cmd 메모리 문제  (0) 2015.07.31
DSP2812의 Endian  (0) 2015.01.11
PWM  (1) 2014.08.20
[예제분석] PWM  (0) 2014.08.20
Posted by 십자성군
TMS320/F283352015. 1. 11. 01:12

little Endian임

자료처리를 생각한다면 당연하겠지만...

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

cmd 메모리 문제  (0) 2015.07.31
DSP2812의 자료형과 그 길이  (0) 2015.01.11
PWM  (1) 2014.08.20
[예제분석] PWM  (0) 2014.08.20
인터럽트 관련 소스  (0) 2014.08.20
Posted by 십자성군
TMS320/F283352014. 8. 20. 16:38

PWM

예제 및 레퍼런스를 참고하여 일부만 설명하겠다.


참고예제[초기화]

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 */

}





1. TBPRD : Time-Base Period Register


Time-Base Submodule Registers중 하나


값은 0~FFFF


Time-Base counter의 주기를 정하고 PWM 주파수를 설정한다.

이 레지스터에 대한 쉐도잉은 TBCTL(Time-Base Control Register)의 비트 설정에 따라 가불을 정할 수 있다. 기본적으로 가능하게 설정되어 있다.


TBCTL = 0일때

-쉐도우(은폐)가 가능하고 모든 읽고 쓰기가 자동적으로 쉐도우 레지스터로 전송된다. 이 경우, 활성화된 레지스터(TBPRD)는 time-base counter가 0이 될 때 마다 쉐도우 레지스터에 의해 로드된다.

TBCTL = 1일때

-쉐도우(은폐)가 불가능하게 되고 모든 읽고 쓰기가 직접 활성화된 레지스터로 전송된다. 이는 즉, 레지스터가 하드웨어를 조정하게 되는것이다.


active 레지스터와 shadow 레지스터는 같은 메모리 맵 주소를 공유한다.


2. TBCTR : Time-Base Counter Register



위 레지스터를 읽어 time-base counter의 값을 읽을 수 있다.

또한 위 레지스터에 쓺으로써 time-base counter의 값을 정할 수 있다. 쓰는 즉시 바로 업데이트 된다.

쓰기는 TBCLK(time-base clock)에 동기화되지 않으며 또한 위 레지스터는 쉐도우(은폐) 되지 않는다.


3. CMPA : Counter-Compare A Register


활성화된 CMPA 레지스터는 TBCTR과 계속 비교된다. 값이 같을 경우, counter-compare 모듈은 '두 값이 같다'는 이벤트를 발생시킨다. 이 이벤트는 action-qualifer(동작권한자) 영역으로 보내지는데 위 이벤트를 통과시키거나 몇가지 동작을 발생시킨다.

이 동작들은 AQCTLA와 AQCTLB레지스터에 영향을 받는 EPWMxA나 EPWMxB 출력에 적용된다. 동작들은 다음과 같다.


1. 아무것도 하지 않는다 : 이벤트를 무시한다

2. Clear : EPWMxA EPWMxB 신호를 low하게 한다

3. Set : EPWMxA EPWMxB 신호를 high하게 한다.

4. EPWMxA 나 EPWMxB신호를 반전시킨다.


좀 번역체가 되었는데 즉 이런 말이다.

TBCTR과 계속 비교하다가 값이 같을 경우에 이벤트를 발생시키고 이 이벤트를 조건으로 갖는 몇가지 이벤트를 다시 발생시킨다.

이 이벤트들은 EPWMxA나 EPWMxB의 출력과 관계된다.


CMPCTL[SHDWAMODE] = 0

:shadow가 가능하고 모든 읽고 쓰기가 자동적으로 shadow register로 전송된다. 이 경우, CMPCTL[LOADAMODE] 비트필드는 이벤트가 shadow register로부터 어떤 active register를 로드할지 정한다.

:쓰기 전에, 쉐도우 레지스터가 현재 꽉 차있는지 확인하기 위해 CPMCTL[SHDWAFULL] 비트를 읽을 수 있다.


CMPCTL[SHDWAMODE] = 1

:shadow register가 사용불가하고 모든 읽고 쓰기가 직접 active register로 전송된다. 이는 레지스터가 직접 하드웨어를 제어함을 의미한다.

:어떤 모드라도 active 및 shadow 레지스터는 같은 메모리맵 주소를 공유한다.


4. TBCTL

[CTRMODE, PHSEN, PRDLD, HSPCLKDIV, CLKDIV]






15:14

 FREE,SOFT

 Emulatio Mode Bits

emulation events과정중 ePWM time-base counter의 동작을 선정한다.


00:time-base counter의 증감 후 정지한다.

01:카운터가 전체 사이클을 종료 후 정지한다

: Up-count mode : time-base counter = period(TBCTR = TBPRD)일때 정지한다.

즉, 카운터의 값이 period값에 도달했을 때 정지한다.

: Down-count mode : time-base counter = 0x0000(TBCTR = 0x0000)일때 정지한다.

즉, 카운터의 값이 0에 도달했을 때 정지한다.

: Up-down-count mode : time-base counter = 0x0000(TBCTR = 0x0000)일때 정지한다.

즉, 카운터의 값이 0에 도달했을 때 정지한다.

13 

PHSDIR 

 Phase Direction Bit

time-base counter가 up-down-count mode일 때만 사용된다.


PHSDIR bit는 time-base counter(TBCTR)가 동기화 이벤트가 발생했을 때의 카운트 하는 방향성(count up/count down)을 가리킨다. 또한 새로운 phase value를 TBPHS레지스터로부터 불러온다. 동기화 이벤트가 발생하기 전에는 카운터 방향성에 의존하지 않는다.


up-count 또는 down-count일 때는 무시된다.


0 : 동기화 이벤트 발생 후 count-down 한다.

1 : 동기화 이벤트 발생 후 count-up 한다.

12:10 

CLKDIV 

 Time-base Clock Prescale Bits


이 3개의 비트는 time-base 클럭의 프리스케일 값의 일부를 정한다.

TBCLK = SYSCLKOUT / (HSPCLKDIV * CLKDIV)


CLK는 2의 n승이 된다. 예를들어 CLKDIV = 111일 때, 2^7=128이다

9:7 

HSPCLKDIV 

 High Speed Time-base Clock Prescale Bits


이 3개의 비트는 time-base 클럭의 프리스케일 값의 일부를 정한다.

TBCLK = SYSCLKOUT / (HSPCLKDIV*CLKDIV)


이 분주기는 TMS320x281x 시스템의 Event Manager peripheral 의 HSPCLK를 모방하고 있다.


000 : /1(default)

...

...

111 : /14 : /(2*7)

 6

 SWFSYNC

 Software Forced Synchronization Pulse


0 : 

 5:4

SYNCOSEL 

Synchronization Output Select


EPWMxSYNCO 신호의 출처를 정한다

00 : EPWMxSYNC

01 : CTR = zero

10 : CTR = CMPB

11 : EPWMxSYNCO 신호를 사용불가능하게 한다.

PRDLD 

Active Period Register Load From Shadow Register Select


0 :

TBCTR(time-base counter)값이 0에 도달했을 때, 주기 레지스터(period register : TBPRD)의 값을 쉐도우 레지스터를 통해 로드하게 한다.


1 :

쉐도우 레지스터를 쓰지않고 즉시 TBPRD로부터 값을 읽어들인다.

TBPRD가 동작중이라도 직접 접근하여 읽고 쓰기를 한다.

PHSEN 

 Counter Register Load From Phase Register Enable


0 :

TBCTR(time-base counter)의 값을 읽을 때, TBPHS(time-base phase register)를 사용하지 않는다.


1 : 

EPWMxSYNCI 입력 신호가 발생하거나 SWFSYNC 비트에 의해 software synchronization 이 들어왔을 때 phase register를 통해서 time-base counter를 로드한다.

 1:0

CTRMODE 

 Counter Mode
time-base ocunter 모드는 한번 설정된 후 일반적인 동작중에서는 바뀌지 않는다.

아래의 설정을 통해 만약 카운터의 모드를 바꿀 경우 다음 edge부터 효과를 발휘하고 현재 카운터 값은 모드 변경전에 증가 또는 감소 된다.

모드설정
00 : Up-count mode
01 : Down-count mode
10 : Up-down-count mode
11 : Stop-freeze counter operation(default on reset)



TBPHS : Time-Base Phase Register


선택된 ePWM의 time-base counter phase[단계]를 설정한다. 이 phase는 동기화 입력신호를 공급하는 time-base에 대한 것이다.


TBCLT의 PHSEN = 0일 때,

:동기화 이벤트는 무시되고 time-base counter은 phase와 무관하게 로드된다.

TBCLT의 PHSEN = 1일 때,

:동기화 이벤트가 발생했을 때, TBCTR은 phase를 로드한다. 동기화 이벤트는 동기화 입력신호(EPWMxSYNCI)나 software forced synchronization에 의해 초기화된다.


CMPCTL : Counter-Compare Control Register



SHDWBFULL 

 Counter-compare B(CMPB) Shadow Register Full Status Flag


CMPB 쉐도우 레지스터가 꽉 찼는지에 대한 상태레지스터이다.

load-strobe 발생 시 한번 자동 클리어 된다.


0 : CMPB shadow FIFO not full yet

1 : CMPB 쉐도우 FIFO가 가득 찼다. CPU wirte는 현재 쉐도우 값에 덮어쓰기를 하게된다.

SHDWAFULL 

Counter-compare A(CMPa)Shadow Register Full Status Flag


CMPA:CMPAHR 레지스터에 32비트가 쓰이거나 CMPA레지스터에 16비트가 쓰일 때 flag가 1로 셋팅된다. 단, CMPAHR레지스터에 대한 16비트 쓰기에는 영향을 받지 않는다.


0 : CMPA 쉐도우 FIFO가 아직 full 되지 않았다.

1 : CMPA 쉐도우 FIFO가 가득 찼다. CPU Write는 현재 쉐도우 값에 덮어쓰기를 하게된다.  

SHDWBMODE 

 Counter-compare B(CMPB) Register Operating Mode


0 : 쉐도우 모드. double buffer로 동작한다. 모든 쓰기는 CPU를 통하여 shadow register에 접근한다.

1 : immediate 모드(즉시 모드). 

SHDWAMODE 

 Counter-compare A(CMPA) Register Operating Mode


위와 같다.

3-2 

LOADBMODE 

Active Counter-Compare B(CMPB) Load From Shadow Select Mode


immediate mode(CMPCTL[SHDWBMODE]=1])일 때는 동작하지 않는다.

00 : Load on CTR = Zero : TBCTR=0 일 때 

01 : Load on CTR = PRD : TBCTR=TBPRD 일 때

10 : Load on either CTR = Zero or CTR = PRD : CTR이 0이거나 PRD와 같을 때

11 : Freeze : load하지 않는다.

1-0 

LOADAMODE 

 Active Counter-Compare A(CMPA) Load From Shadow Select Mode


위와 같다


AQCTL


ETSEL


ETPS


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

DSP2812의 자료형과 그 길이  (0) 2015.01.11
DSP2812의 Endian  (0) 2015.01.11
[예제분석] PWM  (0) 2014.08.20
인터럽트 관련 소스  (0) 2014.08.20
2812와 달라진 28335의 주변회로  (0) 2014.08.20
Posted by 십자성군
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 십자성군
TMS320/F283352014. 8. 20. 14:32

출처 : 싱크웍스 블로그


1. DINT : 전역 인터럽트 스위치 off

-시스템 초기화 과정에서 원인 모를 이유로 인터럽트가 걸릴 경우 이후의 칩 동작에 치명적인 영향을 줄 수 있다.

이를 미연에 방지하기 위해 시스템 초기화 맨 처음 과정에 사용해준다.


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

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


3. IER, IFR

IFR : Interrupt Flag Register


IER = 0x0000;

IFR = 0x0000;


위의 경우에는 모든 인터럽트를 0으로 clear하여 사용불가로 만든다.

IER = 0x0001;

1번 인터럽트를 사용가능으로 한다.


4 : InitPieVectTable()

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


5 :PieCtrlRegs.PIEIER9.bit.INTx1 = 1 ;


PIEIER과 IER레지스터를 set시키는 작업. 인터럽트 표를 확인하여 설정해주도록 하자.



보충예정


관련 URL : http://blog.naver.com/zero8997/130122556251

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

PWM  (1) 2014.08.20
[예제분석] PWM  (0) 2014.08.20
2812와 달라진 28335의 주변회로  (0) 2014.08.20
SCI  (0) 2014.08.19
Cpu Timer(2)  (0) 2014.08.19
Posted by 십자성군
TMS320/F283352014. 8. 20. 13:27

출처 : http://blog.daum.net/5975240/54


제일 큰 구별점은 소수점 연산이 가능해 졌다는 것이다.   그외 달라진 것은 더 진보한 주변회로 설계이다.

 

기존 2812에서는 PWM의 출력, 외부신호의 Capture, 엔코더펄스의 해석, 시간축의 이벤트 관리 등등을 모두 Event Manager이 관리했다.

 

Event Manager에는 4개의 16비트 타이머가 내정되어 있다. 위의 모든 기능들이 이 공용 타이머에 의해 관리되는 구조였다.

 

28335에서는 대신 그 역할을 ePWM, eCAP, eQEP라고 이름 지어진 3개의 독립모듈들이 수행한다.

 

1) PWM 및 시간축 이벤트의 관리자 - ePWM 모듈

 

ePWM모듈은 서로 독립적으로 존재하며 자신만의 16비트 타이머와 개별 회로들을 갖추고 있고, 이벤트 관련 서브모듈을 통해 칩에서 일어나는

 

 각종 시간축의 이벤트들을 제어한다. 하나의 ePWM 모듈은 내부의 타이머와 비교회로를 통해 한 쌍의 PWM 채널을 관리한다. 즉 EPWMxA와

 

EPWMxB이다.

 

2) 외부 신호의 Edge Detector- eCAP

 

eCAP 모듈은 칩의 외부에서 들어오는 신호의 Edge를 잡아내고 이 Edge가의 시간 간격을 카운트하여 기록하는 역할을 한다.  2812에서는

 

공용타이머를 사용했기에 느린 외부의 신호간격을 카운트할 때 자주 카운터 값이 넘치게 되어 별도의 코드로 처리해줘야 하는 불편함이

 

있었지만, 28335에서는 내부에 자체 32비트 타이머를 가지게 되어, 외부 신호에 더 유연하게 대처할 수 있는 능력을 갖추게 되었다.

 

또한 외부신호의 Capture외에 APWM모드로 운용하면 단상 PWM을 외부로 출력할 수도 있다.

 

3) 엔코더 출력 펄스의 해석-eQEP

 

28계열이 주로 사용되는 분야 중 하나가 바로 모터제어이다. 이러한 칩이 목적에 걸맞게 28335에서는 모터의 엔코더 출력 신호를 해석하는

 

eQEP회로를 탑재하고 있다. 이 모듈도 내부에 자체 32비트 타이머를 내장하고 있으면, 신호를 통해 모터의 회전속도, 회전방향 등을 해석

 

해내는 역할을 한다. 또 별도로 QEP회로만을 위한 와치독 타이머를 가지고 있어, 모터의 stall 상태를 감지할 수 있다.

 

4)  ADC 방식

 

첫째로 결과값의 옵셋을 조절할 수 있는 레지스터를 추가하였다.  ADC는 아날로그 값을 디지털로 변화할 때 결과값에 오류를 포함하게 된다.

 

이 옵셋오류를 보정할 수 있는 레지스터를  28335에 추가하였다.

 

두번째 변화는 결과 저장 레지스터에 있다. 2812에서는 Peripherals Frame 0 영역에 결과저장 레지스터가 위치하고 변환의 결과는 항상

 

최상위 비트부터 채워지는 방식이었다.  28335에서는 듀얼 방식을 채용하여  Peripherals Frame 0 와 Peripherals Frame 2에 결과저장

 

레지스터가 위치해 있다.  Peripherals Frame 0 영역에서는 기존의 방식대로 하면서 0Peripherals Frame 2에서는 값들은 좌측으로

 

정렬되어 최상위 비트부터 채워지는 방식의 결과값을 좌측으로 4비트 이동시킨 것과 동일한 값을 가지게끔 하여 2wait의 지연이

 

발생한다.  고속으로 샘플링해야 할 경우에는 기존방식으로, 저속의 샘플링도 괜찮은 경우에는 2영역의 결과값을 사용하는

 

선택의 여지가 생기게 된다.

 

세번째 변화는 인터럽터 벡터의 추가이다. 2812에서는 ADC회로에 인터럽트 벡터 하나가 배정되어 변환과정완료를 알리는 목적으로

 

사용되었다. 28335에서는 총 3개의 인터럽트 벡터가 할당되어 시퀀서를 독립적으로 운용할 경우 시퀀서별로 개별 운용하여 서로 다른

 

코드를 수행할 수 있게 되었다.

 

5) 늘어난 통신모듈의 숫자   

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

[예제분석] PWM  (0) 2014.08.20
인터럽트 관련 소스  (0) 2014.08.20
SCI  (0) 2014.08.19
Cpu Timer(2)  (0) 2014.08.19
Cpu Timer(1)  (1) 2014.08.19
Posted by 십자성군