Xin giới thiệu với các bạn cách tạo môi trường để lập trình cho ESP32 dùng FreeRTOS trên Ubuntu.
Chuẩn bị
Trước khi bắt đầu thì mình cần có một số đồ nghề sau:
- ESP32, mình dùng kit NodeMCU ESP32
- Dây cáp.
- Máy tính xài hệ điều hành Ubuntu
Cài đặt
Như thông thường với lập trình STM32 thì ta dùng Keil C hoặc IAR để lập trình, với ESP8266/ESP32 đều có thể cài thông qua 1 số bước cơ bản với Arduino, nay mình thử sang cái khó hơn xíu để xem coi code không dùng Arduino thì sẽ phải làm thế nào, dưới đây là các bước để bạn có thể cấu hình toolchain(nôm na là gọi là môi trường để build và nạp code) cho ESP32
Cài các tool cần thiết
$ sudo apt-get install git wget make libncurses-dev flex bison gperf python python-serial
Cài đặt pip và cập nhật pyserial
$ sudo apt-get update
$ sudo apt-get -y install python-pip
$ sudo pip install pyserial --upgrade
Tải file binary Toolchain cho ESP32
Bản ESP32 toolchain cho Linux bạn có thể tải từ trang chủ của Espressif sau đó giải nén ra, hoặc có thể chạy bằng lệnh sau để tải và giải nén vào thư mục $HOME/esp32
$ mkdir -p $HOME/esp32
$ cd $HOME/esp32
$ wget https://dl.espressif.com/dl/xtensa-esp32-elf-linux64-1.22.0-61-gab8375a-5.2.0.tar.gz
$ tar -xzf xtensa-esp32-elf-linux64-1.22.0-61-gab8375a-5.2.0.tar.gz
$ export PATH=$PATH:$HOME/esp32/xtensa-esp32-elf/bin
$ echo "export PATH=\$PATH:$HOME/esp32/xtensa-esp32-elf/bin" >> ~/.bashrc
Tải ESP-IDF từ Github
Sử dụng git để clone ESP-IDF, repo này sẽ bao gồm các thư viện, các API cũng như các ví dụ mẫu cho ESP32, bạn có thể thấy nó giống như thư viện chuẩn Std của STM32 đấy. Repo này sau khi clone về sẽ nằm trong thư mục $HOME/esp32/esp-idf nhé
$ cd $HOME/esp32
$ git clone --recursive https://github.com/espressif/esp-idf.git
$ export IDF_PATH=$HOME/esp32/esp-idf
$ echo "export IDF_PATH=$HOME/esp32/esp-idf" >> ~/.bashrc
Cập nhật framework ESP-IDF
Vì ESP-IDF được cập nhật thường xuyên nên để có thể có bản mới nhất bạn cần chạy lệnh sau
$ cd $HOME/esp32/esp-idf
$ git pull
$ git submodule update
Lập trình chương trình đầu tiên
Coi như bước chuẩn bị ban đầu đã xong, giờ mình chạy luôn thử chương trình mẫu có sẵn là helloword để xem cách make, compile và nạp chương trình xuống cũng như hoạt động sau đó của ESP32 là thế nào
Biên dịch
Chạy lệnh để vào thư mục và biên dịch code
$ cd $HOME/esp32/esp-idf/examples/get-started/hello_world
$ make
Thông thường lần biên dịch đầu tiên sẽ hiện ra bảng config
Cấu hình
Như với ESP8266 thì bạn thường phải cấu hình bằng command, với ESP32 thì hiện đại hơn đã có GUI cho các bạn có thể cấu hình dễ dàng hơn, ta dùng các phím lên xuống để di chuyển option, phím qua lại để di chuyển giữa select exit,…
Để chạy config bằng tay các bạn có thể gõ lệnh
$ make menuconfig
Trong menu chọn Serial flasher config > Default serial port > Default baudrate, sau đó chọn baud 921600 để có tốc độ nạp nhanh nhất, chọn Save > ok
Build và flash
$ make flash
esptool.py v2.1-beta1
Flashing binaries to serial port /dev/ttyUSB0 (app at offset 0x10000)…
esptool.py v2.1-beta1
Connecting…..
Chip is ESP32D0WDQ6 (revision 0)
Uploading stub…
Running stub…
Stub running…
Changing baud rate to 921600
Changed.
Configuring flash size…
Auto-detected Flash size: 4MB
Flash params set to 0x0220
Compressed 17824 bytes to 10595…
Wrote 17824 bytes (10595 compressed) at 0x00001000 in 0.1 seconds (effective 1169.6 kbit/s)…
Hash of data verified.
Compressed 275120 bytes to 165160…
Wrote 275120 bytes (165160 compressed) at 0x00010000 in 2.7 seconds (effective 816.7 kbit/s)…
Hash of data verified.
Compressed 3072 bytes to 82…
Wrote 3072 bytes (82 compressed) at 0x00008000 in 0.0 seconds (effective 8175.7 kbit/s)…
Hash of data verified.
Leaving…
Hard resetting…
Monitor
Sau khi nạp chương trình xong để kiểm tra kết quả thì cần phải monitor, với cách làm này nó cũng giống như kết nối với chương trình terminal để hiển thị log data. Bạn có thể thực hiện monitor bằng lệnh sau
$ make monitor
Kết quả
Ta sẽ thấy chuỗi Hello world! và thông tin về chip được in ra sau mỗi 10 giây.
Các bạn có thể xem tham khảo code chương trình ở bên dưới viết với freertos
/* Hello World Example
This example code is in the Public Domain (or CC0 licensed, at your option.)
Unless required by applicable law or agreed to in writing, this
software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
CONDITIONS OF ANY KIND, either express or implied.
*/
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_system.h"
#include "esp_spi_flash.h"
void app_main()
{
printf("Hello world!\n");
/* Print chip information */
esp_chip_info_t chip_info;
esp_chip_info(&chip_info);
printf("This is ESP32 chip with %d CPU cores, WiFi%s%s, ",
chip_info.cores,
(chip_info.features & CHIP_FEATURE_BT) ? "/BT" : "",
(chip_info.features & CHIP_FEATURE_BLE) ? "/BLE" : "");
printf("silicon revision %d, ", chip_info.revision);
printf("%dMB %s flash\n", spi_flash_get_chip_size() / (1024 * 1024),
(chip_info.features & CHIP_FEATURE_EMB_FLASH) ? "embedded" : "external");
for (int i = 10; i >= 0; i--) {
printf("Restarting in %d seconds...\n", i);
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
printf("Restarting now.\n");
fflush(stdout);
esp_restart();
}
Tạm kết
Vậy là đã xong được các bước cấu hình môi trường ban đầu để bạn có thể lập trình được cho ESP32, để có thể tìm hiểu sâu hơn các bạn có thể tham khảo thêm các source code mẫu tại /esp32/esp-idf/examples