TMS320/Study2014. 8. 6. 13:36

공부하는 내용

Watchdog의 무력화와 리셋

PLL 설정과 클럭 시스템 구조 및 분해능 설정



Start!

DisableDog의 함수를 알아보자.

 

1.


void DisableDog(void)
{
    EALLOW;
    SysCtrlRegs.WDCR= 0x0068;
    EDIS;
}

 

EALLOW : MRR보호영역 해제

EDIS : MRR보호

SysCtrlRegs.WDCR = 0x0068;

 

시스템 레지스트리의 WDCR에 0x0068을 주입하였다. WDCR은 Protected영역에 위치하여 보호되어 있기 때문에 값을 쓰기 위해서는 EALLOW 명령어로 보호를 해제 후 EDIS로 다시 보호상태로 해준다.


2.

 

void KickDog(void)
{
    EALLOW;
    SysCtrlRegs.WDKEY = 0x0055;
    SysCtrlRegs.WDKEY = 0x00AA;
    EDIS;
}

 

Watchdog 리셋을 하기 위한 함수로 WDKEY에 0x0055와 0x00AA라는 값을 넣어주면 된다. CPU는 이 함수를 주기적으로 사용하여 Watchdog을 리셋 해주어야 하며 이를 잊으면 Watchdog타이머가 넘치게 되어 CPU가 리셋 당할 수 있다.

 

3.


InitPll(0xA);

 

void InitPll(Uint16 val)
{
   volatile Uint16 iVol;

   if (SysCtrlRegs.PLLCR.bit.DIV != val)
   {

      EALLOW;
      SysCtrlRegs.PLLCR.bit.DIV = val;
      EDIS;
      for(iVol= 0; iVol< ( (131072/2)/12 ); iVol++)
      {

      }
   }
}

 

 

 

PLL : Phase Lock Loop

역할 : 시스템 클럭 조정

 

 

DIV3 

DIV2 

DIV1 

DIV0 

Clock Frequency (CLKIN) 

0

OSCCLK x 1/2 

OSCCLK x 1/2  

OSCCLK x 2/2  

1

OSCCLK x 3/2  

OSCCLK x 4/2  

OSCCLK x 5/2  

OSCCLK x 6/2  

OSCCLK x 7/2  

 1

OSCCLK x 8/2  

OSCCLK x 9/2  

OSCCLK x 10/2  

 

우리는 PLL을 설정하여 PLL출력 클럭을 입력 클럭의 최저 1배에서 최대 10배까지 변화시킬 수 있다.

이 PLL 출력 클럭은 다시 1/2배 되어 CPU에 공급된다.

 

PLL의 초기상태는 DIV3~0비트가 0(0xA)으로 설정되어 있기 때문에 개발자가 따로 설정하지 않은 경우 칩 외부에 설치한 오실레이터등의 주파수의 1/2배의 클럭 주파수로 구동된다.

만약 30MHz 오실레이터를 사용하고 있다면 우리는 DSP를 최대 150MHz로 구동할 수 있을 것이다.

 

위의 InitPll함수에서 붉게 표시한 부분은 단순 루프로써 PLL안정화에 필요한 시간을 확보하는 역할을 한다. PLL을 조정할 때 시스템 클럭이 바뀌고 안정화 할 때까지 시간이 필요하기 때문이다.

 

함수에서 보면 알 수 있듯이 EALLOW 및 EDIS를 사용하여 MRR의 보호를 해제 및 다시 보호하고 Watchdog에 의한 리셋을 피하기 위하여 DisableDog()를 사용하였다.

 

4.


InitPeripheralClock() 함수는 주변 회로에 공급되는 클럭의 주파수 조절과 함께 공급 여부도 설정하는 코드를 포함한다.


위의 사진에서는 나와있지 않지만, 핸드북을 살펴보면 HSPCLKLSPCLK를 볼 수 있다. 위 사진의 SYSCLKOUT에서 갈라져 나오는것 같다. HSPCLK는 'High Speed Clock의 약자로 고속 클럭을 필요로 하는 주변회로로 클럭을 공급하고 LSPCLK는 Low Speed Clock으로 저속 클럭을 요구하는 주변회로에 클럭을 공급한다.


HSPCLK : ADC, EV(Event Manager)

LSPCLK : eCAN, McBSSP, SPI, SCI


하지만, 저속회로에 고속클럭이 필요하거나 고속회로에 저속클럭이 필요한 경우도 있을 수 있다. 이를 위해서 HSPCLK와 LSPCLK의 주파수 조정 레지스터가 존재하며 각각 HISPCP와 LOSPCP로 구분된다.


아래 표를 보자



H/LSPCLK2 

H/LSPCLK1

H/LSPCLK0 

Peripheral Clock Frequency 

SYSCLKOUT/1 

SYSCLKOUT/2

SYSCLKOUT/4 

SYSCLKOUT/6 

SYSCLKOUT/8 

SYSCLKOUT/10 

SYSCLKOUT/12

SYSCLKOUT/14


HISPCP의 default는 001이며 LOSPCP의 default는 010이다. 즉, HSPCLK를 제일 정밀하게 사용하고 싶다면, 150MHz로 사용해야 할것이며 이를 위해서 PLL을 1010으로, HSPCLK를 000으로 설정해주어야 할것이다. 만약, PLL만 조정을 해준다면 결과적으로 75MHz가 될것이다.


 PCLKCR이라는 레지스터가 주변 회로 각각에 클럭 공급 여부를 결정짓는다.


void InitPeripheralClocks(void)

{

   EALLOW;

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

   SysCtrlRegs.HISPCP.all = 0x0001;

   SysCtrlRegs.LOSPCP.all = 0x0002;


// Peripheral clock enables set for the selected peripherals.

   SysCtrlRegs.PCLKCR.bit.EVAENCLK=1;

   SysCtrlRegs.PCLKCR.bit.EVBENCLK=1;

   SysCtrlRegs.PCLKCR.bit.SCIAENCLK=1;

   SysCtrlRegs.PCLKCR.bit.SCIBENCLK=1;

   SysCtrlRegs.PCLKCR.bit.MCBSPENCLK=1;

   SysCtrlRegs.PCLKCR.bit.SPIENCLK=1;

   SysCtrlRegs.PCLKCR.bit.ECANENCLK=1;

   SysCtrlRegs.PCLKCR.bit.ADCENCLK=1;

   EDIS;

}


만약 모든 주변회로에 클럭을 넣는다면 다음과 같은 명령을 내리면 된다.

SysCtrlRegs.PCLKCR.all = 0x00FF;



내용정리


EALLOW : MRR보호영역 해제

EDIS : MRR보호

SysCtrlRegs.WDCR = 0x0068;    Watchdog disable

SysCtrlRegs.WDKEY = 0x0055;    Watchdog 리셋 관련


SysCtrlRegs.PLLCR.bit.DIV        PLL 클럭 설정

HSPCLK

LSPCLK

SysCtrlRegs.HISPCP.all

SysCtrlRegs.LOSPCP.all

SysCtrlRegs.PCLKCR.bit.EVAENCLK


P.S

WDCR레지스트리에 대한 학습 필요

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

DSP281x_GlobalVariableDefs.c  (0) 2014.08.07
DSP281x_Device.h  (0) 2014.08.07
전처리기(Precompiler) pragma  (0) 2014.08.06
DSP281x_SysCtrl.c  (0) 2014.08.06
DSP281x_CodeStartBranch.asm  (0) 2014.08.05
Posted by 십자성군