/*
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  │  Driving GPIO Pins With RISC-V Instruction Set Architecture  │
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

  ESP-32 Technical Reference Manual
  https://www.espressif.com/sites/default/files/documentation/esp32-c3_technical_reference_manual_en.pdf

  ESP-32 Datasheet
  https://www.espressif.com/sites/default/files/documentation/esp32-c3_datasheet_en.pdf

  RISC-V Instruction Set Manual
  https://riscv.org/wp-content/uploads/2019/12/riscv-spec-20191213.pdf

  RISC-V ISA Reference Manual
  https://risc-v.guru/

*/

#include <esp_timer.h>
#include <rom/ets_sys.h>
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>

#define TRIG_PIN 8
#define ECHO_PIN 9
#define BTN_1_PIN 5
#define BTN_2_PIN 6
#define LED_1_PIN 1
#define LED_2_PIN 3

extern uint8_t uart_rx();
extern int uart_available();
extern void uart_tx(uint8_t data);

extern int gpio_read(int pin);
extern void gpio_enable(int pin);
extern void gpio_write(int pin, int state);

void print_distance() 
{
  gpio_write(TRIG_PIN, 0);
  ets_delay_us(2);
  gpio_write(TRIG_PIN, 1);
  ets_delay_us(10);
  gpio_write(TRIG_PIN, 0);

  while (!gpio_read(ECHO_PIN)){};
  int64_t start = esp_timer_get_time();
  while (gpio_read(ECHO_PIN)){};
  int64_t finish = esp_timer_get_time();
  int64_t duration = finish - start;
  float distance = duration * 0.034 / 2.0;

  char buffer [32];
  snprintf(buffer, 32, "distance: %0.2f\n", distance);
  for (int i = 0; i < strlen(buffer); ++i)
  {
    uart_tx(buffer[i]);
  }
}

void app_main()
{
  gpio_enable(TRIG_PIN);
  gpio_enable(LED_1_PIN);
  gpio_enable(LED_2_PIN);

  const char* msg = "ESP32-C3 RISC-V ISA\n";

  for (int i = 0; i < 21; ++i)
  {
    uart_tx(msg[i]);
  }

  const char* msg2 = "UART Echo and Driving GPIO\n";

  for (int i = 0; i < 27; ++i)
  {
    uart_tx(msg2[i]);
  }

  while(uart_available())
  {
    uart_rx();
  }

  while(1)
  {
    if (gpio_read(BTN_1_PIN))
    {
      print_distance();
      gpio_write(LED_1_PIN, 1);
      vTaskDelay(500 / portTICK_RATE_MS);
      gpio_write(LED_1_PIN, 0);
    }

    if (gpio_read(BTN_2_PIN))
    {
      print_distance();
      gpio_write(LED_2_PIN, 1);
      vTaskDelay(500 / portTICK_RATE_MS);
      gpio_write(LED_2_PIN, 0);
    }

    if (uart_available())
    {
      uart_tx((char)uart_rx());
    }

    vTaskDelay(1 / portTICK_RATE_MS);
  }
}
$abcdeabcde151015202530354045505560fghijfghij
Loading
esp32-c3-devkitm-1