Arduino에서 제공하는 GPIO 제어 함수로 GPIO 토글 속도를 측정해 보자
#define LED_PIN1 18
void setup() {
pinMode(LED_PIN1, OUTPUT);
}
void loop() {
digitalWrite(LED_PIN1, 1);
digitalWrite(LED_PIN1, 0);
}
GPIO On/Off 주기는 337ns로 측정이되며 메인루프 수행 시간은 1.8us로 상당히 느리다. (ns 단위여야 하는데..)
ESP32-S2의 레지스터 직접 제어 방식으로 GPIO 토글 속도를 측정해 보자.
#define LED_PIN1 18
void setup() {
pinMode(LED_PIN1, OUTPUT);
}
void loop() {
//digitalWrite(LED_PIN1, 1);
//digitalWrite(LED_PIN1, 0);
GPIO.out_w1ts = (1 << LED_PIN1);
GPIO.out_w1tc = (1 << LED_PIN1);
}
62ns로 빨라 졌다. 루프 수행 속도는 1.4us로 조금 빨라 졌다.
시리얼 포트로 디버깅 메시를 출력 할 수 있도록 시리얼 포트를 초기화 하면 속도는 더 느려진다.
#define LED_PIN1 18
void setup() {
pinMode(LED_PIN1, OUTPUT);
Serial.begin(115200);
Serial.println("ESP32-S2 Arduino GPIO Test");
}
void loop() {
//digitalWrite(LED_PIN1, 1);
//digitalWrite(LED_PIN1, 0);
GPIO.out_w1ts = (1 << LED_PIN1);
GPIO.out_w1tc = (1 << LED_PIN1);
}
시리얼 포트 초기화시 main 함수의 실행 속도가 5us로 더 느려진다.
Arduino IDE 환경에서 테스트는 완료 되었으니 ESP-IDF SDK 개발 환경에서 ESP32-S2 성능을 테스트해 보자.
#define BLINK_GPIO 18
void app_main(void)
{
gpio_reset_pin(BLINK_GPIO);
/* Set the GPIO as a push/pull output */
gpio_set_direction(BLINK_GPIO, GPIO_MODE_OUTPUT);
while(1) {
gpio_set_level(BLINK_GPIO, 1);
gpio_set_level(BLINK_GPIO, 0);
}
}
IDF 제공함수 gpio_set_level() 로 GPIO 토글시 375ns(1.3Mhz) 로 루프 지연없이 출력된다.
레지스터 직접 제어로 구동해 보자
#define BLINK_GPIO 18
void app_main(void)
{
gpio_reset_pin(BLINK_GPIO);
/* Set the GPIO as a push/pull output */
gpio_set_direction(BLINK_GPIO, GPIO_MODE_OUTPUT);
while(1) {
//gpio_set_level(BLINK_GPIO, 1);
//gpio_set_level(BLINK_GPIO, 0);
GPIO.out_w1ts = (1 << BLINK_GPIO);
GPIO.out_w1tc = (1 << BLINK_GPIO);
}
}
레제스터 직접 제어시 62ns(8Mhz) 정도로 측정이 된다. 메인 루프지연 속도는 120ns로 빨라진다.
코어 클럭을 240Mhz로 변경해도 동일하다
# ESP32S2-specific
#
# CONFIG_ESP32S2_DEFAULT_CPU_FREQ_80 is not set
# CONFIG_ESP32S2_DEFAULT_CPU_FREQ_160 is not set
CONFIG_ESP32S2_DEFAULT_CPU_FREQ_240=y
CONFIG_ESP32S2_DEFAULT_CPU_FREQ_MHZ=240
반응형