[AVR]/Mega82009. 9. 16. 20:41

ATMega168 을 이용한 오버클럭 속도 측정

ATMega168 을 이용한 오버클럭 속도 측정



ATMega168 을 이용해서 GPIO 토글속도를 측정 했다. Mega168는 20Mhz까지 구동 가능하므로 24Mhz에서 측정해 보았다.
24Mhz -> 209ns/2.4Mhz

[다른 MCU속도 측정 결과]와 비교 하면 저렴한 Mega168에서 상당히 빠른것 같다.

ATMega168 GPIO속도 측정 소스코드
#define Led1Toggle()              Tbi(LED1_PORT, LED1_BIT)   //PORTB ^= BIT1

int main(void)
{
 SystemInit();

 Led1Init();
 Led1On();

 while (1)
 {
  Led1Toggle();
  //Delay(100);
 }  
}


WinAVR(AVR Gcc) 옵티마이즈 옵션



컴파일러의 어샘블 결과는 아래와 같다. 5 머쉰사이클 정도 나온다.
Level-s 209ns/2.4Mhz
 while (1)
 {
  Led1Toggle();
  88: 92 e0        ldi r25, 0x02 ; 2
  8a: 85 b1        in r24, 0x05 ; 5
  8c: 89 27        eor r24, r25
  8e: 85 b9        out 0x05, r24 ; 5
  90: fc cf        rjmp .-8       ; 0x8a <main+0xa>

Level-0 500ns/1Mhz
  while (1)
 {
  Led1Toggle();
  a8: a5 e2        ldi r26, 0x25 ; 37
  aa: b0 e0        ldi r27, 0x00 ; 0
  ac: e5 e2        ldi r30, 0x25 ; 37
  ae: f0 e0        ldi r31, 0x00 ; 0
  b0: 90 81        ld r25, Z
  b2: 82 e0        ldi r24, 0x02 ; 2
  b4: 89 27        eor r24, r25
  b6: 8c 93        st X, r24
  b8: f7 cf        rjmp .-18      ; 0xa8 <main+0x28>
Posted by nexp

댓글을 달아 주세요

[MSP430]/MSP430F20132009. 3. 11. 17:02

[MSP430F2013 EVM] 클럭 시스템 및 속도 측정

MSP430 GPIO 토글 해서 클럭 설정에 따른 CPU속도를 측정했다.

프로그램 코드
while(1)
{
    P1OUT ^=  LED1_BIT;
}

ASM코드



측정 결과
1Mhz DCO : 6us

8Mhz DCO: 740ns 665Khz

16Mhz DCO : 360ns 1.4Mhz
(AVR속도 측정 참고)

클럭 설정부분 코드 수정

//Set range :1, 8, 12, 16Mhz
#if (__SYS_CLK__ == SYS_CLK_1MHZ)
 #define CALBC1_FREQ     CALBC1_1MHZ
 #define CALDC0_FREQ     CALDCO_1MHZ
#elif (__SYS_CLK__ == SYS_CLK_8MHZ)
 #define CALBC1_FREQ     CALBC1_8MHZ
 #define CALDC0_FREQ     CALDCO_8MHZ 
#elif (__SYS_CLK__ == SYS_AVR_CLK_12MHZ)
 #define CALBC1_FREQ     CALBC1_12MHZ
 #define CALDC0_FREQ     CALDCO_12MHZ 
#elif (__SYS_CLK__ == SYS_AVR_CLK_16MHZ)
 #define CALBC1_FREQ     CALBC1_16MHZ
 #define CALDC0_FREQ     CALDCO_16MHZ 
#endif
void SystemInit(void)
{
    WDTCTL = WDTPW + WDTHOLD;            // Stop watchdog

    #if __SYS_CLK__
    if (CALBC1_FREQ ==0xFF || CALDC0_FREQ == 0xFF)
    { 
        while(1);    // If calibration constants erased
                     // do not load, trap CPU!!
    }  

    // Set DCO
    BCSCTL1 = CALBC1_FREQ; 
    DCOCTL = CALDC0_FREQ;
    #endif
}


MSP430의 동작 클럭을 보려면 P2.1의 SMCLK핀으로 출력하여 볼수 있다.(물론 SMCLK출력을 하려면 P2SEL비트를 세트해야 한다.)
시스템 클럭을 16Mhz로 설정해도 최대 GPIO toggle 클럭은 MCLK/10 이다. 페리가 느린건지...? 데이터시트에는 없는데 문서를 좀더 찾아볼 필요가 있다.

void main(void)
{
    SystemInit();
   
    Led1Init();
    Led1On();

    Sbi(P2DIR, BIT1);
    Sbi(P2SEL, BIT1);                         // P2.1 = SMCLK
 
    while(1)
    {
        Led1Toggle();
    }
Posted by nexp

댓글을 달아 주세요

[ST_MICRO]/STM322008. 12. 20. 10:00

[STM32-64 EVM] ST Cortex-M3 GPIO속도 테스트

[STM32-EVM] ST Cortex-M3 GPIO속도 테스트

사용자 삽입 이미지


RCC_Configuration() 함수에서 PLL을 기본(9, 8Mhz x 9 = 72Mhz)으로 설정후 GPIO토글링
    /* PLLCLK = 8MHz * 9 = 72 MHz */
    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
GPIO토글 주기 ->152ns, 3.27Mhz

비트 제어 레지스터로 설정했을때 ->  12Mhz가 나온다.

[다른 MCU속도 측정 결과] 에 비교하면 플래시에서 실행 하고도 상당히 빠른편이다.

플래시 Latency를 1로 줄이면 75ns까지 가능하다.
-> FLASH_SetLatency(FLASH_Latency_1);   


테스트 프로그램
#define PORTA       GPIOA->ODR

int main(void)
{
    //System Init
    SystemInit();

    //LED Init
    Led1Init();
    Led1On();
    Led2Init();   
 
 while (1)
 {
     PORTA ^= BIT15;
 }
}

     28           while (1)
     29           {
     30            PORTA ^= BIT15;
   \   0000003C   C868               LDR      R0,[R1, #+12]
   \   0000003E   80F40040           EOR      R0,R0,#0x8000
   \   00000042   FAE7               B.N      ??main_1
   \                     ??main_0:
   \   00000044   00043000           DC32     0x300400
   \   00000048   ........           DC32     GPIO_InitStructure
   \   0000004C   00080140           DC32     0x40010800
     31           }



비트 토글 했을때 -> 3.27Mhz


 while (1)
 {
  PORTA |= BIT15;
  PORTA &= ~BIT15;  
 }

 

     28           while (1)
     29           {
     30            PORTA |= BIT15;
   \   0000003C   D168               LDR      R1,[R2, #+12]
   \   0000003E   41F40041           ORR      R1,R1,#0x8000
   \   00000042   D160               STR      R1,[R2, #+12]
     31            PORTA &= ~BIT15;  
   \   00000044   D168               LDR      R1,[R2, #+12]
   \   00000046   0140               ANDS     R1,R0,R1
   \   00000048   F7E7               B.N      ??main_1
   \   0000004A   00BF               Nop     
   \                     ??main_0:
   \   0000004C   00043000           DC32     0x300400
   \   00000050   ........           DC32     GPIO_InitStructure
   \   00000054   00080140           DC32     0x40010800
     32           }



Cortex-M3에서 장점이라 내세우는 비트 제어 방식으로 해 보니 12Mhz가 나온다.


 while (1)
 {
  GPIOA->BSRR = BIT0;
  GPIOA->BRR = BIT0;
 }

ASM코드: STR 두개와 BN명령어만 들어가고 있다.


     28           while (1)
     29           {
     30            GPIOA->BSRR = BIT0;
   \                     ??main_1:
   \   00000040   0161               STR      R1,[R0, #+16]
     31            GPIOA->BRR = BIT0;
   \   00000042   4161               STR      R1,[R0, #+20]
   \   00000044   FCE7               B.N      ??main_1
   \   00000046   00BF               Nop     
   \                     ??main_0:
   \   00000048   00043000           DC32     0x300400
   \   0000004C   ........           DC32     GPIO_InitStructure
   \   00000050   00080140           DC32     0x40010800
     32           }




결론적으로 STM32의 순수 GPIO On/Off  타임은 28ns 로 측정된다.

 

 





Posted by nexp

댓글을 달아 주세요

[TI]/LM3S8xx2008. 12. 4. 12:40

Luminary Micro LM3S608 GPIO Toggle 속도 테스트

Luminary Micro LM3S608 GPIO Toggle 속도 테스트



외부 8Mhz 입력하여 PLL/4 = 50Mhz로 구동시 GPIO Toggle 속도는 240ns(2Mhz)정도 측정된다.  옵티마이즈 했을때 180ns(2.5Mhz)단순 페리속도 비교는 좀 그렇지만 AVR과 속도비교(16Mh에서 360ns(1.6Mhz))하면 조금 빠르다. 50Mhz 시스템 클럭인데도 페리가 이리 느린지? 좀더 알아볼 필요가 있다.

DSP28335와 GPIO Toggle 속도( 60ns(15Mhz) 비교하면 쫌....

그리고 같은 [Cortex-M3 STM32 속도] 에 비교하면 좀 더 느린것 같다.


    //-------------------------------------------------
    //Set the system clock to run at 50MHz from the PLL.
    SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN |SYSCTL_XTAL_8MHZ);

   

    //GPIO  Init
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);
    Sbi(GPIO_PORTD_DIR_R, BIT0);
    Sbi(GPIO_PORTD_DEN_R, BIT0);
   
    while(1)
    {
        //GPIO Toggle
        GPIO_PORTD_DATA_R ^= BIT0;
    }




옵티마이즈 옵션을 바꾸니 코드가 좀더 간결해 진다.

     24           while(1)
     25           {
     26                  GPIO_PORTE_DATA_R ^= BIT0;  
   \                     ??main_1:
   \   00000052   0548               LDR.N    R0,??main_0+0x8  ;; 0x400243fc
   \   00000054   0068               LDR      R0,[R0, #+0]
   \   00000056   90F00100           EORS     R0,R0,#0x1
   \   0000005A   0349               LDR.N    R1,??main_0+0x8  ;; 0x400243fc
   \   0000005C   0860               STR      R0,[R1, #+0]
   \   0000005E   F8E7               B.N      ??main_1
   \                     ??main_0:
   

   
옵티마이스 사용시 180n/2.5Mhz
     24           while(1)
     25           {
     26                  GPIO_PORTE_DATA_R ^= BIT0;  
   \   00000050   3068               LDR      R0,[R6, #+0]
   \   00000052   80F00100           EOR      R0,R0,#0x1
   \   00000056   FAE7               B.N      ??main_1
   \                     ??main_0:


하지만 그래도 뭔가 원하는 속도가 나오지 않는다.
클럭을 오버 클럭 해보자
SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHZ);

코드 수정하니 130ns/3.4Mhz 까지 출력된다.


비트제어 레지스터로 테스트 해 보니 8.5Mhz까지 나오지만 그래도 STM32보다는 느리다.
#define GPIOC                       GPIO_PORTC_BASE
#define sbi(Port, Bit)              HWREG(Port + (GPIO_O_DATA + (Bit << 2))) = Bit
#define cbi(Port, Bit)              HWREG(Port + (GPIO_O_DATA + (Bit << 2))) = 0

 while(1)
 {
        sbi(GPIOC, GPIO_PIN_6);
        cbi(GPIOC, GPIO_PIN_6);        
 }

     21           while(1)
     22           {
     24                  sbi(GPIOC, GPIO_PIN_6);
   \                     ??main_1:
   \   00000062   4021               MOVS     R1,#+64
   \   00000064   0160               STR      R1,[R0, #+0]
     25                  cbi(GPIOC, GPIO_PIN_6);       
   \   00000066   0021               MOVS     R1,#+0
   \   00000068   0160               STR      R1,[R0, #+0]
   \   0000006A   FAE7               B.N      ??main_1
   \                     ??main_0:
   \   0000006C   04000020           DC32     0x20000004
   \   00000070   00600040           DC32     0x40006000
   \   00000074   00610040           DC32     0x40006100
     28           }


참고로 Luminary에서 제공하는 함수를 이용하면 2.5Mhz 밖에 나오지 않는다.
     16           while(1)
     17           {
     21                  GPIOPinWrite(GPIO_PORTC_BASE, GPIO_PIN_6, GPIO_PIN_6);
   \                     ??main_1:
   \   00000050   4022               MOVS     R2,#+64
   \   00000052   4021               MOVS     R1,#+64
   \   00000054   2800               MOVS     R0,R5
   \   00000056   ........           BL       GPIOPinWrite
     22                  GPIOPinWrite(GPIO_PORTC_BASE, GPIO_PIN_6, 0);
   \   0000005A   0022               MOVS     R2,#+0
   \   0000005C   4021               MOVS     R1,#+64
   \   0000005E   2800               MOVS     R0,R5
   \   00000060   ........           BL       GPIOPinWrite
   \   00000064   F4E7               B.N      ??main_1
   \   00000066   00BF               Nop     
   \                     ??main_0:
   \   00000068   04000020           DC32     0x20000004
   \   0000006C   00600040           DC32     0x40006000
   \   00000070   FC630040           DC32     0x400063fc
     23           }


SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | SYSCTL_XTAL_8MHZ);
-> 400k


Posted by nexp

댓글을 달아 주세요

[DSP]/DSP283352008. 5. 24. 23:59

[DSP28335 EVM] GPIO 속도 테스트

[DSP28335 EVM] GPIO 속도 테스트

사용자 삽입 이미지

TMS320F28335 를 이요한 GPIO Toggle테스트를 해봤다. DSP의 속도가 GPIO와는 큰 상관은 없지만 새로운 MCU에서는 기본적으로 테스트 해보는 사항이라..

GPATOGGLE 레시스터를 이용하여 토글 했을때 토글링 속도가 15Mhz(60n) 정도 나온다. 멋지군! 물론 플로팅 연산을 했을경우 더 위력을 발휘하겠지만....

   for(;;)
   {   
      GpioDataRegs.GPATOGGLE.all =0xFFFFFFFF;
    }


[참고] MCU속도 측정 결과 

Posted by nexp

댓글을 달아 주세요