STM32F0 성능 테스트 - STM32CubeMX HAL Code
STM32F0는 Cortex-M0코어 1$이하의 저렴한 MCU로 가격에 민감한 제품에 사용하기 좋은 제품이다.
GPIO On/Off 주기를 측정해 MCU 성능 체크 해 보고 있는데 [STM32F0-SS EVM] 보드를 이용해서 테스트 해 보았다.
우선 최대 클럭 48Mh로 설정하고 STM32CubeMX 기본 초기화 코드 생성하고 PB1 을 토글했다.
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOB_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);
/*Configure GPIO pin : PB1 */
GPIO_InitStruct.Pin = GPIO_PIN_1;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
포트 토글 함수 수행 해 보면 476ns(1Mhz) 정도 측정된다. HAL_Code를 사용하면 좀 느린것 같다.
while (1)
{
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_1);
}
함수를 사용하지 않고 레지스터를 접근해서 포트 토글 해 보면 186ns(2.6Mhz) 정도 측정이 된다.
while (1)
{
GPIOB->ODR ^= GPIO_PIN_1;
}
비트 제어 명령으로 제어 해 보면 40ns(6Mhz) 로 측정된다.
while (1)
{
//HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_1);
GPIOB->BSRR = GPIO_PIN_1;
GPIOB->BRR = GPIO_PIN_1;
}
좀더 보기 편하게 하기위해 Delay를 주었다.
while (1)
{
//HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_1);
GPIOB->BSRR = GPIO_PIN_1;
GPIOB->BRR = GPIO_PIN_1;
HAL_Delay(1);
}
그런데 속도가 40ns에서 60ns 로 느려졌다.
왜 그렇지?
어셈 코드를 확인 해 보니 HAL_Delay() 가 두번 호출 되는듯 한데...
개발환경의 설정 문제인가?
GPIOB->BSRR = GPIO_PIN_1;
80011f4: 2402 movs r4, #2
80011f6: 4d04 ldr r5, [pc, #16] ; (8001208 <main+0xb0>)
80011f8: 61ac str r4, [r5, #24]
HAL_Delay(1);
80011fa: 2001 movs r0, #1
GPIOB->BRR = GPIO_PIN_1;
80011fc: 62ac str r4, [r5, #40] ; 0x28
HAL_Delay(1);
80011fe: f7ff f869 bl 80002d4 <HAL_Delay>
8001202: e7f9 b.n 80011f8 <main+0xa0>
HAL_Delay를 위쪽에 넣으니 어셈코드도 정상적으로 나오고 속도도 40ns로 측정이 된다.
while (1)
{
//HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_1);
HAL_Delay(1);
GPIOB->BSRR = GPIO_PIN_1;
GPIOB->BRR = GPIO_PIN_1;
}
HAL_Delay(1);
80011f8: 2001 movs r0, #1
80011fa: f7ff f86b bl 80002d4 <HAL_Delay>
GPIOB->BSRR = GPIO_PIN_1;
80011fe: 61ac str r4, [r5, #24]
GPIOB->BRR = GPIO_PIN_1;
8001200: 62ac str r4, [r5, #40] ; 0x28
8001202: e7f9 b.n 80011f8 <main+0xa0>
반응형