Cortex-M/EFM322013. 5. 1. 20:00

EFM32G210 EVM - SD Card를 이용한 TFT LCD 전자액자 테스트 (SPI 제어 방식)

EFM32G210 EVM - SD Card를 이용한 TFT LCD 전자액자 테스트 (SPI 제어 방식)



EFM32의 최대 장점은 저전력 동작이면서 Cortex-M3의 성능을 가지고 있는것이다. 저전력이 요구되는 휴대용 전자 액자를 만들어 보면 좋을것 같다.

[I1511 TFT LCD] 모듈을 이용하여 TFT LCD 테스트를 해 보았다.


[Xmega32-EX] 확장 보드에서 SD Card는 1번부터 PB8(SD_CS), MISO, MOSI, SCLK, PF2(LCD_CS)로 연결되어 있다.




SPI방식의 TFT LCD 모듈 핀맵







EFM32 TFT LCD 드라이버 코드

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

// SHIFT Driver

#define _SHIFT_GPIO_EN                    0

#define _SHIFT_SPI_EN                      1


#if _SHIFT_SPI_EN

#define _SPI0_ENABLE 1


#define SHIFT_CS_BIT BIT2

#define SHIFT_CS_PORT GPIOF


#define SHIFT_PORT_INIT() GPIO_PinModeSet(gpioPortF, 2, gpioModePushPull, 1);\

SHIFT_CSon();SHIFT_SpiInit();SPI0_SetSpeed(SPI_SPEED_MAX);

#define SHIFT_CSoff() cbi(SHIFT_CS_PORT, SHIFT_CS_BIT)

#define SHIFT_CSon() sbi(SHIFT_CS_PORT, SHIFT_CS_BIT)



#define SHIFT_SpiInit SPI0_Init

#define SHIFT_SpiSendData SPI0_WriteReadByte

#endif

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



EFM32 TFT LCD 테스트 동영상

SD Card의 BMP이미지 출력 예제





Posted by nexp

댓글을 달아 주세요

Cortex-M/EFM322013. 5. 1. 19:30

EFM32 Timer 테스트 - 타이머 인터럽트로 1초 만들기

EFM32 Timer 테스트 - 타이머 인터럽트로 1초 만들기

 


 

EFM32 Timer 초기화 함수


 void InitTimer0(void)

 {

// Enable clock for TIMER0 module

CMU_ClockEnable(cmuClock_TIMER0, true);



//Select TIMER0 parameters

TIMER_Init_TypeDef timerInit =

{

.enable     = true,

.debugRun   = true,

.prescale   = timerPrescale1024,

.clkSel     = timerClkSelHFPerClk,

.fallAction = timerInputActionNone,

.riseAction = timerInputActionNone,

.mode       = timerModeUp,

.dmaClrAct  = false,

.quadModeX4 = false,

.oneShot    = false,

.sync       = false,

};


// Enable overflow interrupt

TIMER_IntEnable(TIMER0, TIMER_IF_OF);


// Enable TIMER0 interrupt vector in NVIC

NVIC_EnableIRQ(TIMER0_IRQn);


// Set TIMER Top value - Top Value / (28MHz / 1024 (prescaler))

// For 1 Seconds Top Value= 27344

TIMER_TopSet(TIMER0, 27344);


/* Configure TIMER */

TIMER_Init(TIMER0, &timerInit);

}





EFM32 타이머 인터럽트 핸들러

void TIMER0_IRQHandler(void)

{

//Clear flag for TIMER0 overflow interrupt

TIMER_IntClear(TIMER0, TIMER_IF_OF);


Led1Toggle();

}


Posted by nexp

댓글을 달아 주세요

Cortex-M/EFM322013. 4. 30. 23:30

EFM32G210 EVM - PWM테스트 (RGB LED 제어)

EFM32G210 EVM - PWM테스트 (RGB LED 제어)





EFM32는 6개의 PWM출력을 할수 있다. PWM을 이용하여  [Xmega32-EX EVM] 확장 테스트 보드에서 RGB LED 조면제어 테스트를 해 보았다.


EFM32 PWM 기능

- Up-count PWM

- Up/down-count PWM

- Predictable initial PWM output state (configured by SW)

- Buffered compare register to ensure glitch-free update of compare values




EFM32 PWM 출력 핀맵

EFM32는 PWM출력을 위한 2개의 타이머가 있고 각각 3채널, 6개의 PWM을 출력할 수 있다.






EFM32G210F128 Timer 블록도




3채널 PWM 출력 테스트를 위해 Xmega32-EX 확장 테스트 보드의 3색 컬러 LED를 이용하였다.




EFM32 PWM테스트 동영상





EFM32 PWM 초기화 코드

