본문 바로가기

[ST_MICRO]/STM32F0x

STM32F0 성능 테스트 - STM32CubeMX HAL Code


STM32F0 성능 테스트 - STM32CubeMX HAL Code




STM32F0는 Cortex-M0코어 1$이하의 저렴한 MCU로 가격에 민감한 제품에 사용하기 좋은 제품이다.

GPIO On/Off 주기를 측정해 MCU 성능 체크 해 보고 있는데 [STM32F0-SS EVM] 보드를 이용해서 테스트 해 보았다.


[참고]STM32 MCU 성능 측정 테스트



우선 최대 클럭 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>