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

EFM32G210 EVM - 저전력 Embedded Web Server 테스트

EFM32G210 EVM - 저전력 Embedded Web Server 테스트




EFM32G210의 장점으로 Cortex-M3코어(128k Flash/16k RAM)에 저전력으로 구동 된다. 소형에 저렴하면서 플래시와 램이 풍부해서 소형 임베디드 웹서버 제작하기에 좋을것 같다.


간단히하기 위해 내부 플레쉬메모리에 웹서버를 구현 해 보았다.




할당된 IP에 접속하면 출력될 Web Page

간단한 이미지와 입출력 제어를 위한 CGI코드로 구성되어 있다.




EFM32 Web Server 테스트 동영상


Posted by nexp

댓글을 달아 주세요

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

EFM32G210 EVM - ADC 테스트 (Potentiometer 값을 TFT LCD 그래프로 표시하기)

EFM32G210 EVM - ADC 테스트 (Potentiometer 값을 TFT LCD 그래프로 표시하기)



EFM32G210은 8개의 12bit ADC포트가 있고 1개의 온도센서가 내장되어 있다. 

EFM32 ADC의 특징은 아래와 같다.

Ultra low power precision analog peripherals

 - 12-bit 1M samples/s Analog to Digital Converter

 - 4 single ended channels/2 differential channels

 - On-chip temperature sensor

 - Conversion tailgating for predictable latency



EFM32 ADC 블록도

 

 

 

EFM32G210f128 ADC 핀맵



EFM32 ADC 테스트 동영상

EFM32에 연결된 가변저항(Potentiometer) 값을 TFT LCD의 그래프로 표시하는 예제





EFM32 ADC 초기화 함수

void AdcInit(unsigned int Channel)

{

  ADC_Init_TypeDef init = ADC_INIT_DEFAULT;

  ADC_InitSingle_TypeDef singleInit = ADC_INITSINGLE_DEFAULT;

SYSTEM_ChipRevision_TypeDef chipRev;

/* ADC errata for rev B when using VDD as reference, need to multiply */

/* result by 2 */

SYSTEM_ChipRevisionGet(&chipRev);

if ((chipRev.major == 1) && (chipRev.minor == 1))

{

errataShift = 1;

}

  

CMU_ClockEnable(cmuClock_ADC0, true);

/* Init common issues for both single conversion and scan mode */

init.timebase = ADC_TimebaseCalc(0);

/* Might as well finish conversion as quickly as possibly since polling */

/* for completion. */

init.prescale = ADC_PrescaleCalc(7000000, 0);

/* WARMUPMODE must be set to Normal according to ref manual before */

/* entering EM2. In this example, the warmup time is not a big problem */

/* due to relatively infrequent polling. Leave at default NORMAL, */

ADC_Init(ADC0, &init);


/* Init for single conversion use. */

singleInit.reference = adcRefVDD;

singleInit.input = Channel; /* According to DVK HW design */

singleInit.resolution = adcRes8Bit; /* Use at least 8 bit since unlinear voltage */

ADC_InitSingle(ADC0, &singleInit);

}




EFM32 ADC Read 함수

//Read ADC Value

unsigned int AdcRead(unsigned char port)

{

    ADC_IntClear(ADC0, ADC_IF_SINGLE);

    ADC_Start(ADC0, adcStartSingle);


    /* Wait for completion */

    while (!(ADC_IntGet(ADC0) & ADC_IF_SINGLE));

    return ADC_DataSingleGet(ADC0) << errataShift;

}



Posted by nexp

댓글을 달아 주세요

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

댓글을 달아 주세요