void InitPwm0(void)

{   

    //Enable clock for TIMER0 module

    CMU_ClockEnable(cmuClock_TIMER0, true);

   

    //Set CC0 location 4 pin (PA0) as output

    GPIO_PinModeSet(gpioPortA, 0, gpioModePushPull, 0);    

    // Set CC1 location 4 pin (PA1) as output 

    GPIO_PinModeSet(gpioPortA, 1, gpioModePushPull, 0);

    // Set CC2 location 4 pin (PA2) as output 

    GPIO_PinModeSet(gpioPortA, 2, gpioModePushPull, 1);      

  

    

    // Route CC0 to location 3 (PD1) and enable pin

    TIMER0->ROUTE |= (TIMER_ROUTE_CC0PEN | TIMER_ROUTE_CC1PEN |TIMER_ROUTE_CC2PEN | TIMER_ROUTE_LOCATION_LOC1); 


  

    /* Select CC channel parameters */

    TIMER_InitCC_TypeDef timerCCInit = 

    {

    .eventCtrl  = timerEventEveryEdge,

    .edge       = timerEdgeBoth,

    .prsSel     = timerPRSSELCh0,

    .cufoa      = timerOutputActionNone,

    .cofoa      = timerOutputActionNone,

    .cmoa       = timerOutputActionToggle,

    .mode       = timerCCModePWM,

    .filter     = false,

    .prsInput   = false,

    .coist      = false,

    .outInvert  = false,

    };


    

    /* Configure CC channel 0 */

    TIMER_InitCC(TIMER0, 0, &timerCCInit);

    /* Configure CC channel 1 */

    TIMER_InitCC(TIMER0, 1, &timerCCInit);

    /* Configure CC channel 2 */

    TIMER_InitCC(TIMER0, 2, &timerCCInit);

    

    

    /* Set Top Value */

    TIMER_TopSet(TIMER0, TOP);

    

    TIMER_CompareBufSet(TIMER0, 0, 0x7F);

    TIMER_CompareBufSet(TIMER0, 1, 0x7F);

    TIMER_CompareBufSet(TIMER0, 2, 0x7F);

  

    /* Select timer parameters */  

    

    /* With a clock of 48MHZ, a divider of 512 and a resolution of

     256/8 bit the PWM period frequency is approx  366 hz */

    

    TIMER_Init_TypeDef timerInit =

    {

    .enable     = true,

    .debugRun   = true,

    .prescale   = timerPrescale512,

    .clkSel     = timerClkSelHFPerClk,

    .fallAction = timerInputActionNone,

    .riseAction = timerInputActionNone,

    .mode       = timerModeUp,

    .dmaClrAct  = false,

    .quadModeX4 = false,

    .oneShot    = false,

    .sync       = false,

    };

    

    /* Configure timer */

    TIMER_Init(TIMER0, &timerInit);  

}



EFM32 PWM 테스트 소스코드

int main(void)

{

    char r,g,b;

    unsigned int cnt = 0;


    _SystemInit();


    // Ensure core frequency has been updated 

    SystemCoreClockUpdate();

    // Setup SysTick Timer for 1 msec interrupts  

    if (SysTick_Config(SystemCoreClock / 1000)) while (1) ;



    Led1Init();

    Led1Off();

    

    DebugInit(BAUD_115200);

    DebugPrint("EFM32 PWM Test\r\m");

    

   

    InitPwm0();

    LED_RgbSet(r, g, b);

    

while(1)

{

      if(msTicks>10)

      {

          msTicks = 0;

          g= 255-r;

          b= 128-g;

          

          LED_RgbSet(r, g, b);

          if(r<=1)

          {

              r=255;

              

              

              Delay(200);

          }

          else  r -=1;

      }

  }

}




Posted by nexp

댓글을 달아 주세요

Cortex-M/EFM322013. 4. 30. 22:30

EFM32G210 EVM - SPI 테스트

EFM32G210 EVM - SPI 테스트



EFM32의 SPI최대 클럭 속도는 14Mhz 까지 동작한다. (최대 peripheral clock이 28Mhz 이므로.. )

- SPI master mode, peripheral clock rate/2



EFM32G210 EVM 보드에서 SPI핀을 USART1에 할당하였다.




EFM32 SPI 블록도



EFM32 SPI 초기화 함수

void SPI0_Init(void)

