ESP32-S3-WROOM-1 GPIO stays high for an extended period

mikedawes
Posts: 2
Joined: Fri Jan 13, 2023 3:50 am

ESP32-S3-WROOM-1 GPIO stays high for an extended period

Postby mikedawes » Fri Jan 13, 2023 4:17 am

Seeing odd behavior when rapidly toggling a GPIO on the ESP32-S3-WROOM-1. There appears to be a very repeatable period where the GPIO is high for an extended period of time. The scope is configured to trigger on any pulse longer than 1uS. The code is based on the Hello World example with no changes to sdkconfig and just spins a tight loop.
Has anyone else experienced this?
SDS00006.png
SDS00006.png (22.3 KiB) Viewed 864 times
  1. /* Hello World Example
  2.  
  3.    This example code is in the Public Domain (or CC0 licensed, at your option.)
  4.  
  5.    Unless required by applicable law or agreed to in writing, this
  6.    software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
  7.    CONDITIONS OF ANY KIND, either express or implied.
  8. */
  9. #include <stdio.h>
  10. #include "sdkconfig.h"
  11. #include "freertos/FreeRTOS.h"
  12. #include "freertos/task.h"
  13. #include "esp_system.h"
  14. #include "esp_spi_flash.h"
  15. #include <driver/gpio.h>
  16.  
  17. /* Private defines -----------------------------------------------------------*/
  18. #define CNVST_PIN             14      /* Conversion start control. */
  19.  
  20. /* Function Definitions ------------------------------------------------------*/
  21. void IRAM_ATTR hw_gpio_toggle(void)
  22. {
  23.     uint32_t reg_val = (1ULL << CNVST_PIN);
  24.  
  25.     do {
  26.  
  27.         REG_WRITE(GPIO_OUT_W1TS_REG, reg_val);
  28.  
  29.         REG_WRITE(GPIO_OUT_W1TC_REG, reg_val);
  30.  
  31.     } while (1);
  32. }
  33.  
  34. static void hw_gpio_init(void)
  35. {
  36.     gpio_config_t io_conf = {};
  37.     uint32_t reg_val;
  38.  
  39.     /* Configure GPIO pin output level - LOW */
  40.     reg_val = (1ULL << CNVST_PIN);
  41.     REG_WRITE(GPIO_OUT_W1TC_REG, reg_val);
  42.  
  43.     io_conf.intr_type = GPIO_INTR_DISABLE;
  44.     io_conf.mode = GPIO_MODE_OUTPUT;
  45.     io_conf.pin_bit_mask = (1ULL << CNVST_PIN);
  46.     io_conf.pull_down_en = 1;
  47.     io_conf.pull_up_en = 0;
  48.     ESP_ERROR_CHECK(gpio_config(&io_conf));
  49. }
  50.  
  51. void app_main(void)
  52. {
  53.     uint16_t recvbuf;
  54.  
  55.     printf("Hello world!\n");
  56.  
  57.     /* Print chip information */
  58.     esp_chip_info_t chip_info;
  59.     esp_chip_info(&chip_info);
  60.     printf("This is %s chip with %d CPU core(s), WiFi%s%s, ",
  61.             CONFIG_IDF_TARGET,
  62.             chip_info.cores,
  63.             (chip_info.features & CHIP_FEATURE_BT) ? "/BT" : "",
  64.             (chip_info.features & CHIP_FEATURE_BLE) ? "/BLE" : "");
  65.  
  66.     printf("silicon revision %d, ", chip_info.revision);
  67.  
  68.     printf("%dMB %s flash\n", spi_flash_get_chip_size() / (1024 * 1024),
  69.             (chip_info.features & CHIP_FEATURE_EMB_FLASH) ? "embedded" : "external");
  70.  
  71.     printf("Minimum free heap size: %d bytes\n", esp_get_minimum_free_heap_size());
  72.  
  73.     hw_gpio_init();
  74.  
  75.     for (;;) {
  76.  
  77.         hw_gpio_toggle();
  78.  
  79.     }
  80. }

mikedawes
Posts: 2
Joined: Fri Jan 13, 2023 3:50 am

Re: ESP32-S3-WROOM-1 GPIO stays high for an extended period

Postby mikedawes » Sat Jan 14, 2023 3:58 pm

Root causing this myself -- too much coffee and not enough sleep. The behavior I observed was a preemptive context switch while the GPIO was set high.

Who is online

Users browsing this forum: No registered users and 61 guests