Почему ESP32 уходит в перезагрузку
Делаю простейший проектик с есп32 и бме280, использую расширение esp-idf для VSCode После сборки и прошивки, есп уходит в бесконечную загрузку
Логи:
I (31) boot: ESP-IDF v5.4 2nd stage bootloader
I (31) boot: compile time Jan 5 2025 23:07:04
I (31) boot: Multicore bootloader
I (32) boot: chip revision: v3.0
I (35) boot.esp32: SPI Speed : 40MHz
I (39) boot.esp32: SPI Mode : DIO
I (42) boot.esp32: SPI Flash Size : 2MB
I (46) boot: Enabling RNG early entropy source...
I (50) boot: Partition Table:
I (53) boot: ## Label Usage Type ST Offset Length
I (59) boot: 0 nvs WiFi data 01 02 00009000 00006000
I (66) boot: 1 phy_init RF data 01 01 0000f000 00001000
I (72) boot: 2 factory factory app 00 00 00010000 00100000
I (79) boot: End of partition table
I (82) esp_image: segment 0: paddr=00010020 vaddr=3f400020 size=0ae68h ( 44648) map
I (105) esp_image: segment 1: paddr=0001ae90 vaddr=3ff80000 size=0001ch ( 28) load
I (105) esp_image: segment 2: paddr=0001aeb4 vaddr=3ffb0000 size=0239ch ( 9116) load
I (112) esp_image: segment 3: paddr=0001d258 vaddr=40080000 size=02dc0h ( 11712) load
I (121) esp_image: segment 4: paddr=00020020 vaddr=400d0020 size=16554h ( 91476) map
I (155) esp_image: segment 5: paddr=0003657c vaddr=40082dc0 size=0b360h ( 45920) load
I (180) boot: Loaded app from partition at offset 0x10000
I (180) boot: Disabling RNG early entropy source...
I (190) cpu_start: Multicore app
I (199) cpu_start: Pro cpu start user code
I (199) cpu_start: cpu freq: 160000000 Hz
I (199) app_init: Application information:
I (199) app_init: Project name: bme
I (202) app_init: App version: 1
I (206) app_init: Compile time: Jan 5 2025 23:06:18
I (211) app_init: ELF file SHA256: 8105d6903...
I (215) app_init: ESP-IDF: v5.4
I (219) efuse_init: Min chip rev: v0.0
I (223) efuse_init: Max chip rev: v3.99
I (227) efuse_init: Chip rev: v3.0
I (231) heap_init: Initializing. RAM available for dynamic allocation:
I (237) heap_init: At 3FFAE6E0 len 00001920 (6 KiB): DRAM
I (242) heap_init: At 3FFB2C68 len 0002D398 (180 KiB): DRAM
I (247) heap_init: At 3FFE0440 len 00003AE0 (14 KiB): D/IRAM
I (253) heap_init: At 3FFE4350 len 0001BCB0 (111 KiB): D/IRAM
I (258) heap_init: At 4008E120 len 00011EE0 (71 KiB): IRAM
I (265) spi_flash: detected chip: generic
I (267) spi_flash: flash io: dio
W (270) spi_flash: Detected size(4096k) larger than the size in the binary image header(2048k). Using the size in the binary image header.
W (282) i2c: This driver is an old driver, please migrate your application code to adapt driver/i2c_master.h
I (292) main_task: Started on CPU0
I (302) main_task: Calling app_main()
Guru Meditation Error: Core 0 panic'ed (InstructionFetchError). Exception was unhandled.
Core 0 register dump:
PC : 0x3ffb3f40 PS : 0x00060a30 A0 : 0x800d66be A1 : 0x3ffb3eb0
A2 : 0x00000000 A3 : 0x3f402274 A4 : 0x3f4022e8 A5 : 0x3ffb3f40
A6 : 0x3ffb3ee0 A7 : 0x00000005 A8 : 0x800d6ea4 A9 : 0x00000060
A10 : 0x000003e8 A11 : 0x3ffb3f20 A12 : 0x00000001 A13 : 0x3ffb3ee0
A14 : 0x3ffb0798 A15 : 0x000000d0 SAR : 0x00000016 EXCCAUSE: 0x00000002
EXCVADDR: 0x3ffb3f40 LBEG : 0x4000c2e0 LEND : 0x4000c2f6 LCOUNT : 0xffffffff
--- 0x4000c2e0: memcpy in ROM
0x4000c2f6: memcpy in ROM
Backtrace: 0x3ffb3f3d:0x3ffb3eb0 |<-CORRUPTED
ELF file SHA256: 8105d6903
Rebooting...
ets Jul 29 2019 12:21:46
rst:0xc (SW_CPU_RESET),boot:0x13 (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:6276
load:0x40078000,len:15716
load:0x40080400,len:4
--- 0x40080400: _init at ??:?
Сам код:
#include <stdio.h>
#include "string.h"
#include "esp_log.h"
#include "esp_err.h"
#include "driver/i2c.h"
#include "bme280.h"
#define I2C_MASTER_SCL_IO 22 // GPIO для SCL
#define I2C_MASTER_SDA_IO 21 // GPIO для SDA
#define I2C_MASTER_NUM I2C_NUM_0
#define BME280_I2C_ADDRESS 0x76
static const char *TAG = "BME280";
static int8_t i2c_read(uint8_t reg_addr, uint8_t *reg_data, uint32_t len, void *intf_ptr);
static int8_t i2c_write(uint8_t reg_addr, const uint8_t *reg_data, uint32_t len,
void *intf_ptr);
// Функция инициализации I2C
esp_err_t i2c_master_init() {
esp_err_t ret;
i2c_config_t conf = {};
conf.mode = I2C_MODE_MASTER;
conf.sda_io_num = I2C_MASTER_SDA_IO;
conf.scl_io_num = I2C_MASTER_SCL_IO;
conf.sda_pullup_en = GPIO_PULLUP_ENABLE;
conf.scl_pullup_en = GPIO_PULLUP_ENABLE;
conf.master.clk_speed = 100000; // 100 kHz
ret = i2c_driver_install(I2C_MASTER_NUM, conf.mode, 0, 0, 0);
if (ret != ESP_OK) {
return ret;
}
ret = i2c_param_config(I2C_MASTER_NUM, &conf);
return ret; // Возвращаем результат настройки
}
void app_main(void) {
esp_err_t res;
struct bme280_dev bme280;
bme280.chip_id = BME280_I2C_ADDRESS; // Корректный адрес устройства
bme280.read = i2c_read; // Указываем функции чтения и записи
bme280.write = i2c_write;
bme280.intf = BME280_I2C_INTF; // Указываем интерфейс (I2C)
// Инициализация I2C
res = i2c_master_init();
if (res != ESP_OK) {
ESP_LOGE(TAG, "I2C init failed");
return;
}
// Инициализация BME280
res = bme280_init(&bme280);
if (res != BME280_OK) {
ESP_LOGE(TAG, "BME280 init failed");
return;
}
// Получение данных
struct bme280_data comp_data;
while (1) {
res = bme280_get_sensor_data(BME280_ALL, &comp_data, &bme280);
if (res == BME280_OK) {
printf("Температура: %.2f °C\n", comp_data.temperature);
printf("Давление: %.2f hPa\n", comp_data.pressure / 100.0f);
} else {
ESP_LOGE(TAG, "Не удалось получить данные");
}
vTaskDelay(pdMS_TO_TICKS(2000)); // Задержка 2 секунды
}
}
// Функции для I2C чтения и записи
static int8_t i2c_read(uint8_t reg_addr, uint8_t *reg_data, uint32_t len, void *intf_ptr) {
esp_err_t ret = i2c_master_write_read_device(I2C_MASTER_NUM, 0x76, ®_addr, 1, reg_data, len, 1000 / portTICK_PERIOD_MS);
return (ret == ESP_OK) ? 0 : -1; // Возвращаем статус выполнения
}
static int8_t i2c_write(uint8_t reg_addr, const uint8_t *reg_data, uint32_t len,
void *intf_ptr) {
uint8_t data[len + 1];
data[0] = reg_addr;
memcpy(data + 1, reg_data, len);
esp_err_t ret = i2c_master_write_to_device(I2C_MASTER_NUM, 0x76, data, sizeof(data), 1000 / portTICK_PERIOD_MS);
return (ret == ESP_OK) ? 0 : -1; // Возвращаем статус выполнения
}
Пожалуйста камнями не бросайтесь, esp недавно для себя открыл.