본문 바로가기

[ST_MICRO]/STM32F1

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

 

 





반응형