TTGO LoRa32代码在Arduino IDE正常但PlatformIO运行故障求助
问题:TTGO LoRa32在PlatformIO中启动失败(assert failed: do_core_init startup.c:298)
问题背景
使用TTGO LoRa32 SX1276 OLED板完成作业,代码在Arduino IDE中可正常运行,但在PlatformIO中配置对应板卡和依赖库后,板载屏幕始终黑屏,串口监视器输出启动失败错误。尝试切换ttgo-lora32-v1和ttgo-lora32-v21两种板卡配置,故障现象一致。
串口错误信息
ELF file SHA256: 0000000000000000 Rebooting... ets Jul 29 2019 12:21:46 rst:0xc (SW_CPU_RESET),boot:0x17 (SPI_FAST_FLASH_BOOT) configsip: 0, SPIWP:0xee clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00 mode:DIO, clock div:2 load:0x3fff0030,len:1184 load:0x40078000,len:13132 load:0x40080400,len:3036 entry 0x400805e4 assert failed: do_core_init startup.c:298 (flash_ret == ESP_OK) Backtrace:0x400837b9:0x3ffe3aa00x40088135:0x3ffe3ac0 0x4008cff9:0x3ffe3ae0 0x400dd3fe:0x3ffe3c10 0x40082ed5:0x3ffe3c40 0x400792ba:0x3ffe3c90 |<-CORRUPTED
PlatformIO配置
ttgo-lora32-v21配置
[env:ttgo-lora32-v21] platform = espressif32 board = ttgo-lora32-v21 framework = arduino lib_deps = sandeepmistry/LoRa@^0.8.0 adafruit/Adafruit GFX Library@^1.11.8 adafruit/Adafruit SSD1306@^2.5.7
ttgo-lora32-v1配置
[env:ttgo-lora32-v1] platform = espressif32 board = ttgo-lora32-v1 framework = arduino lib_deps = sandeepmistry/LoRa@^0.8.0 adafruit/Adafruit GFX Library@^1.11.8 adafruit/Adafruit SSD1306@^2.5.7
运行代码
//Libraries for LoRa #include <SPI.h> #include <LoRa.h> //Libraries for OLED Display #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> //define the pins used by the LoRa transceiver module #define SCK 5 #define MISO 19 #define MOSI 27 #define SS 18 #define RST 14 #define DIO0 26 //433E6 for Asia //866E6 for Europe //915E6 for North America #define BAND 866E6 //OLED pins #define OLED_SDA 4 #define OLED_SCL 15 #define OLED_RST 16 #define SCREEN_WIDTH 128 // OLED display width, in pixels #define SCREEN_HEIGHT 64 // OLED display height, in pixels Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RST); String LoRaData; void setup() { //reset OLED display via software pinMode(OLED_RST, OUTPUT); digitalWrite(OLED_RST, LOW); delay(20); digitalWrite(OLED_RST, HIGH); //initialize OLED Wire.begin(OLED_SDA, OLED_SCL); if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3c, false, false)) { // Address 0x3C for 128x32 Serial.println(F("SSD1306 allocation failed")); for(;;); // Don't proceed, loop forever } display.clearDisplay(); display.setTextColor(WHITE); display.setTextSize(1); display.setCursor(0,0); display.print("LORA RECEIVER "); display.display(); //initialize Serial Monitor Serial.begin(115200); Serial.println("LoRa Receiver Test"); //SPI LoRa pins SPI.begin(SCK, MISO, MOSI, SS); //setup LoRa transceiver module LoRa.setPins(SS, RST, DIO0); if (!LoRa.begin(BAND)) { Serial.println("Starting LoRa failed!"); while (1); } Serial.println("LoRa Initializing OK!"); display.setCursor(0,10); display.println("LoRa Initializing OK!"); display.display(); } void loop() { //try to parse packet int packetSize = LoRa.parsePacket(); if (packetSize) { //received a packet Serial.print("Received packet "); //read packet while (LoRa.available()) { LoRaData = LoRa.readString(); Serial.print(LoRaData); } //print RSSI of packet int rssi = LoRa.packetRssi(); Serial.print(" with RSSI "); Serial.println(rssi); // Dsiplay information display.clearDisplay(); display.setCursor(0,0); display.print("LORA RECEIVER"); display.setCursor(0,20); display.print("Received packet:"); display.setCursor(0,30); display.print(LoRaData); display.setCursor(0,40); display.print("RSSI:"); display.setCursor(30,40); display.print(rssi); display.display(); } }
解决方案
1. 指定兼容的espressif32平台版本
过高版本的espressif32平台可能与旧板卡定义冲突,修改platform.ini,指定稳定兼容版本:
[env:ttgo-lora32-v21] platform = espressif32@3.5.0 board = ttgo-lora32-v21 framework = arduino lib_deps = sandeepmistry/LoRa@^0.8.0 adafruit/Adafruit GFX Library@^1.11.8 adafruit/Adafruit SSD1306@^2.5.7
2. 调整初始化顺序,避免总线冲突
原代码先初始化OLED再初始化SPI,可能导致ESP32总线资源冲突,修改setup函数顺序:先初始化串口,再初始化SPI和LoRa,最后初始化OLED:
void setup() { //initialize Serial Monitor first Serial.begin(115200); Serial.println("LoRa Receiver Test"); //SPI LoRa pins SPI.begin(SCK, MISO, MOSI, SS); //setup LoRa transceiver module LoRa.setPins(SS, RST, DIO0); if (!LoRa.begin(BAND)) { Serial.println("Starting LoRa failed!"); while (1); } Serial.println("LoRa Initializing OK!"); //reset OLED display via software pinMode(OLED_RST, OUTPUT); digitalWrite(OLED_RST, LOW); delay(20); digitalWrite(OLED_RST, HIGH); //initialize OLED Wire.begin(OLED_SDA, OLED_SCL); if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3c)) { //简化初始化参数 Serial.println(F("SSD1306 allocation failed")); for(;;); // Don't proceed, loop forever } display.clearDisplay(); display.setTextColor(WHITE); display.setTextSize(1); display.setCursor(0,0); display.print("LORA RECEIVER "); display.setCursor(0,10); display.println("LoRa Initializing OK!"); display.display(); }
3. 验证OLED引脚匹配
确认板卡型号对应的OLED引脚:
- TTGO LoRa32 v1:OLED_SDA=4,OLED_SCL=15(与代码一致)
- TTGO LoRa32 v21:OLED_SDA=21,OLED_SCL=22(需修改代码中引脚定义)
4. 清理缓存重新编译
删除项目根目录下的.pio文件夹,重新下载依赖并编译,避免缓存导致的异常。
内容的提问来源于stack exchange,提问作者Sean Brokke
相关产品推荐
相关产品推荐

