MSP432 성능 테스트 - GPIO토글

[MSP430]/MSP432 | 2016.05.06 18:06
Posted by nexp

MSP432 성능 테스트 - GPIO토글



MSP432는 Cortex-M4 코어의 최대 48Mhz로 동작하는 저전력 MCU이다. 단순 비교는 의미 없기는 하지만 간단히 GPIO토글 속도로 성능 테스트를 진행 해 보았다.



MSP432의 CPU성능 테스트를 위해 TI에서 제공하는 기본 MSP432 GPIO 토글 예제를 구동해 보았다.


MAP_GPIO_toggleOutputOnPin(GPIO_PORT_P7, GPIO_PIN6);


GPIO토글 속도는 16khz로 측정 된다.

너무 느리다.

MSP432 클럭 설정을 좀 들여다 볼 필요가 있을것 같다.



MSP432는 10kHz ~ 48Mhz로 구동 가능하고 2개의 외부 클럭과, 5개의 내부 클럭 소스로 구성된다.



MSP432의 클럭 소스

LFXTCLK 외부 클럭 Low-frequency oscillator (LFXT)에서 32768Hz 등을 이용 가능 (32kHz 이하 주파수)

VLOCLK 내부 클럭 : 10KHz 정도의 VLO (Very low power low frequency oscillator) 시계

REFOCLK 내부 클럭 : 32k 또는 128KHz의 REFO (low-power low-frequency oscillator) 시계

DCOCLK 내부 클럭 : DCO (digitally controlled oscillator) 클럭 주파수 선택 가능

MODCLK 내부 클럭 : 24MHz의 low-power oscillator

HFXTCLK 외부 클럭 : 고속 클럭 HFXT (High-frequency oscillator) 1MHz ~ 48MHz 범위

SYSOSC 내부 클럭 : 5MHz






물론 클럭 별로 파워 선택이 필요하고 제약사항도 따른다. 최대한의 저전력 구동을 위해 이런 구조가 된것 같지만 개발자는 신경 써야 할 부분이 많아 져서 부담으로 다가올것 같다.







우선 클럭 속도를 좀더 올리기 위해 코드 수정이 필요한데

system_msp432p401r.c

파일에서 설정 가능하다.


48Mhz로 설정해서 구동해 보자.

//  CPU Frequency

//     <1500000> 1.5 MHz

//     <3000000> 3 MHz

//     <12000000> 12 MHz

//     <24000000> 24 MHz

//     <48000000> 48 MHz


//#define  __SYSTEM_CLOCK    1500000


#define  __SYSTEM_CLOCK    48000000



48Mhz 설정하고 GPIO 토글 속도를 측정해 보면

1Mhz

로 측정된다.


   127                  MAP_GPIO_toggleOutputOnPin(GPIO_PORT_P7, GPIO_PIN6);

   \                     ??main_1: (+1)

   \   00000014   0x2140             MOVS     R1,#+64

   \   00000016   0x2007             MOVS     R0,#+7

   \   00000018   0x.... 0x....      BL       GPIO_toggleOutputOnPin

   \   0000001C   0xE7FA             B.N      ??main_1

   \   0000001E   0xBF00             Nop      

   \                     ??main_0:

   \   00000020   0x02000864         DC32     0x2000864




TI제공 함수를 이용하지 않고 레제스터 직접 제어 해 보았다.

2Mhz

로 측정된다.

다른 회사의 Cortex-M4 코어에 있는 GPIO토글 레지스터가 있으면 좋을것 같은데... 

#define OFS_LIB_PAOUT   ((uint32_t)&P1->OUT - (uint32_t)P1)

