'KL25Z_STUDY'에 해당되는 글 2건

  1. 2013.10.25 [FRDM-KL25Z] Kinetis - SPI 테스트
  2. 2013.10.20 [FRDM-KL25Z] Kinetis - Timer 테스트
[FreeScale]/KINETIS2013. 10. 25. 22:30

[FRDM-KL25Z] Kinetis - SPI 테스트

[FRDM-KL25Z] Kinetis - SPI 테스트


KL25Z SPI 테스트를 위한 자료 정리



SPI Bus clock

Bus clock Up to 50 MHz Up to 4 MHz MCGOUTCLK clock divider


KL25Z SPI 초기화 함수

void SPI0_Init(void)

{

SIM_SCGC5 |= SIM_SCGC5_PORTD_MASK;      //Turn on clock to D module  

SIM_SCGC4 |= SIM_SCGC4_SPI0_MASK;       //Enable SPI0 clock  


_SPI0_IO_INIT();

/*

PORTD_PCR0 = PORT_PCR_MUX(0x2);    //Set PTD0 to mux 2 [SPI0_PCS0]  

PORTD_PCR1 = PORT_PCR_MUX(0x2);    //Set PTD1 to mux 2 [SPI0_SCK]  

PORTD_PCR2 = PORT_PCR_MUX(0x2);    //Set PTD2 to mux 2 [SPI0_MOSI]  

PORTD_PCR3 = PORT_PCR_MUX(0x2);    //Set PTD3 to mux 2 [SPIO_MISO]  

*/

//SPI_C1_CPOL_MASK

//SPI_C1_CPHA_MASK

SPI0_C1 = SPI_C1_MSTR_MASK;// | SPI_C1_SSOE_MASK;   //Set SPI0 to Master & SS pin to auto SS  


//SPI0_C2 = SPI_C2_MODFEN_MASK;   //Master SS pin acts as slave select output   


    //Set baud rate prescale

SPI0_BR = (SPI_BR_SPPR(0x01) | SPI_BR_SPR(0x02));


//SPI Mode

Cbi(SPI0_C1, SPI_C1_CPOL_MASK);

Cbi(SPI0_C1, SPI_C1_CPHA_MASK);

    //Enable SPI0  

Sbi(SPI0_C1, SPI_C1_SPE_MASK);

}




KL25Z SPI 데이터 송수신 함수

unsigned char SPI0_WriteReadByte(unsigned char Data)

{

//SPTEF - 1 이면 데이터 전송

while(!(SPI_S_SPTEF_MASK & SPI0_S))    

{        

asm("nop");        //While buffer is not empty do nothing    

}    


SPI0_D = Data;     //Write char to SPI     


//SPRF - 1 이면 데이터 수신

while(!(SPI_S_SPRF_MASK & SPI0_S))    

{        

asm("nop");        //While buffer is not empty do nothing    

}  


return SPI0_D;

}






Posted by nexp

댓글을 달아 주세요

[FreeScale]/KINETIS2013. 10. 20. 23:00

[FRDM-KL25Z] Kinetis - Timer 테스트

[FRDM-KL25Z] Kinetis - Timer 테스트




KL25Z 타이머 테스트 정리

Timer

-Six channel Timer/PWM (TPM)

-Two 2-channel Timer/PWM (TPM)

-Periodic interrupt timers

-16-bit low-power timer (LPTMR)

-Real-time clock




KL25Z 타이머 레지스터

PIT_LDVALn

Timer Start Value

Sets the timer start value. The timer will count down until it reaches 0, then it will generate an interrupt and

load this register value again. Writing a new value to this register will not restart the timer; instead the

value will be loaded after the timer expires. To abort the current cycle and start a timer period with the new

value, the timer must be disabled and enabled again.



PIT Lower Lifetime Timer Register (PIT_LTMR64L)

Freescale 사의 Kinetis 시리즈에서 특이한점으로 64비트 타이머가 있다.

타이머 0, 1을 이용하여 64비트 타이머로 사용할 수 있다고 한다. 레지스터 LTMR64H를 먼저 읽고 LTMR64L를 읽으면 된다.




KL25Z 타이머  초기화 함수

void Timer1_Init(void)

{

    SIM_SCGC6 |= SIM_SCGC6_PIT_MASK; // enable PIT module

    

    //Enable PIT Interrupt in NVIC

    enable_irq(INT_PIT - 16);

    

//MCR레지스터의 MDIS(BIT30)비트가 0이 되면 Timer Enable 된다.

    Cbi(PIT_MCR, BIT30);

    PIT_TCTRL1 = 0x00; // disable PIT0

//타이머 시작값

    PIT_LDVAL1 = 48000;  

// enable PIT0 and interrupt

    PIT_TCTRL1 = PIT_TCTRL_TIE_MASK; 

    // clear flag

PIT_TFLG1 = 0x01; 

    

//Start Timer

Sbi(PIT_TCTRL1, PIT_TCTRL_TEN_MASK);

}





KL25Z 타이머  인터럽트 핸들러

#undef  VECTOR_038

#define VECTOR_038 Pit1_isrv


extern void Pit1_isrv(void);


//-----------------------------------------------------------------------------

// Timer1 Interrupt Handler

void Pit1_isrv(void)

{  

    PIT_TFLG1 = 0x01; // clear flag

gTimerTick1_1ms++;

}

//-----------------------------------------------------------------------------





KL25Z 타이머  테스트 예제코드

KL25Z 의 타이머를 이용하여 1초단위로 Led를 On/Off 하는 예제

int main (void)

{

_SystemInit();

Led1Init();

Led1Off();

Led2Init();

Led2On();

DebugInit(BAUD_115200);

DebugPrint("LKM25 Timer Test\r\n");

Timer1_Init();

while(1)

    {

if(gTimerTick1_1ms>1000)

{

gTimerTick1_1ms = 0;

Led1Toggle();

}

}

}



Posted by nexp

댓글을 달아 주세요