ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

RIOT 支持 LILYGO TTGO T8 ESP32-S2 开发板:外设配置、GPIO 映射与烧录实战

RIOT 支持 LILYGO TTGO T8 ESP32-S2 开发板:外设配置、GPIO 映射与烧录实战 RIOT 支持 LILYGO TTGO T8 ESP32-S2 开发板外设配置、GPIO 映射与烧录实战【免费下载链接】RIOTRIOT - The friendly OS for IoT项目地址: https://gitcode.com/GitHub_Trending/riot/RIOTLILYGO TTGO T8又称 LilyGo T-Display S2是一块集成 1.9 英寸 ST7789 OLED 显示屏与 TF 卡槽的 ESP32-S2 开发板。本文以 RIOT 仓库中该板卡的 doc.md 为骨架结合 periph_conf.h、board.h 与 Makefile/Kconfig 源码系统讲解该板卡在 RIOT 中的特性、默认 GPIO 分配、外设配置细节以及两种 USB 模式下的烧录方法帮助你在 RIOT 中快速启用这块板卡并编写驱动 OLED 与 SD 卡的应用程序。板卡概览与主要特性Espressif LILYGO TTGO T8 ESP32-S2 是 ESP32-S2 系列的典型开发板核心卖点是一块 240×135 的 ST7789 OLED 显示屏和一个 TFmicroSD卡槽。RIOT 官方为其提供了完整板卡支持板卡目录位于boards/esp32s2-lilygo-ttgo-t8其doc.md中给出的主要特性如下特性支持情况ESP32-S2 SoC支持4 MB Flash支持8 MB QSPI RAM支持SD 卡槽支持32.768 kHz 晶振支持ST7789 OLED 显示屏支持板卡目录的 Makefile.features 进一步印证了这些特性板卡使用CPU_MODEL esp32s2并对外提供esp_spi_ram外部 8 MB QSPI PSRAM、periph_adc、periph_dac、periph_i2c、periph_pwm、periph_spi、periph_usbdev、sdcard_spi、tinyusb_device以及esp_rtc_timer_32k等特性同时板卡还支持完整的 Arduino 适配层arduino_analog、arduino_i2c、arduino_pins、arduino_pwm、arduino_spi、arduino_uart、arduino_dac意味着可以直接使用 RIOT 的 Arduino API 编写应用。MCU板卡绝大部分功能由 ESP32-S2 SoC 提供。ESP32-S2 属于 ESP32x SoC 家族包含 2 个 UART板卡仅使用 UART_DEV(0)、1 个 USB OTG 接口GPIO19/GPIO20、多路 ADC/DAC 等外设。关于 ESP32-S2 SoC 系列family的详细说明可参考 RIOT CPU 目录下 ESP32 系列文档cpu/esp32与 cpu/esp_common 中的相关实现本文聚焦于该板卡特有的板级配置。板级默认配置Board ConfigurationTTGO T8 的板级配置有几个关键决策点两路 SPI 的用途划分、USB 信号的 DIP 开关切换、以及 32.768 kHz 晶振的 DIP 开关切换。SPI 资源划分SPI_DEV(0)FSPI专用于 OLED 显示屏其 GPIO 未引出到排针不能被其他设备复用SPI_DEV(1) 专用于 SD 卡槽其 GPIO 均已引出可以同时被其他 SPI 设备使用。在 periph_conf.h 中SPI_DEV(0) 使用 FSPISPI Controller 2SPI_DEV(1) 使用 HSPISPI Controller 3。需要注意这些 GPIO 只有在对应 SPI 接口首次被spi_init_cs或spi_acquire调用时才会被初始化为 SPI 信号之前完全可作他用。USB 信号切换DIP 开关板载 USB-to-UART 桥USB-C 接口的 D-/D 信号通过 DIP 开关决定连接到哪一端默认连接到板载 USB-to-UART 桥自带复位/烧录/下载逻辑可直接用于串口控制台与烧录切换到 GPIO19 / GPIO20此时启用 ESP32-S2 自带的 USB OTG 接口若仍希望通过 USB 查看控制台输出需要启用stdio_cdc_acm或stdio_tinyusb_cdc_acm模块当使用 USBUS 或 tinyUSB 协议栈时会自动启用。32.768 kHz 晶振切换DIP 开关板载 32.768 kHz 晶振默认通过 DIP 开关连接到 GPIO15 与 GPIO16。关闭 DIP 开关后这两个引脚才会在排针上可用例如用作 PWM_DEV(1) 的通道。默认 GPIO 分配表doc.md 给出的默认板级配置按 GPIO 功能排序如下该配置可被应用特定配置覆盖见下文说明功能GPIO备注配置参考BUTTON0GPIO0BOOT 按键—ADC_LINE(n)GPIO1 … GPIO9ADC 通道ESP32 ADC ChannelsDAC_LINE(n)GPIO17, GPIO18DAC 通道ESP32 DAC ChannelsGPIO38GPIO38OLED RESET未引出—I2C_DEV(0) SCLGPIO7ESP32 I2C InterfacesI2C_DEV(0) SDAGPIO8ESP32 I2C InterfacesPWM_DEV(0)GPIO39, GPIO40, GPIO41, GPIO42ESP32 PWM ChannelsPWM_DEV(1)GPIO15, GPIO16未使用esp_rtc_timer_32k时可用ESP32 PWM ChannelsSPI_DEV(0) CLKGPIO36OLED CLK未引出SPI_DEV(0) MISOGPIO9FSPIHD 哑元未引出GPIO37 用作 DCXSPI_DEV(0) MOSIGPIO35OLED MOSI未引出SPI_DEV(0) CS0GPIO34OLED CS0未引出SPI_DEV(1) CLKGPIO12SD 卡 CLKESP32 SPI InterfacesSPI_DEV(1) MISOGPIO13SD 卡 MISOESP32 SPI InterfacesSPI_DEV(1) MOSIGPIO11SD 卡 MOSIESP32 SPI InterfacesSPI_DEV(1) CS0GPIO10SD 卡 CSESP32 SPI InterfacesUART_DEV(0) TxDGPIO43控制台ESP32 UART InterfacesUART_DEV(0) RxDGPIO44控制台ESP32 UART InterfacesUSB D-GPIO19未使用 USB-to-UART 桥时USB DGPIO20未使用 USB-to-UART 桥时说明上表中 SPI_DEV(1) 的 MISO/MOSI/CS0 引脚号以 periph_conf.h 中的实际定义GPIO13 / GPIO11 / GPIO10为准这是板卡当前生效的配置doc.md中的表格在这些引脚上与源码存在出入实际接线请以源码为准。SPI_DEV(0) 的 MISO 在doc.md表格中标为 GPIO37而 periph_conf.h 中SPI0_MISO定义为 GPIO9FSPIHD 哑元因为 GPIO37 实际被用作 OLED 的 DCX 信号。关于外设配置的通用细节ADC 通道编号、I2C/SPI 接口编号、PWM 通道映射等参见 ESP32 板卡的 Common Peripherals 章节cpu/esp32与boards/common/esp32s2中提供公共定义。外设配置源码深度解读ADC 与 DACperiph_conf.h 定义了ADC_GPIOS { GPIO1, GPIO2, GPIO4, GPIO5, GPIO6, GPIO7, GPIO8, GPIO9 }ADC1 上所有引出的引脚都被声明为 ADC 通道GPIO3 因是 strapping 引脚被排除GPIO7/GPIO8 在启用 I2C_DEV(0) 时会被 I2C 占用GPIO9 未引出用于测量 V_BATDAC_GPIOS { GPIO17, GPIO18 }两个 DAC 通道。源码注释特别强调这些 GPIO 只有在通过adc_init/dac_init初始化为 ADC/DAC 通道之后才被占用在此之前可用于其他用途。I2C板卡仅定义一个 I2C 接口I2C_DEV(0)I2C0_SPEED I2C_SPEED_FAST快速模式I2C0_SCL GPIO7I2C0_SDA GPIO8。同样只有在使用periph_i2c模块时这些 GPIO 才会被初始化为 I2C 信号。PWM板卡配置了两个 PWM 设备包含了未定义为 I2C/SPI/UART 的所有输出引脚PWM_DEV(0)PWM0_GPIOS { GPIO39, GPIO40, GPIO41, GPIO42 }PWM_DEV(1)PWM1_GPIOS { GPIO15, GPIO16 }但仅在未启用esp_rtc_timer_32k模块时定义因为此时 GPIO15/GPIO16 被 32.768 kHz 晶振占用。SPI 与 ST7789 OLED、SD 卡SPI 配置与板级功能一一对应SPI_DEV(0)FSPISCKGPIO36、MISOGPIO9哑元、MOSIGPIO35、CS0GPIO34专用于 OLEDSPI_DEV(1)HSPISCKGPIO12、MISOGPIO13、MOSIGPIO11、CS0GPIO10用于 SD 卡。在 board.h 中OLED 与 SD 卡的外设参数被进一步细化ST7789 OLED 参数启用st7789模块时生效#define ST77XX_PARAM_CNTRL ST77XX_CNTRL_ST7789 // ST7789 控制器 #define ST77XX_PARAM_SPI SPI_DEV(0) // SPI 设备 #define ST77XX_PARAM_SPI_CLK SPI_CLK_10MHZ // SPI 时钟 10 MHz #define ST77XX_PARAM_SPI_MODE SPI_MODE_0 #define ST77XX_PARAM_CS GPIO34 // 片选 #define ST77XX_PARAM_DCX GPIO37 // DCX 引脚 #define ST77XX_PARAM_RST GPIO38 // 复位引脚 #define ST77XX_PARAM_RGB 1 // RGB 模式 #define ST77XX_PARAM_INVERTED 1 // 反色显示 #define ST77XX_PARAM_NUM_LINES 240U // 行数高 #define ST77XX_PARAM_RGB_CHANNELS 135U // 列数宽 #define ST77XX_PARAM_ROTATION ST77XX_ROTATION_270 // 旋转 270° #define ST77XX_PARAM_OFFSET_X 40 // X 偏移 #define ST77XX_PARAM_OFFSET_Y 52 // Y 偏移即这是一块240×135的 ST7789 屏幕RIOT 默认旋转 270° 并设置 40/52 的偏移来对齐显示区域。GPIO37 在此处扮演 DCX 角色这也是 SPI_DEV(0) 的 MISO 在源码中被置为哑元 GPIO9 的原因。背光控制#define BACKLIGHT_PIN GPIO33 // 背光引脚 #define BACKLIGHT_ON gpio_set(BACKLIGHT_PIN) #define BACKLIGHT_OFF gpio_clear(BACKLIGHT_PIN)board.c 中的board_init会在启用st77xx模块时把背光引脚初始化为输出。SD 卡参数启用sdcard_spi模块时生效#define SDCARD_SPI_PARAM_SPI SPI_DEV(1) #define SDCARD_SPI_PARAM_CS SPI1_CS0 // GPIO10 #define SDCARD_SPI_PARAM_CLK SPI1_SCK // GPIO12 #define SDCARD_SPI_PARAM_MOSI SPI1_MOSI // GPIO11 #define SDCARD_SPI_PARAM_MISO SPI1_MISO // GPIO13 #define SDCARD_SPI_PARAM_POWER GPIO_UNDEF // 无电源控制引脚依赖自动装配Makefile.dep启用mtd模块 → 自动加入mtd_sdcard_default启用vfs_default→ 自动加入fatfs_vfs与mtd默认在 SD 卡上使用 FAT 文件系统启用disp_dev→ 自动加入st7789启用saul_default→ 自动加入saul_gpioSAUL 直接映射 GPIO。也就是说在应用 Makefile 中只需声明USEMODULE vfs_default或USEMODULE disp_devSD 卡文件系统与 OLED 显示驱动就会被自动拉起。按键BUTTON0 / BOOTboard.h 定义BTN0_PIN GPIO0板上的 BOOT 按键在正常运行时可作为用户按键BTN0_MODE GPIO_IN_PU按键 GPIO 已被外部上拉电阻上拉模式需为输入上拉按下时信号为低BTN0_INT_FLANK GPIO_FALLING默认下降沿触发中断。gpio_params.h 中将其注册进 SAULstatic const saul_gpio_params_t saul_gpio_params[] { { .name BOOT, .pin BTN0_PIN, .mode BTN0_MODE, .flags SAUL_GPIO_INVERTED }, };启用saul_default后应用即可通过 SAUL API 读取按键状态。UART 控制台UART_DEV(0) 使用固定标准配置且引脚不可更改UART0_TXD GPIO43UART0_RXD GPIO44。编译与烧录Flashing the Device板卡通过 USB-C 接口供电与通信烧录方式取决于 DIP 开关的当前配置。方式一USB-C 连接 USB-to-UART 桥默认这是默认出厂配置自带复位/烧录/下载逻辑操作最简单把板卡连到主机使用编程端口直接烧录BOARDesp32s2-lilygo-ttgo-t8 make flash方式二USB-C 连接 ESP32-S2 的 USB 信号将 DIP 开关切换到 GPIO19/GPIO20 后可使用 SoC 内置的 USB-to-JTAG 桥烧录。USB-to-JTAG 桥会在 bootloader 的下载模式下自动激活前提是 eFuseJTAG_SEL_ENABLE与DIS_USB_JTAG未被烧写参见 JTAG Interface 中 strapping 引脚 GPIO3 的说明。连接板卡后通过编程端口执行需同时启用esp32s2-lilygo-ttgo-t8-usb伪模块该模块会通过 Makefile.include 自动把PORT_LINUX设为/dev/ttyACM0并自动引入stdio_cdc_acm依赖USEMODULEesp32s2-lilygo-ttgo-t8-usb BOARDesp32s2-lilygo-ttgo-t8 make flash如果 RIOT 已经在设备上运行该命令通常会自动复位设备并进入 bootloader 下载模式。若遇到以下情况RIOT 尚未烧录到设备自动复位失效设备卡在其他模式则需要手动强制进入下载模式按住 BOOTBOT按键的同时按一下 RST 复位按键然后再执行烧录命令。Kconfig 中的对应开关板卡配置同时暴露了 Kconfig 入口KconfigESP32S2_LILYGO_TTGO_T8_USB勾选表示使用 USB 接口而非 USB-to-UART 桥需配合 DIP 开关切换ESP32S2_LILYGO_TTGO_T8_32K_XTAL默认开启表示使用板载 32.768 kHz 晶振若在排针上使用 GPIO15/GPIO16应关闭该选项从而释放这两个引脚给 PWM_DEV(1)。串口自动识别过滤Makefile.include 中还配置了 TTY 自动选择过滤规则TTY_BOARD_FILTER : --driver ch341 --vendor 1a86 --model USB Serial即板载 USB-to-UART 桥使用 CH341 芯片vendor 1a86配合MOST_RECENT_PORT1时 RIOT 会自动匹配该串口设备。应用示例要点在 RIOT 中开发 TTGO T8 应用时建议按需组合以下模块# 最小控制台 OLED USEMODULE disp_dev # 自动引入 st7789板级参数自动生效 # SD 卡文件系统 USEMODULE vfs_default # 自动引入 fatfs_vfs mtdmtd_sdcard_default # USB OTG 作为控制台需 DIP 切到 USB 模式 USEMODULE esp32s2-lilygo-ttgo-t8-usb # SAUL 感知层读取 BOOT 按键等 USEMODULE saul_default得益于 board.h 中的默认参数ST7789 的disp_dev接口与 SD 卡的mtd/vfs接口无需手动指定引脚开箱即用板卡排针上引出的 GPIO1–GPIO9ADC、GPIO17/18DAC、GPIO7/8I2C、GPIO39–42PWM则可通过 RIOT 的periph_*API 直接操作具体接口编号可对照上文 GPIO 分配表。总结LILYGO TTGO T8 ESP32-S2 是 RIOT 中一块开箱即用程度很高的 ESP32-S2 板卡OLEDSPI_DEV(0)/ST7789与 SD 卡SPI_DEV(1)/FATFS的板级参数已在 board.h 与 periph_conf.h 中完整定义烧录只需在默认 DIP 配置下执行BOARDesp32s2-lilygo-ttgo-t8 make flash切换到 USB OTG 模式时则需启用esp32s2-lilygo-ttgo-t8-usb伪模块并配合 GPIO19/20 的 DIP 开关。理解 DIP 开关USB 信号、32.768 kHz 晶振与源码中 GPIO 分配之间的对应关系是高效使用这块板卡的关键。【免费下载链接】RIOTRIOT - The friendly OS for IoT项目地址: https://gitcode.com/GitHub_Trending/riot/RIOT创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表