#define PORT7           ((uint32_t)P7 + OFS_LIB_PAOUT)  



       98                  HWREG16(PORT7) ^= GPIO_PIN6;


   \                     ??main_1: (+1)

   \   00000016   0x8801             LDRH     R1,[R0, #+0]

   \   00000018   0xF081 0x0140      EOR      R1,R1,#0x40

   \   0000001C   0x8001             STRH     R1,[R0, #+0]

   \   0000001E   0xE7FA             B.N      ??main_1

   \                     ??main_0:

   \   00000020   0x02000864         DC32     0x2000864

   \   00000024   0x40004C62         DC32     0x40004c62



토글 하지 않고 직접 On/Off를 반복해서 측정 해 보니 

12Mhz로 측정이 된다.


와 비교해 보면 비슷한것 같은데... 저전력 기능을 감안하면 성능면에서는 나쁘지 않은것 같다.


[SAMD21 EVM] CPU 클럭 설정 및 성능 측정 실험





SAMD 시리즈는 Cortex-M0 코어의 48Mhz 로 동작하고 여러 다양한 기술로 페리의 병목현상을 줄여 성능 향상을 했다고 한다. 일단 GPIO 제어로 간단히 속도 테스트를 해보도록 하자.


우선 아래 코드와 같이 ATMEL에서 제공하는 코드를 이용하여 GPIO 토글 속도 테스를 해 보았다.


int main(void)

{

system_init();


       Led1Init();

       Led2Init();

    

while (true)

      {

         port_pin_toggle_output_level(PIN_PB30);

}

}



GPIO토글 속도600khz로 출력된다.

느리다. 아무래도 클럭 설정에 문제가 있는것 같다.


conf_clocks.h 파일에 클럭 설정하는 부분이 있다.

디폴트로 8Mhz로 설정되어 있다. PLL을 이용해서 48Mhz까지 동작 시킬 수 있다.


1)48Mhz로 동작시키면 WAIT 값을 높여 주어야 한다.

/* System clock bus configuration */

#  define CONF_CLOCK_CPU_CLOCK_FAILURE_DETECT     false

//#  define CONF_CLOCK_FLASH_WAIT_STATES            0

#  define CONF_CLOCK_FLASH_WAIT_STATES            2




2)DFLL 설정을 enable 한다.

/* SYSTEM_CLOCK_SOURCE_DFLL configuration - Digital Frequency Locked Loop */

//#  define CONF_CLOCK_DFLL_ENABLE                  false

#  define CONF_CLOCK_DFLL_ENABLE                  true




3)MAIN CLK를 DFLL로 설정해 준다.

/* Configure GCLK generator 0 (Main Clock) */

#  define CONF_CLOCK_GCLK_0_ENABLE                true

#  define CONF_CLOCK_GCLK_0_RUN_IN_STANDBY        true

//#  define CONF_CLOCK_GCLK_0_CLOCK_SOURCE          SYSTEM_CLOCK_SOURCE_OSC8M

#  define CONF_CLOCK_GCLK_0_CLOCK_SOURCE          SYSTEM_CLOCK_SOURCE_DFLL



이렇게 설정하니 1.8Mhz로 동작 한다.

ATMEL에서 제공하는 코드라 아무래도 함수로 접근해서 느려지는것 같다.



코드 수정해서 레지스터 직접제어로 테스트 해 보았다.  


int main(void)

{

system_init();


       Led1Init();

       Led2Init();

    

while (true)

      {

          //Led1Toggle(); 

          PORT->Group[1].OUTTGL.reg = BIT30; ;

}

}


레지스터 직접 제어로 변경하니 4Mhz로 출력된다.


다른 MCU들의 성능 측정 결과비교하면 만족할 만한 수준은 아닌것은데... 다양한 페리로 실험해 보면서 성능 테스를 해 볼 필요가 있을것 같다.






LPC1313 성능 테스트

[NXP]/LPC1k | 2015.08.09 23:00
Posted by nexp

LPC1313 성능 테스트



LPC1313은 Cortex-M3코어에 72Mhz로 동작한다. 가격은 1$ 정도로 저렴해서 가격이 민감한 어플리케이션에 좋을것 같다.