{

    CMU_ClockEnable(cmuClock_USART1, true);    

    

    USART_TypeDef *SPI0;

    SPI0 = USART1;

    

    /* Setting baudrate */

    SPI0->CLKDIV = 128 * (SPI_PERCLK_FREQUENCY / SPI_BAUDRATE - 2);


    /* Configure SPI */

    /* Using synchronous (SPI) mode*/

    SPI0->CTRL = USART_CTRL_SYNC;

    /* Clearing old transfers/receptions, and disabling interrupts */

    SPI0->CMD = USART_CMD_CLEARRX | USART_CMD_CLEARTX;

    SPI0->IEN = 0;


    /* Enabling pins and setting location */

    SPI0->ROUTE = USART_ROUTE_TXPEN | USART_ROUTE_RXPEN | USART_ROUTE_CLKPEN | (0 << 8);

    /* Set GPIO config to slave */

    GPIO_Mode_TypeDef gpioModeMosi = gpioModeInput;

    GPIO_Mode_TypeDef gpioModeMiso = gpioModePushPull;

    GPIO_Mode_TypeDef gpioModeClk  = gpioModeInput;   

 

    /* Enabling Master, TX and RX */

    SPI0->CMD   = USART_CMD_MASTEREN | USART_CMD_TXEN | USART_CMD_RXEN;

    SPI0->CTRL |= (USART_CTRL_MSBF);


    /* Set GPIO config to master */

    gpioModeMosi = gpioModePushPull;

    gpioModeMiso = gpioModeInput;

    gpioModeClk  = gpioModePushPull;


    GPIO_PinModeSet(gpioPortC, 0, gpioModeMosi, 0);  /* MOSI */

    GPIO_PinModeSet(gpioPortC, 1, gpioModeMiso, 0);  /* MISO */

    GPIO_PinModeSet(gpioPortB, 7, gpioModeClk,  0);  /* Clock */    

}



EFM32 SPI Read, Write 함수

unsigned char SPI0_WriteReadByte(unsigned char Data)

{

    USART_TypeDef *SPI0 = USART1;

    while (!(SPI0->STATUS & USART_STATUS_TXBL)) ;

    SPI0->TXDATA = Data;


    while (!(SPI0->STATUS & USART_STATUS_RXDATAV)) ;

    return (SPI0->RXDATA);    

}




Posted by nexp

댓글을 달아 주세요

Cortex-M/EFM322013. 4. 30. 21:30

EFM32G210 EVM - UART 테스트

EFM32G210 EVM - UART 테스트

 


MCU를 처음 다룰때 디버깅 및 제어를 위해 가장 기본적으로 필요한 인터페이스 수단으로 UART를 사용하는데 EFM32는 2채널의 UART가 있다. 특히 Low Energy UART 기능이 있어 저전력으로 UART통신을 할 수 있다고 한다.











EFM32 UART 블록도

 


EFM32 UART 핀맵

PE10, PE11 에 UART0가 연결되어 있다.

 

PC0, PC1에 UART1이 연결되어 [EFM32 EVM] 보드에서는  있지만 SPI로 사용하고 있다.

 


EFM32 UART 초기화코드

 void U0_Init(unsigned char baud)
{   
 USART_InitAsync_TypeDef init = USART_INITASYNC_DEFAULT;
 USART_TypeDef *usart = USART0;
 
 U0_SetBaud(baud);

    CMU_ClockEnable(cmuClock_HFPER, true);
    CMU_ClockEnable(cmuClock_USART0, true);   

 /* Use default location 0: TX - Pin C0, RX - Pin C1 */
 GPIO_PinModeSet(gpioPortE, 10, gpioModePushPull, 1);
 ///Define input, no filtering
 GPIO_PinModeSet(gpioPortE, 11, gpioModeInput, 0);
 
 //Enable pins at default location
 usart->ROUTE = USART_ROUTE_LOCATION_LOC0 | USART_ROUTE_RXPEN | USART_ROUTE_TXPEN;

 /* Configure USART for basic async operation */
 init.enable = usartEnable;
 USART_InitAsync(usart, &init);

 /* Finally enable it */
 USART_Enable(usart, usartEnable);
}

 

 

EFM32 UART 송수신 함수

unsigned char U0_GetByte(void)
{
  while (!(USART0->STATUS & USART_STATUS_RXDATAV));

  return (uint8_t)(USART0->RXDATA);
}

 

 

void U0_PutByte(unsigned char Data)
{
  while (!(USART0->STATUS & USART_STATUS_TXBL));
  USART0->TXDATA = (uint32_t)Data;
}

 

 

 

EFM32 UART 테스트 소스코드

int main(void)
{
    unsigned int cnt = 0;
    _SystemInit();

   
    Led1Init();
    Led1Off();
   
    DebugInit(BAUD_115200);
    DebugPrint("EFM32 UART Test\r\m");
   
    while (1)
    {
        DebugPrint("cnt=%d\r\n", cnt++);
        Delay(100);
    }
}

 

Posted by nexp

댓글을 달아 주세요