[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 로 측정된다.

 

 



참고로 오버클럭킹 해봤다.
PLL을 기본(9, 8Mhz x 16 = 128Mhz)으로 설정후 GPIO토글링
    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_16);
GPIO 토글 주기 -> 85ns, 5.8Mhz

void RCC_Configuration(void)
{
  /* RCC system reset(for debug purpose) */
  RCC_DeInit();

  /* Enable HSE */
  RCC_HSEConfig(RCC_HSE_ON);

  /* Wait till HSE is ready */
  HSEStartUpStatus = RCC_WaitForHSEStartUp();

  if (HSEStartUpStatus == SUCCESS)
  {
    /* Enable Prefetch Buffer */
    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

    /* Flash 2 wait state */
    FLASH_SetLatency(FLASH_Latency_2);
//    FLASH_SetLatency(FLASH_Latency_1);   

    /* HCLK = SYSCLK */
    RCC_HCLKConfig(RCC_SYSCLK_Div1);

    /* PCLK2 = HCLK */
    RCC_PCLK2Config(RCC_HCLK_Div1);

    /* PCLK1 = HCLK/4 */
    RCC_PCLK1Config(RCC_HCLK_Div4);

    /* PLLCLK = 8MHz * 9 = 72 MHz */
    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_16);
    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);

    /* Enable PLL */
    RCC_PLLCmd(ENABLE);

    /* Wait till PLL is ready */
    while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
    {}

    /* Select PLL as system clock source */
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

    /* Wait till PLL is used as system clock source */
    while (RCC_GetSYSCLKSource() != 0x08)
    {}
  } 
}


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

댓글을 달아 주세요

ARM9/STR92008. 4. 27. 01:56

STR911 GPIO 토글링 속도 측정

STR911 GPIO 토글링 속도 측정

while(1)
{
   GPIO2->DR[0x3FC] ^= 0xFF;
}


기본 예제로 클럭 설정시 25Mhz에서
  SCU_MCLKSourceConfig(SCU_MCLK_OSC);         /*Use OSC as the default clock source*/
  SCU_PCLKDivisorConfig(SCU_PCLK_Div1);      /* ARM Peripheral bus clokdivisor = 1*/
대략 600kHz 정도 출력된다.

PLL 클럭으로 설정시
  SCU_MCLKSourceConfig(SCU_MCLK_PLL);    /*Use OSC as the default clock source*/
  SCU_PCLKDivisorConfig(SCU_PCLK_Div1); /* ARM Peripheral bus clokdivisor = 1*/
  SCU_PLLCmd  (ENABLE);
1.85Mhz, 280ns 정도 나온다.

이건... AVR수준인데... [다른 MCU속도 측정 결과]
클럭 설정에 대한 매뉴얼을 더 읽어봐야 할것 같지만 아무래도 PLL설정에 문제가 있는것 같고 GPIO를 위해 포인터 접근하는 부분도 문제가 있을것 같다...

