十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

RIOT 板级支持实战:在 Heltec WiFi LoRa 32 V2 上驱动 LoRa 与 OLED

RIOT 板级支持实战:在 Heltec WiFi LoRa 32 V2 上驱动 LoRa 与 OLED RIOT 板级支持实战在 Heltec WiFi LoRa 32 V2 上驱动 LoRa 与 OLED【免费下载链接】RIOTRIOT - The friendly OS for IoT项目地址: https://gitcode.com/GitHub_Trending/riot/RIOT本篇技术指南以 RIOT 仓库中 boards/esp32-heltec-lora32-v2/doc.md 的板级文档为核心系统讲解 RIOT 对 Heltec WiFi LoRa 32 V2 开发板的完整支持从板载硬件ESP32 SoC、SX1276/SX1278 LoRa 射频、SSD1306 OLED到默认 GPIO 配置表、OLED 显示驱动的接入方法、可选外设模块MRF24J40 / ENC28J60的接线配置以及烧录流程。读完本文你将掌握如何为这块 8 MB Flash 的 ESP32 板卡编写可运行的 RIOT 应用并理解板级配置在源码中的实际落点。板卡概览8 MB Flash 的 ESP32 LoRa 开发板Heltec WiFi LoRa 32 V2 是一块直接使用 ESP32 芯片无需外部 MCU的 ESP32 开发板Flash 大小为 8 MB。它集成了两大关键外设SemTech SX1276 或 SX1278用于 LoRaWAN 通信SSD1306 0.96 英寸 128x64 OLED 显示屏通过 I2C 连接。由于该板为开源硬件市面上存在多种兼容克隆版本RIOT 的板级支持对这些克隆同样适用。板级实现对应源码位于 boards/esp32-heltec-lora32-v2/其中 periph_conf.h 定义外设引脚映射board.h 定义按钮、LED 与 SX127X 射频参数gpio_params.h 则登记 SAUL 直接映射的 GPIO 设备。MCUESP32板载绝大多数功能由 ESP32 SoC 提供。在 RIOT 中ESP32 的详细说明时钟、内存、外设等统一归入cpu/esp32目录芯片型号在 Makefile.features 中声明为CPU_MODEL esp32-d0wd即 ESP32-D0WD 双核 240 MHz 版本。板级外设构成Heltec WiFi LoRa 32 V2 的板载组件包括SemTech SX1278 或 SX1276用于 LoRaWAN 通信SSD1306 0.96 英寸 128x64 OLED 显示屏通过 I2C 连接外部 32.768 kHz 晶振用于 RTC对应特性esp_rtc_timer_32k。值得注意的是该板存在两个硬件版本区别仅在于射频芯片与工作频段SX1278工作于433 MHz频段LoRaWAN 433 频段SX1276工作于868/915 MHz频段。射频驱动由sx127x驱动提供默认编译为 SX1276 版本。若需在 433 MHz 版本上使用可参照 tests/drivers/sx127x/README.md 中说明在应用 Makefile 中设置DRIVER sx1272SX1272 与 SX1278 引脚兼容或按需适配参数文件。默认板级配置GPIO 功能分配表因为大量 GPIO 被引出同一引脚可能在不同应用场景中承担不同角色。为了灵活性某些 GPIO 会同时出现在多个外设配置中——例如 GPIO0 既出现在 ADC 通道定义中也出现在 PWM 通道定义中。这种复用之所以可行是因为GPIO 只有在以下任一条件成立时才真正被分配给某个外设对应的外设模块被启用例如模块periph_i2c对应的初始化函数被调用例如adc_init、dac_init、pwm_init对应的外设接口被首次使用例如spi_acquire。也就是说一个 GPIO 的实际用途取决于哪个模块或函数最先被使用。这一点在 periph_conf.h 的注释中反复强调例如 ADC 通道所列 GPIO 在未被adc_init初始化前可作他用SPI 信号只有在首次调用spi_init_cs或spi_acquire时才被占用。⚠️注意GPIO19、4、5、14、15、16、18、32、33、34、35、21、26、27 被用于板级控制功能除非你确切知道自己在做什么否则不应挪作他用。以下为默认板级配置表按 GPIO 功能排序。该配置可通过应用特定配置application-specific configuration覆盖功能GPIO备注配置BTN0GPIO0低电平有效LED0GPIO25高电平有效ADCGPIO36、GPIO39、GPIO37、GPIO38、GPIO0、GPIO2、GPIO12、GPIO13、GPIO4、GPIO15ADC ChannelsDACDAC ChannelsPWM_DEV(0)GPIO25、GPIO2、GPIO17PWM ChannelsPWM_DEV(1)GPIO22、GPIO23PWM ChannelsI2C_DEV(0):SDAGPIO4I2C InterfacesI2C_DEV(0):SCLGPIO15使用 I2C_SPEED_FASTI2C InterfacesSPI_DEV(0):CLKGPIO5使用 VSPISPI InterfacesSPI_DEV(0):MISOGPIO19使用 VSPISPI InterfacesSPI_DEV(0):MOSIGPIO27使用 VSPISPI InterfacesSPI_DEV(0):CS0GPIO18使用 VSPISPI InterfacesUART_DEV(0):TxDGPIO1控制台配置固定UART interfacesUART_DEV(0):RxDGPIO3控制台配置固定UART interfacesUART_DEV(1):TxDGPIO10在qout与qio闪存模式下不可用UART interfacesUART_DEV(1):RxDGPIO9在qout与qio闪存模式下不可用UART interfacesOLED RESETGPIO16补充说明ADC 通道配置包含了 ESP32 上所有可作 ADC 通道的 GPIOGPIO9 与 GPIO10 只能在dout与dio闪存模式下使用。在 periph_conf.h 中UART_DEV(1) 的定义被CONFIG_FLASHMODE_DOUT || CONFIG_FLASHMODE_DIO条件编译包裹若闪存模式为 qio/qout编译时会触发#warning提示 GPIO9/GPIO10 不可用。源码中的配置落点上述配置表与源码一一对应ADCADC_GPIOS定义为{ GPIO36, GPIO39, GPIO37, GPIO38, GPIO0, GPIO2, GPIO12, GPIO13, GPIO4, GPIO15 }DAC_GPIOS为空集{ }因为所有 DAC 引脚均已被板级控制占用无剩余引脚可作 DAC 通道见 periph_conf.hI2CI2C0_SDA GPIO4、I2C0_SCL GPIO15、I2C0_SPEED I2C_SPEED_FAST见 periph_conf.hPWMPWM0_GPIOS { GPIO25, GPIO17, GPIO2 }、PWM1_GPIOS { GPIO22, GPIO23 }见 periph_conf.hSPISPI0_CTRL VSPISPI0_SCK GPIO5、SPI0_MISO GPIO19、SPI0_MOSI GPIO27、SPI0_CS0 GPIO18见 periph_conf.hUARTUART0_TXD GPIO1、UART0_RXD GPIO3固定不可改UART1_TXD GPIO10、UART1_RXD GPIO9见 periph_conf.h按钮与 LEDBTN0_PIN GPIO0上拉、低电平有效、下降沿触发LED0_PIN GPIO25、LED0_ACTIVE 1高电平点亮见 board.h。这些定义都通过#ifndef包裹因此应用可以在编译期通过宏覆盖默认值实现应用特定的引脚重映射。使用 OLED 显示屏u8g2 包0.96 英寸 128x64 OLED 显示屏采用广泛使用的 SSD1306 控制器连接在I2C_DEV(0)上。RIOT 通过pkg/u8g2包驱动它使用方法如下。第一步在应用 Makefile 中启用 u8g2 包USEPKG u8g2第二步调用 SSD1306 的 setup 函数调用u8g2_Setup_ssd1306_i2c_128x64_noname_f来配置正确的驱动例如#include u8g2.h #include u8x8_riotos.h #define SSD1306_I2C_ADDR (0x3c) u8x8_riotos_t user_data { .device_index I2C_DEV(0), .pin_cs GPIO_UNDEF, .pin_dc GPIO_UNDEF, .pin_reset GPIO16, }; u8g2_Setup_ssd1306_i2c_128x64_noname_f(u8g2, U8G2_R0, u8x8_byte_hw_i2c_riotos, u8x8_gpio_and_delay_riotos); u8g2_SetUserPtr(u8g2, user_data); u8g2_SetI2CAddress(u8g2, SSD1306_I2C_ADDR); u8g2_InitDisplay(u8g2); u8g2_SetPowerSave(u8g2, 0);关键点解读u8x8_riotos_t user_data是 RIOT 与 u8g2 之间的适配层结构定义于pkg/u8g2提供的u8x8_riotos.h其中device_index指定使用的 I2C 设备此处为I2C_DEV(0)pin_reset指定 OLED 复位引脚为 GPIO16SSD1306 在 7 位地址模式下默认 I2C 地址为0x3c通过u8g2_SetI2CAddress设置U8G2_R0表示旋转角度 0 度不旋转。第三步参考测试程序快速验证仓库中的tests/pkg/u8g2测试应用是使用pkg/u8g2的典型范例其main.c完整演示了 stdout、SDL、SPI、I2C 四种输出路径的初始化流程。为本板编译并烧录该测试TEST_OUTPUT4 TEST_I2C0 TEST_ADDR0x3c TEST_PIN_RESETGPIO16 \ TEST_DISPLAYu8g2_Setup_ssd1306_i2c_128x64_noname_f \ BOARDesp32-heltec-lora32-v2 make -C tests/pkg/u8g2/ flash其中TEST_OUTPUT4对应 I2C 输出模式tests/pkg/u8g2/main.c中TEST_OUTPUT_I2C 4TEST_I2C0与TEST_ADDR0x3c分别指定 I2C 设备与从机地址TEST_PIN_RESETGPIO16对应板载 OLED 复位脚。可选外设扩展MRF24J40 与 ENC28J60文档明确说明MRF24J40 基 IEEE 802.15.4 射频模块和ENC28J60 基以太网模块均已在板上验证可用。将以下代码放入你的应用特定配置中即可启用#ifdef BOARD_ESP32_HELTEC_LORA32_V2 # if MODULE_MRF24J40 # define MRF24J40_PARAM_CS GPIO12 /* MRF24J40 CS signal */ # define MRF24J40_PARAM_RESET GPIO22 /* MRF24J40 RESET signal */ # define MRF24J40_PARAM_INT GPIO23 /* MRF24J40 INT signal */ # endif # if MODULE_ENC28J80 # define ENC28J80_PARAM_CS GPIO12 /* ENC28J80 CS signal */ # define ENC28J80_PARAM_RESET GPIO22 /* ENC28J80 RESET signal */ # define ENC28J80_PARAM_INT GPIO23 /* ENC28J80 INT signal */ # endif #endif其他参数可直接使用驱动定义的默认值。值得注意的是RESET 信号也可以接到板上的 RST 引脚从而把配置中占用的 GPIO 释放出来留作他用。烧录设备烧录 RIOT 非常简单板载 Micro-USB 连接器自带 reset/boot/flash 逻辑。将板子连接到主机使用编程口执行BOARDesp32-heltec-lora32-v2 make flash ...RIOT 的 ESP32 支持会自动处理进入下载模式所需的时序应用无需关心底层细节。板级能力的源码级印证除了 doc.md 中的说明板级目录下的构建与配置文件进一步印证了该板的支持范围构建依赖Makefile.dep当应用启用netdev_default模块时自动加入sx1276驱动因此只要应用按默认网络栈构建LoRa 射频即被纳入启用saul_default时自动加入saul_gpio将板载 LED 与按钮注册为 SAUL 设备SAUL 映射gpio_params.hLEDGPIO25GPIO_OUT初始化清除与 PRG 按钮GPIO0GPIO_IN电平反转被映射为 SAUL GPIO 设备可通过saul相关命令直接读写SX127X 引脚配置board.hSX127X_PARAM_SPI SPI_DEV(0)、SX127X_PARAM_SPI_NSS GPIO18、SX127X_PARAM_RESET GPIO14、SX127X_PARAM_DIO0 GPIO26。DIO1/DIO2 被定义为GPIO_UNDEF原因是 GPIO35/GPIO34 无下拉电阻直接使用会导致初始化错误——这是针对该板硬件特性的一个关键适配点Arduino 兼容层arduino_iomap.h提供了完整的 Arduino 引脚映射0~19 号数字引脚、A0~A5 模拟引脚、PWM 设备/通道对并声明了arduino_analog、arduino_i2c、arduino_pins、arduino_pwm、arduino_spi、arduino_uart特性意味着基于 Arduino API 编写的 RIOT 应用可直接在该板上运行Kconfig 支持Kconfig板卡符号BOARD_ESP32_HELTEC_LORA32_V2依赖BOARD_COMMON_ESP32与CPU_MODEL_ESP32_D0WD可通过 Kconfig 配置系统进行菜单式配置。小结Heltec WiFi LoRa 32 V2 在 RIOT 中的支持覆盖了 LoRaWAN 通信SX1276/SX1278、OLED 显示SSD1306 u8g2、IEEE 802.15.4 与以太网扩展MRF24J40/ENC28J60以及完整的 Arduino API 兼容层。理解其GPIO 按需分配的复用机制是安全使用这块板的关键多数引脚在对应模块未被启用前仍可自由使用但板级控制引脚含 SX127X 的复位与 DIO0应避免挪作他用。结合 tests/pkg/u8g2 与 tests/drivers/sx127x 两个测试应用可以快速验证显示与射频通路作为自研应用的起点。【免费下载链接】RIOTRIOT - The friendly OS for IoT项目地址: https://gitcode.com/GitHub_Trending/riot/RIOT创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表