[FreeScale]/KINETIS2013. 11. 2. 20:00

FRDM-KL25Z 를 이용한 Kinetis 디버거(SWD JTAG) 제작하기

FRDM-KL25Z 를 이용한 Kinetis 디버거(SWD JTAG) 제작하기



FRDM-KL25Z는 만원대의 저렴한 Kenetis 개발도구 임에도 불구하고 SWD JTAG 디버거를 내장하고 있다.

개발보드 내의 KL25Z를 디비깅 할수 도 있고 다른 보드의 Kinetis (Cortex-M0, Cortex-M4 등)를 디버깅 할 수도 있다.


다만 JTAG를 외부로 사용하기 위해 하드웨어적으로 처리를 좀 해 주어야 한다.

물론 간단히 작업 가능하다.







JTAG 내부 외부 설정 점퍼 작업



Posted by nexp

댓글을 달아 주세요

[FreeScale]/KINETIS2013. 11. 2. 18:30

FreeScale Cortex-M4 Kinetis K20 EVM 보드제작

FreeScale Cortex-M4 Kinetis K20 EVM 보드제작




소매가 기준 3000원대 저렴한 Cortex-M4 가 눈에 띄어 보드 제작해 보았다.

저렴하며 소형이며 성능또한 나쁘지 않아 SM-Type EVM 형태로 제작 해서 기존 확장 테스트 보드에서 호환할 수 있도록 했다.



K20은 128K Flash, 16K Ram, 50Mhz로 동작하는 저렴한 Cortex-M4 코어이다. 물론 속도는 느리지만 저렴함을 강점으로 내새우고 있다. M4코어 이므로 FPU를 지원한다. 그리고 16bit ADC, 12bit DAC를 내장하고 있어 아날로그 파트도 강점이다.

엘레파츠에서 소량 구매시 3천원대에 구매할 수 있다.





K20 EVM 보드는 기존 여러 확장 보드에 연결하여 테스트 가능하다. 

MP3 확장 테스트 보드



TFT-LCD 확장 테스트 보드



LCD 및 FND VR 등을 테스트 할 수 있는 STM32-SM EXP 확장 보드



Ethernet 테스트 할 수 있는 [NET_EV SM EVM] 확장 테스트 보드





[K20 EVM] 회로도 핀맵

기존 SM-Type EVM 형태로 핀맵 호환 되도록 제작해서 여러 확장 보드에 사용할수 있도록 했다.










Posted by nexp

댓글을 달아 주세요

[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:30

[FRDM-KL25Z] Kinetis - UART 테스트

[FRDM-KL25Z] Kinetis - UART 테스트

K25의 UART는 일반 UART 2채널과 low power UART module 1채널로 구성되어 있다.

FRDM-KL25Z 보드에는 JATG및 UAB2UART 보드가 내장되어 있다. JTAG 보드에서 가상 UART를 지원하므로 별도의 USB2UART 모듈 필요없이 시리얼 포트 제어가 가능하다. 장치관리자에서 가상 시리얼 포트 번호 확인 가능하다.

(이런면에서 정말 저렴한 개발보드인것을 다시 한번 느끼게 된다.)

시리얼 포트는 FRDM-KL25Z 보드에 PA1(RXD), PA2(TXD)로 연결되어 있다.






기본 예제코드에 UART를 위한 드라이버 함수가 제공되지만 Kenetis 시리즈의 전체적인 구조를 파악하기 위해서 데이터시트의 레지스터를 보면서 로레벨 함수를 만들어 보는것도 중요한 일이라 정리해 보았다.







MKL25Z UART 초기화 코드

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

// Serial Prot0 Utility Fuction Routine

void U0_Init(unsigned char baud)

{

//UART Port 초기화

// Enable the UART_TXD function on PTA1 

PORTA_PCR1 = PORT_PCR_MUX(0x2);


// Enable the UART_TXD function on PTA2 

PORTA_PCR2 = PORT_PCR_MUX(0x2);


// select the PLLFLLCLK as UART0 clock source

SIM_SOPT2 |= SIM_SOPT2_UART0SRC(1); 


SIM_SCGC4 |= SIM_SCGC4_UART0_MASK;

UART0_C2_REG(UART0_BASE_PTR) &= ~(UART0_C2_TE_MASK | UART0_C2_RE_MASK );


//Configure the uart for 8-bit mode, no parity 

//We need all default settings, so entire register is cleared

UART0_C1_REG(UART0_BASE_PTR) = 0;


//UART Baudrate 설정

U0_SetBaud(baud);

}




MKL25Z UART 송수신 함수

unsigned char U0_GetByte(void)

{

//데이터가 수신되면

while (!(UART_S1_REG(UART0_BASE_PTR) & UART_S1_RDRF_MASK));


//데이터 읽어옴

return UART_D_REG(UART0_BASE_PTR);

}


void U0_PutByte(unsigned char Data)

{

      //송신 FIFO가 비어지면

      while(!(UART_S1_REG(UART0_BASE_PTR) & UART_S1_TDRE_MASK));

    

      //데이터 전송

      UART_D_REG(UART0_BASE_PTR) = Data;

}


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

댓글을 달아 주세요