본문 바로가기

ESPRESSIF/ESP32-S3

[ESP32S3-SM] GPIO 성능 테스트

 

MCU 성능 측정에 있어 GPIO 토글 속도를 측정하는 이유는 FTFLCD 제어 속도 테스트와  같은 GPIO로 제어 하는 주변 장치를 사용할 때  주요 성능 지표가 되기 때문이다.

 

Arduino에서 제공하는 GPIO 제어 함수로 GPIO 토글 속도를 측정해 보자

const int LED1_PIN = 18;

void setup() {
  pinMode(LED1_PIN, OUTPUT);
  
  Serial.begin(115200);
  Serial.println("ESP32-S3 GPIO Test");
}

void loop() {
  digitalWrite(LED1_PIN, 0);
  digitalWrite(LED1_PIN, 1);
}

 

GPIO On/Off 주기는 380ns로 측정이되며 메인루프 수행 시간은 ESP32S2 GPIO토글 속도와 다르게 딜레이 없이 수행되는것 같다.

 

 

 

GPIO제어를 위해 ESP-IDF에서 제공하는 함수 gpio_set_level()를 이용하여 테스트 해 보면

void loop() {
  //digitalWrite(LED1_PIN, 0);
  //digitalWrite(LED1_PIN, 1);
  
  gpio_set_level(GPIO_NUM_18, 0); 
  gpio_set_level(GPIO_NUM_18, 1);
}

 

Arudino 코드와 동일한 결과(느린)가 측정된다.

 

 


ESP32S3의 레지스터 직접 제어 방식으로 GPIO 토글 속도를 측정해 보자.

void loop() {
  //digitalWrite(LED1_PIN, 0);
  //digitalWrite(LED1_PIN, 1);

  //gpio_set_level(GPIO_NUM_18, 0); 
  //gpio_set_level(GPIO_NUM_18, 1);

   GPIO.out_w1ts = (1 << LED1_PIN);
   GPIO.out_w1tc = (1 << LED1_PIN);   
}

 

62ns로 측정이 된다. ESP32S2 GPIO 토글속도 와 동일한 결과가 출력되는것 같다.

 

그리고 Serial 기능을 사용하면 메인루프 지연 속도는 여전히 느려지는 현상이 발생한다.

 


ESP32S2, ESP32S3의 경우  GPIO33 번 부터는 레지스터 제어 방식이 조금 다르기 때문에 정리가 필요 할것 같다.

#define sbi(Port, Value)        (GPIO.out_w1ts = (1<<Value))
#define cbi(Port, Value)        (GPIO.out_w1tc = (1<<Value))

#define sbi1(Port, Value)        GPIO.out1_w1ts.val = ((uint32_t)1 << (Value - 32))
#define cbi1(Port, Value)        GPIO.out1_w1tc.val = ((uint32_t)1 << (Value - 32))

 

 

반응형