/*
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
│ 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);
}
}
Loading
esp32-c3-devkitm-1
esp32-c3-devkitm-1