'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 |
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 |
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;
}
DSP 프로젝트 생성(28377, 28335 공통) (0) | 2016.11.21 |
---|---|
Baudrate 설정 (0) | 2016.10.09 |
10247-D creating output section ".sysmem" without SECTIONS specification (0) | 2015.07.31 |
cmd 메모리 문제 (0) | 2015.07.31 |
DSP2812의 자료형과 그 길이 (0) | 2015.01.11 |
C++ 클래스를 사용할 때 발생한 경고문이다.
.sysmem 섹션을 아래와 같이 생성해주면 된다.
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 |
#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번의 방법으로 해결하였다.
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 |
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바이트로 이루어져 있다.
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 |
little Endian임
자료처리를 생각한다면 당연하겠지만...
cmd 메모리 문제 (0) | 2015.07.31 |
---|---|
DSP2812의 자료형과 그 길이 (0) | 2015.01.11 |
PWM (1) | 2014.08.20 |
[예제분석] PWM (0) | 2014.08.20 |
인터럽트 관련 소스 (0) | 2014.08.20 |
예제 및 레퍼런스를 참고하여 일부만 설명하겠다.
참고예제[초기화]
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 신호를 사용불가능하게 한다. |
3 | PRDLD | Active Period Register Load From Shadow Register Select 0 : TBCTR(time-base counter)값이 0에 도달했을 때, 주기 레지스터(period register : TBPRD)의 값을 쉐도우 레지스터를 통해 로드하게 한다. 1 : 쉐도우 레지스터를 쓰지않고 즉시 TBPRD로부터 값을 읽어들인다. TBPRD가 동작중이라도 직접 접근하여 읽고 쓰기를 한다. |
2 | 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 아래의 설정을 통해 만약 카운터의 모드를 바꿀 경우 다음 edge부터 효과를 발휘하고 현재 카운터 값은 모드 변경전에 증가 또는 감소 된다. |
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
9 |
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는 현재 쉐도우 값에 덮어쓰기를 하게된다. |
8 |
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는 현재 쉐도우 값에 덮어쓰기를 하게된다. |
6 |
SHDWBMODE |
Counter-compare B(CMPB) Register Operating Mode 0 : 쉐도우 모드. double buffer로 동작한다. 모든 쓰기는 CPU를 통하여 shadow register에 접근한다. 1 : immediate 모드(즉시 모드). |
4 |
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
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 |
========================================================================================================
초기화부터 간단히 살펴보자. 우선 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 */
}
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 |
출처 : 싱크웍스 블로그
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시키는 작업. 인터럽트 표를 확인하여 설정해주도록 하자.
보충예정
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 |
출처 : 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) 늘어난 통신모듈의 숫자
[예제분석] 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 |