LPC1114 의 GPIO 제어 속도와  비교해교 해면 좋을것 같다.

결론적으로는 3Mhz -> 4.5Mhz 로 좋아진것 같다. GPIO On/Off만 했을때 16Mhz로 측정된다.






디폴트로 외부 12Mhz 클럭으로 설정되어 있기 때문에 PLL을 이용하여 72Mhz로 설정해 주었다.

#define CLOCK_SETUP           1

#define SYSCLK_SETUP          1

#define SYSOSC_SETUP          1

#define SYSOSCCTRL_Val        0x00000000

#define WDTOSC_SETUP          0

#define WDTOSCCTRL_Val        0x000000A0


//내부 OSC 사용

#define SYSPLLCLKSEL_Val      0x00000000

#define SYSPLL_SETUP          1

#define SYSPLLCTRL_Val        0x00000025


//메인 클럭으로 PLL 사용

#define MAINCLKSEL_Val        0x00000003


#define USBCLK_SETUP          0

#define USBPLL_SETUP          0

#define USBPLLCLKSEL_Val      0x00000001

#define USBPLLCTRL_Val        0x00000003

#define SYSAHBCLKDIV_Val      0x00000001

#define AHBCLKCTRL_Val        0x0001005F



LPC1313 의 시스템 클럭 블록도






