新唐MCU技术
直播中

石胜厚

8年用户 1142经验值
私信 关注
[问答]

如何使用 Bootloader 通过 BLE 模块升级 APROM?


  • 使用具有 IAP 模式功能的 LDROM 中的ISP_UART引导加载程序,通过 ESP32 BLE 模块升级 APROM 中的固件

回帖(1)

贾大林

2025-8-25 17:44:31

要使用带有 IAP 功能的 LDROM 中的 ISP_UART Bootloader,通过 ESP32 BLE 模块升级 APROM 中的固件,需按照以下步骤操作。整个过程涉及硬件连接、固件设计和通信协议实现:




1. 硬件连接


将 ESP32 与目标微控制器(MCU)连接:



  • ESP32 TXMCU UART RX  

  • ESP32 RXMCU UART TX  

  • ESP32 GNDMCU GND  

  • ESP32 3.3VMCU 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 服务端配置



  • 创建 BLE 服务:定义包含以下特征的 UART 服务:

    • RX 特征(客户端写入):接收来自手机/PC 的固件数据。

    • TX 特征(通知):向客户端发送升级状态。


  • UUID 示例
    #define SERVICE_UUID        "6E400001-B5A3-F393-E0A9-E50E24DCCA9E"
    #define CHARACTERISTIC_RX   "6E400002-B5A3-F393-E0A9-E50E24DCCA9E"
    #define CHARACTERISTIC_TX   "6E400003-B5A3-F393-E0A9-E50E24DCCA9E"


(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 模式



  1. 拉低 MCU 的 Boot 触发引脚(如 P3.2)。

  2. 复位 MCU,使其启动到 LDROM 中的 ISP_UART Bootloader。


步骤 2: 建立 BLE 连接



  1. 手机/PC 使用 BLE 扫描并连接 ESP32(名称 ESP32-Bridge)。

  2. 打开串口工具 App(如 nRF Connect),绑定到 RX/TX 特征


步骤 3: 发送固件数据



  1. 客户端发送固件:通过 BLE 将固件二进制文件(.bin)发送到 RX 特征。

  2. ESP32 转发:收到数据后通过 UART 转发给 MCU。

  3. Bootloader 处理

    • MCU Bootloader 解析 UART 数据,写入 APROM。

    • 返回响应(如 ACK)通过 ESP32 的 TX 特征通知客户端。



步骤 4: 完成升级



  1. 固件发送完成后,客户端发送 结束命令(如 0x04 EOT)。

  2. Bootloader 校验固件并复位,启动 APROM 中的新程序。

  3. 断开 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 支持,确保数据无缝中转。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分