要使用带有 IAP 功能的 LDROM 中的 ISP_UART Bootloader,通过 ESP32 BLE 模块升级 APROM 中的固件,需按照以下步骤操作。整个过程涉及硬件连接、固件设计和通信协议实现:
1. 硬件连接
将 ESP32 与目标微控制器(MCU)连接:
- ESP32 TX → MCU UART RX
- ESP32 RX → MCU UART TX
- ESP32 GND → MCU GND
- ESP32 3.3V → MCU VCC(可选,若需供电)
- Boot 触发引脚:MCU 的特定引脚(如 P3.2)接地或拉高,强制启动时进入 LDROM。
2. Bootloader 配置(LDROM)
确保 MCU 的 LDROM 已烧录支持 IAP 的 ISP_UART Bootloader:
- IAP 功能:Bootloader 需支持通过 UART 接收固件并写入 APROM。
- 启动模式:通过硬件引脚(如 P3.2)或寄存器配置,使 MCU 上电时优先运行 LDROM。
- 协议适配:Bootloader 通常使用自定义协议(如 YMODEM/XMODEM)或简单串口协议接收数据。
3. ESP32 固件设计
ESP32 充当 BLE 到 UART 的桥接器,实现以下功能:
(1) BLE 服务端配置
(2) 数据转发逻辑
- 接收 BLE 数据:将客户端写入 RX 特征的数据通过 UART 转发给 MCU。
- 发送 UART 响应:将 MCU 的串口响应(如 ACK/NACK)通过 TX 特征通知客户端。
(3) 关键代码(Arduino 框架示例)
#include
#include
#include
BLECharacteristic *pTxCharacteristic;
bool deviceConnected = false;
class ServerCallbacks: public BLEServerCallbacks {
void onConnect(BLEServer* pServer) { deviceConnected = true; }
void onDisconnect(BLEServer* pServer) { deviceConnected = false; }
};
class RxCallbacks: public BLECharacteristicCallbacks {
void onWrite(BLECharacteristic *pCharacteristic) {
std::string rxData = pCharacteristic->getValue();
if (rxData.length() > 0) {
Serial2.write(rxData.c_str(), rxData.length()); // 转发数据到 UART
}
}
};
void setup() {
Serial2.begin(115200); // MCU UART 波特率(需与 Bootloader 一致)
BLEDevice::init("ESP32-Bridge");
BLEServer *pServer = BLEDevice::createServer();
pServer->setCallbacks(new ServerCallbacks());
BLEService *pService = pServer->createService(SERVICE_UUID);
pTxCharacteristic = pService->createCharacteristic(CHARACTERISTIC_TX, BLECharacteristic::PROPERTY_NOTIFY);
pTxCharacteristic->addDescriptor(new BLE2902());
BLECharacteristic *pRxCharacteristic = pService->createCharacteristic(CHARACTERISTIC_RX, BLECharacteristic::PROPERTY_WRITE);
pRxCharacteristic->setCallbacks(new RxCallbacks());
pService->start();
pServer->getAdvertising()->start();
}
void loop() {
if (deviceConnected && Serial2.available()) {
String uartData = Serial2.readString();
pTxCharacteristic->setValue(uartData.c_str());
pTxCharacteristic->notify(); // 发送 UART 响应到客户端
}
}
4. 升级流程
步骤 1: 触发 Bootloader 模式
- 拉低 MCU 的 Boot 触发引脚(如 P3.2)。
- 复位 MCU,使其启动到 LDROM 中的 ISP_UART Bootloader。
步骤 2: 建立 BLE 连接
- 手机/PC 使用 BLE 扫描并连接 ESP32(名称
ESP32-Bridge)。
- 打开串口工具 App(如 nRF Connect),绑定到 RX/TX 特征。
步骤 3: 发送固件数据
- 客户端发送固件:通过 BLE 将固件二进制文件(
.bin)发送到 RX 特征。
- ESP32 转发:收到数据后通过 UART 转发给 MCU。
- Bootloader 处理:
- MCU Bootloader 解析 UART 数据,写入 APROM。
- 返回响应(如
ACK)通过 ESP32 的 TX 特征通知客户端。
步骤 4: 完成升级
- 固件发送完成后,客户端发送 结束命令(如
0x04 EOT)。
- Bootloader 校验固件并复位,启动 APROM 中的新程序。
- 断开 BLE 连接,释放 Boot 触发引脚。
5. 协议适配
若 Bootloader 使用 YMODEM/XMODEM 协议:
- ESP32 需实现协议转换:
- 将 BLE 数据流封装为 YMODEM 数据包(包括文件名、大小)。
- 解析 MCU 返回的
ACK/NAK,控制传输流程。
- 简化方案:修改 Bootloader 使用自定义简单协议:
- 客户端直接发送原始二进制流。
- Bootloader 按固定长度(如 128 字节)接收并写入 Flash。
6. 调试要点
- 波特率匹配:确保 ESP32 UART 与 Bootloader 波特率相同(如 115200 bps)。
- 流控制:启用硬件流控(RTS/CTS)防止数据丢失(若支持)。
- 超时机制:Bootloader 和 ESP32 需检测超时,防止卡死。
- 日志输出:通过 ESP32 的另一个 UART 打印调试日志到 PC。
7. 安全增强(可选)
- 加密传输:使用 BLE 配对加密(如 LE Secure Connections)。
- 固件签名:Bootloader 验证固件的数字签名后再写入。
- 断点续传:记录传输进度,异常断开后可恢复。
通过以上步骤,即可实现通过 ESP32 BLE 模块升级 MCU 的 APROM 固件。核心在于 ESP32 的桥接功能和 Bootloader 的 IAP 支持,确保数据无缝中转。
要使用带有 IAP 功能的 LDROM 中的 ISP_UART Bootloader,通过 ESP32 BLE 模块升级 APROM 中的固件,需按照以下步骤操作。整个过程涉及硬件连接、固件设计和通信协议实现:
1. 硬件连接
将 ESP32 与目标微控制器(MCU)连接:
- ESP32 TX → MCU UART RX
- ESP32 RX → MCU UART TX
- ESP32 GND → MCU GND
- ESP32 3.3V → MCU VCC(可选,若需供电)
- Boot 触发引脚:MCU 的特定引脚(如 P3.2)接地或拉高,强制启动时进入 LDROM。
2. Bootloader 配置(LDROM)
确保 MCU 的 LDROM 已烧录支持 IAP 的 ISP_UART Bootloader:
- IAP 功能:Bootloader 需支持通过 UART 接收固件并写入 APROM。
- 启动模式:通过硬件引脚(如 P3.2)或寄存器配置,使 MCU 上电时优先运行 LDROM。
- 协议适配:Bootloader 通常使用自定义协议(如 YMODEM/XMODEM)或简单串口协议接收数据。
3. ESP32 固件设计
ESP32 充当 BLE 到 UART 的桥接器,实现以下功能:
(1) BLE 服务端配置
(2) 数据转发逻辑
- 接收 BLE 数据:将客户端写入 RX 特征的数据通过 UART 转发给 MCU。
- 发送 UART 响应:将 MCU 的串口响应(如 ACK/NACK)通过 TX 特征通知客户端。
(3) 关键代码(Arduino 框架示例)
#include
#include
#include
BLECharacteristic *pTxCharacteristic;
bool deviceConnected = false;
class ServerCallbacks: public BLEServerCallbacks {
void onConnect(BLEServer* pServer) { deviceConnected = true; }
void onDisconnect(BLEServer* pServer) { deviceConnected = false; }
};
class RxCallbacks: public BLECharacteristicCallbacks {
void onWrite(BLECharacteristic *pCharacteristic) {
std::string rxData = pCharacteristic->getValue();
if (rxData.length() > 0) {
Serial2.write(rxData.c_str(), rxData.length()); // 转发数据到 UART
}
}
};
void setup() {
Serial2.begin(115200); // MCU UART 波特率(需与 Bootloader 一致)
BLEDevice::init("ESP32-Bridge");
BLEServer *pServer = BLEDevice::createServer();
pServer->setCallbacks(new ServerCallbacks());
BLEService *pService = pServer->createService(SERVICE_UUID);
pTxCharacteristic = pService->createCharacteristic(CHARACTERISTIC_TX, BLECharacteristic::PROPERTY_NOTIFY);
pTxCharacteristic->addDescriptor(new BLE2902());
BLECharacteristic *pRxCharacteristic = pService->createCharacteristic(CHARACTERISTIC_RX, BLECharacteristic::PROPERTY_WRITE);
pRxCharacteristic->setCallbacks(new RxCallbacks());
pService->start();
pServer->getAdvertising()->start();
}
void loop() {
if (deviceConnected && Serial2.available()) {
String uartData = Serial2.readString();
pTxCharacteristic->setValue(uartData.c_str());
pTxCharacteristic->notify(); // 发送 UART 响应到客户端
}
}
4. 升级流程
步骤 1: 触发 Bootloader 模式
- 拉低 MCU 的 Boot 触发引脚(如 P3.2)。
- 复位 MCU,使其启动到 LDROM 中的 ISP_UART Bootloader。
步骤 2: 建立 BLE 连接
- 手机/PC 使用 BLE 扫描并连接 ESP32(名称
ESP32-Bridge)。
- 打开串口工具 App(如 nRF Connect),绑定到 RX/TX 特征。
步骤 3: 发送固件数据
- 客户端发送固件:通过 BLE 将固件二进制文件(
.bin)发送到 RX 特征。
- ESP32 转发:收到数据后通过 UART 转发给 MCU。
- Bootloader 处理:
- MCU Bootloader 解析 UART 数据,写入 APROM。
- 返回响应(如
ACK)通过 ESP32 的 TX 特征通知客户端。
步骤 4: 完成升级
- 固件发送完成后,客户端发送 结束命令(如
0x04 EOT)。
- Bootloader 校验固件并复位,启动 APROM 中的新程序。
- 断开 BLE 连接,释放 Boot 触发引脚。
5. 协议适配
若 Bootloader 使用 YMODEM/XMODEM 协议:
- ESP32 需实现协议转换:
- 将 BLE 数据流封装为 YMODEM 数据包(包括文件名、大小)。
- 解析 MCU 返回的
ACK/NAK,控制传输流程。
- 简化方案:修改 Bootloader 使用自定义简单协议:
- 客户端直接发送原始二进制流。
- Bootloader 按固定长度(如 128 字节)接收并写入 Flash。
6. 调试要点
- 波特率匹配:确保 ESP32 UART 与 Bootloader 波特率相同(如 115200 bps)。
- 流控制:启用硬件流控(RTS/CTS)防止数据丢失(若支持)。
- 超时机制:Bootloader 和 ESP32 需检测超时,防止卡死。
- 日志输出:通过 ESP32 的另一个 UART 打印调试日志到 PC。
7. 安全增强(可选)
- 加密传输:使用 BLE 配对加密(如 LE Secure Connections)。
- 固件签名:Bootloader 验证固件的数字签名后再写入。
- 断点续传:记录传输进度,异常断开后可恢复。
通过以上步骤,即可实现通过 ESP32 BLE 模块升级 MCU 的 APROM 固件。核心在于 ESP32 的桥接功能和 Bootloader 的 IAP 支持,确保数据无缝中转。
举报