단순 토글 만 했을 경우 4.5Mhz 로 측정된다.

     26              while(1)

     27              {

     28                  LPC_GPIO3->DATA ^= LED1_BIT;

   \   00000024   0x6801             LDR      R1,[R0, #+0]

   \   00000026   0xF081 0x0110      EOR      R1,R1,#0x10

   \   0000002A   0xE7FA             B.N      ??main_1

   \                     ??main_0:

   \   0000002C   0x40048080         DC32     0x40048080

   \   00000030   0x50038000         DC32     0x50038000

   \   00000034   0x50033FFC         DC32     0x50033ffc




아쉬운점은 LPC 1xxxx 시리즈는 Set, Clear, Toggle 레지스터가 없다. 그래서 위애서 처럼 비트 제어하게 되면 두번의 명령어로 처리된다.

대신 MASKED_ACCESS 레지스터를 이용하여 비트제어를 한 명령어에 실행 되도록 할 수 있다.

이렇게 하면 7.2Mhz 정도로 출력된다.



MASKED_ACCESS 레지스터를 이용해 한명령어로 비트 제어 가능하다.

       24              while(1)

     25              {

     26                  LPC_GPIO3->MASKED_ACCESS[BIT4] = BIT4;     

   \                     ??main_0: (+1)

   \   0000003E   0x2110             MOVS     R1,#+16

   \   00000040   0x6001             STR      R1,[R0, #+0]

     27                  LPC_GPIO3->MASKED_ACCESS[BIT4] = 0;

   \   00000042   0x2100             MOVS     R1,#+0

   \   00000044   0x6001             STR      R1,[R0, #+0]

   \   00000046   0xE7FA             B.N      ??main_0




GPIO On/Off 를 했을경우 8Mhz 로 측정된다. 경쟁사 Cortex-M3 코어의 STM32F103 과 속도 비교해 보면 별차이가 없는것 같다. 그리고 가격적으로는 상당히 저렴하다는 장점이 있다.

     24              while(1)

     25              {

     26                  LPC_GPIO3->DATA = BIT4;

   \                     ??main_0: (+1)

   \   0000003C   0x2010             MOVS     R0,#+16

   \   0000003E   0x6020             STR      R0,[R4, #+0]

     27                  LPC_GPIO3->DATA = 0;

   \   00000040   0x2000             MOVS     R0,#+0

   \   00000042   0x6020             STR      R0,[R4, #+0]

   \   00000044   0xE7FA             B.N      ??main_0




GPIO On/Off 후 Main으로 복귀하는 명령어 때문에 실제 속도와는 차이가 있는데 On/Off 를 많이 반복해 보면 평균 속도가 나오는데...

이때 17.8Mhz 로 측정된다. 경쟁사 Cortex-M3 코어의 STM32F103 과 속도 비교해 보면 별차이가 없는것 같다. 그리고 가격적으로는 상당히 저렴하다는 장점이 있다.


     26              while(1)

     27              {

     29                  

     30                  LPC_GPIO3->DATA = 0;

   \   00000024   0x2100             MOVS     R1,#+0

   \   00000026   0x6001             STR      R1,[R0, #+0]

     31                  LPC_GPIO3->DATA = LED1_BIT;

   \   00000028   0x2110             MOVS     R1,#+16

   \   0000002A   0x6001             STR      R1,[R0, #+0]

     32                  

     33                  LPC_GPIO3->DATA = 0;

   \   0000002C   0x2100             MOVS     R1,#+0

   \   0000002E   0x6001             STR      R1,[R0, #+0]

     34                  LPC_GPIO3->DATA = LED1_BIT;

   \   00000030   0x2110             MOVS     R1,#+16

   \   00000032   0x6001             STR      R1,[R0, #+0]

   








TM4C123 - MCU 성능측정

[TI]/TM4C | 2014.07.20 22:00
Posted by nexp

TM4C123 - MCU 성능측정



TM4C123은 Cortex-M4코어에 80Mhz로 동작한다. M4코어이고 페리가 막강하기 때문에 단순 비교하기는 좀 한계가 있긴하지만 일단 GPIO토글 속도로 성능 측정을 해 보았다.


TI에서 제공하는 함수를 이용하니 2.2Mhz 의 속도가 나온다.

너무 느리다 옵티마이즈 해도 동일하다.

#define Led1Off() GPIOPinWrite(GPIO_PORTB_BASE, LED1_BIT, LED1_BIT);

#define Led1On() GPIOPinWrite(GPIO_PORTB_BASE, LED1_BIT, 0);



     12              while(1)

     13              {

     14                  Led1On();

   \   00000044   0x2200             MOVS     R2,#+0

   \   00000046   0x2104             MOVS     R1,#+4

   \   00000048   0x4628             MOV      R0,R5

   \   0000004A   0x.... 0x....      BL       GPIOPinWrite

     15                  Led1Off();

   \   0000004E   0x2204             MOVS     R2,#+4

   \   00000050   0x2104             MOVS     R1,#+4

   \   00000052   0xE7F4             B.N      ??main_1

   \                     ??main_0:

   \   00000054   0x01000020         DC32     0x1000020

   \   00000058   0xF0000801         DC32     0xf0000801

   \   0000005C   0x40005000         DC32     0x40005000

     16              }




레지스터를 직접 제어해서 GPIO를 On/Off 해보니 10Mhz 로 빨라졌다.

     13              while(1)

     14              {

     17                  HWREG(PORTB + (GPIO_O_DATA + (BIT2 << 2))) = 0;

   \                     ??main_1: (+1)

   \   00000046   0x2100             MOVS     R1,#+0

   \   00000048   0x6001             STR      R1,[R0, #+0]

     18                  HWREG(PORTB + (GPIO_O_DATA + (BIT2 << 2))) = BIT2;

   \   0000004A   0x2104             MOVS     R1,#+4

   \   0000004C   0x6001             STR      R1,[R0, #+0]

   \   0000004E   0xE7FA             B.N      ??main_1

   \                     ??main_0:

   \   00000050   0x01000020         DC32     0x1000020

   \   00000054   0xF0000801         DC32     0xf0000801

   \   00000058   0x40005000         DC32     0x40005000

   \   0000005C   0x40005010         DC32     0x40005010

     19              }




하지만 80Mhz로 구동하는데... 속도가 너무 느리다. 

릴리즈 모드로 변경하니 코드사이즈가 줄어든다.

     37              while(1)

     38              {

     39                  //Led1On();

     40                  //Led1Off();

     41                  PB2 = 0;

   \                     ??main_0: (+1)

   \   00000052   0x600A             STR      R2,[R1, #+0]

     42                  PB2 = 1;

   \   00000054   0x6008             STR      R0,[R1, #+0]

   \   00000056   0xE7FC             B        ??main_0

     43              }



GPIO 세트, 클리어, 토글 레지스터가 없다.

물론 GPIO 비트제어는 GPIO데이터 레지스터에서 2비트 시프트된 주세에 맵핑되어 있으므로 소프트웨어 적으로 처리하면 한 명령 사이클 내에 제어 가능하다.





M052LBN EVM - NUVOTON MCU성능 측정

Cortex-M/NUVOTON | 2014.07.06 22:00
Posted by nexp

M052LBN EVM - NUVOTON MCU성능 측정



NUVOTON사의 저렴한 MCU M052LBN 는 최대 클럭 50Mhz로 동작한다. GPIO토글을 이용하여 MCU성능 측정을 해 보았다.



3.2Mhz

#define Led1Toggle() P26 ^= 1


     15              while(1)

     16              {

     17                  Led1Toggle();

   \                     ??main_1: (+1)

   \   00000026   0x6821             LDR      R1,[R4, #+0]

   \   00000028   0x4041             EORS     R1,R1,R0

   \   0000002A   0x6021             STR      R1,[R4, #+0]

   \   0000002C   0xE7FB             B        ??main_1

   \   0000002E   0xBF00             Nop      

   \                     ??main_0:

   \   00000030   0x50004080         DC32     0x50004080

   \   00000034   0x50004258         DC32     0x50004258

     19              }




GPIO On/Off 시 7.2Mhz까지 출력 되는것이 확인된다.

#define Led1Off() P26 = 1

#define Led1On() P26 = 0


     15              while(1)

     16              {

     17                  Led1On();

   \                     ??main_1: (+1)

   \   00000026   0x6025             STR      R5,[R4, #+0]

     18                  Led1Off();

   \   00000028   0x6020             STR      R0,[R4, #+0]

   \   0000002A   0xE7FC             B        ??main_1

   \                     ??main_0:

   \   0000002C   0x50004080         DC32     0x50004080

   \   00000030   0x50004258         DC32     0x50004258

     21              }


1$ 이하 MCU에서 이정도 성는이면 포트도 여유롭고 나쁘지 않다.

 

STM8 EVM MCU성능테스트 - CLK 설정

[ST_MICRO]/STM8 | 2014.05.04 18:30
Posted by nexp

STM8 EVM MCU성능테스트 - CLK 설정


STM8은 최대 24Mhz로 동작하는 8bit MCU이다. STM8SF의영우 16Mhz가 최대 동작 주파수 이다.

속도는 그리 빠르지 않아도 가격대비 성능이 우수한데 간단히 성능 테스트를 해 보았다.



STM8 클럭 블록도

우선 STM8의 클럭 시스템을 보면 외부 오실레이터나 크리스탈을 연결하거나 내부 16Mhz RC 오실레이터를 이용할 수 있다. 사이즈가 워낙 작아서 내부 클럭 사용을 많이 하게되므로 내부 클럭 기준으로 테스트 할 예정이다.


동작 클럭은 외부로 출력 할 수 있는데 PC4-CLK CCO핀으로 출력해서 확인 할 수 있다.


PC4(HS)/TIM1_CH4/CLK_CCO/AIN2/[TIM1_CH2N]





STM8 클럭 설정

void SystemInit(void)

{

    CLK_DeInit();

    CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV1);                // CPU Prescaler = 1.

    CLK_SYSCLKConfig(CLK_PRESCALER_HSIDIV1);                // Prescaler = 8, 16 MHz.

    //CLK_CCOConfig(CLK_OUTPUT_HSI);                          // Output clock on CCO pin.

    CLK_ClockSwitchConfig(CLK_SWITCHMODE_AUTO,              // Automatically switch

                          CLK_SOURCE_HSI,                   // Switch to internal timer.

                          DISABLE,                          // Disable the clock switch interrupt.

                          CLK_CURRENTCLOCKSTATE_DISABLE);   // Disable the previous clock.  

    

    CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1); /*16 MHz Setting*/    

}




16Mhz로 동시 GPIO토글 속도는 3.2Mhz 정도로 측정된다. 16Mhz대 다른 MCU의 성능과 비교해 보면 나쁘지 않은것 같다. 특히 가격적인 면을 고려 한다면 상당히 만족스럽다.

     32              while(1)

     33              {

     36                  PORTD = 0;

   \                     ??main_0:

   \   000019 35 00 500F   MOV       L:0x500f, #0x0

     37                  PORTD = BIT3;

   \   00001D 35 08 500F   MOV       L:0x500f, #0x8

   \   000021 20 F6        JRA       L:??main_0

     38              }


dsPIC33E - MCU속도 측정

[Microchip]/dsPIC33E | 2014.03.29 05:32
Posted by nexp

dsPIC33E - MCU속도 측정





dsPIC33E 시리즈는 최대 70Mhz로 동작 가능하다. 기존 dsPIC33 시리즈가 40Mhz로 동작한것에 비해 거의 2배 정도의 성능이 향상되었다.

기존 dsPIC33시리즈의 MCU속도 측정과 비교해 보면 약 두배 정도 속도가 향상된것 같다. 이정도면 72Mhz STM32(12Mhz)와 비교해 봐도 좋을것 같다.


MCU별 속도 측정 참고



단순히 GPIO On/Off 했을때 속도를 측정해 보면..

-> 7Mhz


34:                 while(1)

35:                 {

36:                 LATA = 0xFF;

  0374  200FF1     mov.w #0xff,0x0002

  0376  20E040     mov.w #0xe04,0x0000

  0378  780801     mov.w 0x0002,[0x0000]

37:                 LATA = 0;

  037A  EB0080     clr.w 0x0002

  037C  20E040     mov.w #0xe04,0x0000

  037E  780801     mov.w 0x0002,[0x0000]

38:                


44:                 }

  0380  37FFF9     bra 0x000374


  

옵티마이즈 후 

 ->11.5Mhz

  34:                 while(1)

35:                 {

36:                 LATA = 0xFF;

  0340  887020     mov.w 0x0000,0x0e04

37:                 LATA = 0;

  0342  EF2E04     clr.w 0x0e04

  0344  37FFFD     bra 0x000340



[TMS320C28346] 성능 테스트 -  GPIO토글  테스트




DSP28335 EVM 보드와 핀맵을 동일하게 해서 TMS320C28346를 테스트 할 수 있는 보드를 제작 했다. TMS320F28335와 코드가 호환 되므로 기존 예제들을 좀더 좋은 성능으로 테스트 가능하다.

TMS320F28335 EVM에서의 속도 비교를 참고하면 확실히 성능향상이 된것 같다
 
 

메모리방식으로 단순 On/Off
15Mhz

while(1)
{
 GpioDataRegs.GPACLEAR.bit.GPIO4 = 1;
 GpioDataRegs.GPASET.bit.GPIO4 = 1;
}
 



레지스터방식의 토글 레지스터
18Mhz 
GpioDataRegs.GPATOGGLE.all =0x000000FF;
 




레지스터방식의 단순 On/Off 속도 
38Mhz
GpioDataRegs.GPACLEAR.all    =0x000000FF;
GpioDataRegs.GPASET.all      =0x000000FF;

 


[XMC1300 EVM] - 성능측정 GPIO토글 테스트


Infineon사의 저렴한 Cortex-M0 XMC1302를 이용하여 간단히 성능 테스트를 해 보았다. 물론 요즘에 출시되는 MCU들은 각각의 용도별 특징이 있기 때문에 절대 성능을 측정하기는 무리가 있지만 기록해 두면 여러모로 쓸모는 있을것 같다.


XMC1300은 다른 Cortex시즈와 달리 GPIO 셋, 클리어, 토글레지스터가 따로 없고 OMR(Output Modification Register)레지스트라고하는 출력 상태를 변경하는 레지스터에서 토글이나 셋, 클리어 가능하다.

이렇게 레지스터가 하나로 되면 하드웨어적으로는 간단해 지지만 소프트웨어적으로는 한번의 연산이 더 필요기 때문에 코드상에서는 불리한것 같다.



XMC1300 GPIO 블록도

아래 그림은 XMC1300의 GPIO 구조도 이다.




우선 최대 32Mhz로 구동하고 GPIO출력 레지스터를 토글해 보니 1.25Mhz정도 된다. 


1.25Mhz

              while(1)

                   {

               

                       PORT0->OUT ^=  BIT13;

   \   00000036   0x6821             LDR      R1,[R4, #+0]

   \   00000038   0x4041             EORS     R1,R1,R0

   \   0000003A   0xE7FB             B        ??main_1

   \                     ??main_0:

   \   0000003C   0x40040000         DC32     0x40040000

   \   00000040   0xFFFFEFFF         DC32     0xffffefff

                  }



GPIO상태 변경 레지스터를 이용해 보면 좀더 빨라지지만 다른 MCU들의 성능 측정 결과와 비교하면 만족할 만한 수준은 아닌것 같다.

2.9Mhz

                   while(1)

                   {

                       PORT0->OMR = (0x00010001UL << 13);

   \                     ??main_1: (+1)

   \   00000038   0x6060             STR      R0,[R4, #+4]

   \   0000003A   0xE7FD             B        ??main_1

   \                     ??main_0:

   \   0000003C   0x40040000         DC32     0x40040000

   \   00000040   0xFFFFEFFF         DC32     0xffffefff

   \   00000044   0x20002000         DC32     0x20002000

                   }


EFM32 성능테스트 - 클럭 설정 및 소비 전류 테스트

 

EFM32 는 Cortex-M3코어의 저전력 기능이 강화된 MCU이다. 저전력을 위해 여러가지 기능들이 많이 있다.

저전력 기능중 가장 큰 부분인 클럭 부분을 살펴 보면 칩내부에 있는 HFRCO, LFRCO 와, 칩외부에서 공급할수 있는 HFXO, LFXO로 나누어 진다.
초기에 리셋되면 디폴트로 내부 28Mhz를 2분주한 14Mhz로 구동이 된다.

 

HFRCO : 1-28 Mhz High Frequency RC Oscillator

LFRCO: 32.768 kHz Low Frequency RC Oscillator


HFXO: 4-32 Mhz High Frequency Crystal Oscillator

LFXO: 32.768 kHz Low Frequency Crystal Oscillator

 

 

 EFM32 클럭 구조

 

 

EFM32 클럭 블록도



 

클럭 설정은 CMU_HFRCOBandSet() 함수를 이용하여 설정 가능하고 1Mhz ~ 28Mhz 로 설정할 수 있다.

typedef enum
{
  /** 1MHz RC band. */
  cmuHFRCOBand_1MHz  = _CMU_HFRCOCTRL_BAND_1MHZ,
  /** 7MHz RC band. */
  cmuHFRCOBand_7MHz  = _CMU_HFRCOCTRL_BAND_7MHZ,
  /** 11MHz RC band. */
  cmuHFRCOBand_11MHz = _CMU_HFRCOCTRL_BAND_11MHZ,
  /** 14MHz RC band. */
  cmuHFRCOBand_14MHz = _CMU_HFRCOCTRL_BAND_14MHZ,
  /** 21MHz RC band. */
  cmuHFRCOBand_21MHz = _CMU_HFRCOCTRL_BAND_21MHZ,
  /** 28MHz RC band. */
  cmuHFRCOBand_28MHz = _CMU_HFRCOCTRL_BAND_28MHZ
} CMU_HFRCOBand_TypeDef;

 

 

CMU_ClockDivSet() 함수로 클럭 분주를 아주 세밀하고 자유롭게 설정할 수 있다.

typedef enum
{
  cmuClkDiv_1     = 0,  /**< Divide clock by 1. */
  cmuClkDiv_2     = 1,  /**< Divide clock by 2. */
  cmuClkDiv_4     = 2,  /**< Divide clock by 4. */
  cmuClkDiv_8     = 3,  /**< Divide clock by 8. */
  cmuClkDiv_16    = 4,  /**< Divide clock by 16. */
  cmuClkDiv_32    = 5,  /**< Divide clock by 32. */
  cmuClkDiv_64    = 6,  /**< Divide clock by 64. */
  cmuClkDiv_128   = 7,  /**< Divide clock by 128. */
  cmuClkDiv_256   = 8,  /**< Divide clock by 256. */
  cmuClkDiv_512   = 9,  /**< Divide clock by 512. */
  cmuClkDiv_1024  = 10, /**< Divide clock by 1024. */
  cmuClkDiv_2048  = 11, /**< Divide clock by 2048. */
  cmuClkDiv_4096  = 12, /**< Divide clock by 4096. */
  cmuClkDiv_8192  = 13, /**< Divide clock by 8192. */
  cmuClkDiv_16384 = 14, /**< Divide clock by 16384. */
  cmuClkDiv_32768 = 15  /**< Divide clock by 32768. */
} CMU_ClkDiv_TypeDef;

 

 

 

 

프로젝트 별로 구동 속도를 쉽게 변경할 수 있도록 config.h 에 정의해 두었다.

// Prescale the HFPERCLK -> HF/4 = 28/1 = 28Mhz
#define _SET_MCU_CLK_()                    CMU_HFRCOBandSet(cmuHFRCOBand_28MHz);\
                                                                   CMU_ClockDivSet(cmuClock_HFPER, cmuClkDiv_1)


 

 


우선 아무 설정 없이 기본 동작 시킨후 GPIO 토글 속도를 측정해 보았다.

14Mhz 구동에서  1.17Mhz 로 측정된다.

 

 

최고 속도인 28Mhz로 구동시 테스트

28Mhz -> 2.35Mhz

 

GPIO토글이 아닌 On/Off 만 했을때 3Mhz 정도 나온다.

이때 소비 전류는 7mA 이다.

 

속도 면으로 보면 동급 클럭의 MCU에 비해 그렇게 빠르지는 않은데 소비 전류는 확실히 적은것 같다.

[참고] MCU속도 측정 결과 

 

클럭을 더 낮추어 1Mhz로 구동시 소비 전류 특정 결과

500uA

 


 

 

 


 

블로그 이미지

nexp

카테고리

분류 전체보기 (1560)
[MyProject] (48)
[TI] (75)
[NXP] (51)
[ST_MICRO] (129)
[FreeScale] (31)
[MSP430] (140)
[Microchip] (131)
Cortex-M (36)
[ATMEL] (29)
[AnalogDevice] (22)
[Embedded] (2)
ARM9 (24)
[AVR] (80)
[DSP] (111)
[8051] (21)
[MCU] (50)
[INTERFACE] (213)
[AppBoard] (23)
[ROBOT] (25)
[MODULE] (129)
[SENSOR] (41)
[DATA] (21)
[FPGA] (32)
[EVB] (1)
[Proramming] (38)
[MyLog] (6)
[IDEA] (0)
[Utility] (19)
[Book] (24)
취미생활 (4)
[Link] (2)