추후 테스트 하는대로 정리 하도록->
코드를 살펴보니 어셈블 되었을때 4개의 명령어로 처리된다. 그래도 이정도 속도는 아닌데... PLL설정 부분을 확인하는것이 필요하다.

     67            while(1)
     68            {
     69            GPIO2->DR[0x3FC] ^= 0xFF;
   \                     ??main_1:
   \   0000006C   FC03D4E5           LDRB     R0,[R4, #+1020]
   \   00000070   FF0020E2           EOR      R0,R0,#0xFF
   \   00000074   FC03C4E5           STRB     R0,[R4, #+1020]
   \   00000078   FBFFFFEA           B        ??main_1
   \                     ??main_0:
   \   0000007C   ........           DC32     GPIO_InitStructure
     70            }


Posted by nexp

댓글을 달아 주세요

[Microchip]/dsPIC33-SM2008. 3. 12. 00:30

dsPIC33 속도 테스트 - LED 토글 테스트

dsPIC33 속도 테스트 - LED 토글 테스트


LED토글링으로 dsPIC33 속도 측정을 했다.
여러가지 테스트를 해서 결론적으로 LED 속도는 56ns/6.6Mhz 이 출력된다.

[다른 MCU속도 측정 결과] 에 비교하면 상당히 빠르다..

dsPIC33 속도 테스트를 위해 아래와 같이 LED토글 하는 코드를 작성했다.
#define LED1_BIT   BIT0
#define LED1_PORT   PORTB
#define Led1Init()   _TRISB7 = 0

#define Led1Toggle()  _RB7 ^= 1

main()
{
  :
 while(1)
 {
   Led1Toggle();
 }

LED토글 속도 측정 결과 330ns/14Mhz 가 측정된다. 40MIP라기에는 너무 느리다.

어샘블 코드를 들여다보자
헉! 옵티마이즈 문제인가?
Level-s 면 나쁘지 않은데... 이런 무식한 컴파일러를 봤나~
Level-s 330ns

26:                 while(1)
27:                 {
28:                  Led1Toggle();
 0028C  BFC2C2     mov.b 0x02c2,0x0000
 0028E  FB8000     ze 0x0000,0x0000
 00290  DE0047     lsr 0x0000,#7,0x0000
 00292  A20400     btg 0x0000,#0
 00294  DD0047     sl 0x0000,#7,0x0000
 00296  202C21     mov.w #0x2c2,0x0002
 00298  784091     mov.b [0x0002],0x0002
 0029A  A17401     bclr 0x0002,#7
 0029C  70C080     ior.b 0x0002,0x0000,0x0002
 0029E  780001     mov.w 0x0002,0x0000
 002A0  B7E2C2     mov.b 0x0000,0x02c2
 002A2  37FFF4     bra 0x00028c

옵티마이즈 옵션을 Level-0으로 변경하고 컴파일 해보자



Level - 0

25:                 
26:                 while(1)
27:                 {
28:                  Led1Toggle();
 0028E  BFC2C2     mov.b 0x02c2,0x0000
 00290  FB8000     ze 0x0000,0x0000
 00292  DE0047     lsr 0x0000,#7,0x0000
 00294  A20400     btg 0x0000,#0
 00296  604061     and.b 0x0000,#1,0x0000
 00298  DD00C7     sl 0x0000,#7,0x0002
 0029A  BFC2C2     mov.b 0x02c2,0x0000
 0029C  A17400     bclr 0x0000,#7
 0029E  704001     ior.b 0x0000,0x0002,0x0000
 002A0  B7E2C2     mov.b 0x0000,0x02c2
29:                 }
 002A2  37FFF5     bra 0x00028e

그닥 줄여지지 않는다. 토글 속도는 280ns/1.6Mhz가 나온다. 뭔가 이상하다.
Levle3은 더 과관이다.  아무리 컴파일러가 이상해도 뭔가 이상하다...
Level3 - 630ns, 7.70khz

26:                 while(1)
27:                 {
28:                  Led1Toggle();
 0028C  BFC2C2     mov.b 0x02c2,0x0000
 0028E  FB8000     ze 0x0000,0x0000
 00290  DE0047     lsr 0x0000,#7,0x0000
 00292  A20400     btg 0x0000,#0
 00294  DD0047     sl 0x0000,#7,0x0000
 00296  202C21     mov.w #0x2c2,0x0002
 00298  784091     mov.b [0x0002],0x0002
 0029A  A17401     bclr 0x0002,#7
 0029C  70C080     ior.b 0x0002,0x0000,0x0002
 0029E  780001     mov.w 0x0002,0x0000
 002A0  B7E2C2     mov.b 0x0000,0x02c2
 002A2  BFC2C2     mov.b 0x02c2,0x0000
 002A4  FB8000     ze 0x0000,0x0000
 002A6  DE0047     lsr 0x0000,#7,0x0000
 002A8  A20400     btg 0x0000,#0
 002AA  DD0047     sl 0x0000,#7,0x0000
 002AC  202C21     mov.w #0x2c2,0x0002
 002AE  784091     mov.b [0x0002],0x0002
 002B0  A17401     bclr 0x0002,#7
 002B2  70C080     ior.b 0x0002,0x0000,0x0002
 002B4  780001     mov.w 0x0002,0x0000
 002B6  B7E2C2     mov.b 0x0000,0x02c2
 002B8  37FFE9     bra 0x00028c


자세히 들여다 보니 문제는 PORT를 포인터로 접근하는것에 문제가 있는것 같다. 똑똑하지 않는 컴파일러인건지.. 옵티마이즈가 안되는건지?
아무튼 이제 정상적으로 동작하는것 같다.

#define LED1_BIT   BIT0
#define LED1_PORT   LATA
#define Led1Init()   _TRISB0 = 0

#define Led1Toggle()  Tbi(LED1_PORT, LED1_BIT)


26:                 while(1)
27:                 {
28:                  Led1Toggle();
 002CC  AAE2C4    btg.b 0x02c4,#7
 002CE  37FFFE     bra 0x0002cc


코드 수정후에 LED 속도는 56ns/6.6Mhz 나온다.
Posted by nexp

댓글을 달아 주세요