본문 바로가기

[TI]/LM3S8xx

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