Obsługa portów I/O
Porty I/O, czyli porty wejścia/wyjścia, są najwdzięczniejszym interfejsem, ponieważ pozwalają w prosty sposób przetestować związany z nimi fragment oprogramowania. Wystarczy do wybranego portu podłączyć poprzez opornik zwykłą diodę LED, a jej świecenie będzie sygnalizować stan danego wyprowadzenia. Na niektórych płytach rozwojowych z ESP32 producenci zamontowali już tzw. LED-y użytkownika, doskonale nadające się do eksperymentów. W takim przypadku wystarczy jedynie odszukać w dokumentacji płytki numer portu I/O, do którego taka dioda jest podłączona.
Stworzenie programu testowego rozpoczynamy od uruchomienia edytora ze środowiskiem ESP-IDF. W opisie domyślnie będzie to edytor oparty na Eclipse, ESP-IDF v.4.4.
Klikamy File → New → Espressif IDF Project. Jeżeli zaznaczymy „Create a project using one of the templates”, będzie można otworzyć któryś z gotowych przykładów. Tym razem jednak stworzymy program od podstaw. W polu „Project name” należy wpisać nazwę tworzonego programu. W przykładzie użyję nazwy test-io-esp32-s3. Na liście „Select project target:” trzeba wybrać wariant procesora zamontowanego na używanej płycie rozwojowej, w omawianym przykładzie będzie to ESP32-S3. Po kliknięciu Finish zostanie utworzony projekt z plikiem main.c i pozostałymi plikami potrzebnymi w strukturze projektu.
Ewentualne komunikaty o błędach w wygenerowanym projekcie znikną po przeprowadzeniu kompilacji w tym celu należy wybrać Project → Build Project lub nacisnąć ikonę młotka na pasku skrótów (patrz rysunek 1, oznaczenie strzałką nr 1). Teraz w pliku main.c – na miejsce automatycznie utworzonego kodu – proszę wpisać ten z listingu 1. W linii #define BLINK_GPIO podajemy numer portu I/O, do którego podłączona jest dioda LED. Należy wykonać powtórną kompilację i usunąć ewentualne błędy powstałe przy wpisywaniu kodu z listingu 1. Następnie podłączamy płytkę ewaluacyjną kablem do gniazda USB. W kolejnym kroku za pomocą narzędzi systemowych odczytujemy przydzielony podłączonej płycie numer portu. W edytorze należy kliknąć edycję listy Launch Target i w polu listy rozwijanej Serial Port: (rysunek 1, strzałka nr 3) ustawić numer portu. Po naciśnięciu przycisku Launch (rysunek 1, strzałka nr 2) płyta powinna zostać zaprogramowana, a dioda zacznie migotać z częstotliwością 1 Hz.
Działanie programu oparto na najprostszym sposobie sterowania portem I/O. W funkcji configure_led(void) port został ustawiony jako wyjściowy, a funkcja blink_led(void) zmienia poziom na wyjściu, do którego podłączona została dioda LED.
W celu przetestowania I/O pracującego w trybie wejścia należy wybrać drugi dostępny port na płycie rozwojowej. Ponieważ w czasie testu będzie on zwierany do masy, najlepiej wybrać taki, który nie ma przypisanej dodatkowej ważnej funkcji systemowej – czyli np. port o numeracji wyższej niż 17. Ponadto trzeba wprowadzić zmiany widoczne na listingu 2. Polegają one na zdefiniowaniu wybranego drugiego portu jako SW_GPIO, dodaniu funkcji ustawienia go jako wejściowego configure_sw(void) i modyfikacji funkcji main(). Po przesłaniu nowej wersji oprogramowania na płytę rozwojową i zwarciu do masy portu SW_GPIO, częstotliwość migotania diody LED zwiększa się do około 5 Hz.
#include <unistd.h>
#include <stdio.h>
#include "driver/gpio.h"
#include "esp_log.h"
#include "sdkconfig.h"
static const char *TAG = "example";
/* wstaw w tej linii numer GPIO do którego
* jest podłączona dioda LED
*/
#define BLINK_GPIO 21
static uint8_t led_stan = 0;
static void configure_led(void)
{
ESP_LOGI(TAG, "Przykład konfiguracji wyjścia GPIO LED!");
gpio_reset_pin(BLINK_GPIO);
/* Ustaw tryb pracy GPIO jako push/pull output */
gpio_set_direction(BLINK_GPIO, GPIO_MODE_OUTPUT);
}
static void blink_led(void)
{
/* Set the GPIO level according to the state (LOW or HIGH)*/
gpio_set_level(BLINK_GPIO, led_stan);
led_stan =!led_stan;
}
void app_main(void)
{
ESP_LOGI(TAG, "Cześć tu program testowy GPIO LED!");
configure_led();
while (true) {
ESP_LOGI(TAG, "Stan LED=%s!", led_stan == true ? "ON" : "OFF");
blink_led();
sleep(1);
}
}
Listing 1. Program umożliwiający najprostsze miganie diodą LED
Makra ESP_LOGI i ESP_LOGE powodują wysłanie odpowiednich komunikatów do terminalu wywoływanego z pulpitu edytora (rysunek 1, strzałka nr 4). Po naciśnięciu ikony terminalu wyświetla się tablica, na której w polu „Project Name:” trzeba ustawić nazwę projektu, a w polu „Serial port:” wybrać numer przydzielonego płycie portu. Po zatwierdzeniu powinna otworzyć się zakładka terminalu odbierającego komunikaty wysyłane przez nasze oprogramowanie. Takie zastosowanie terminalu pozwala na proste debugowanie programu.
W przykładzie pokazano najprostszy sposób sterowania portami I/O. API środowiska ESP-IDF umożliwia bardziej zaawansowane manipulacje, np. dołączanie wewnętrznych oporników podciągających, współpracę z systemem przerwań, zatrzaskiwanie ustawień portu nawet na czas resetu czy grupowe ustawianie parametrów wielu portów jednocześnie. Szczegółowy opis odpowiedni dla wersji IDF-4.4 można znaleźć w [1].