[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 }
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 }
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 로 측정된다.
반응형