Course contentsShow
← Embedded Systems & Computer Architecture
Lesson 483 of 9366. Embedded Software Construction and ToolchainsFree lesson

Developing Serial Bootloader Communication Interfaces

Learners will implement a UART or USB-based protocol to transfer new firmware images from a host computer to the embedded device.

In this lesson, you will learn how to design a reliable serial communication interface to bridge the gap between a host computer and your embedded device for firmware delivery.

When your device enters bootloader mode, it must stop its primary application and listen for a data stream containing the new binary image. Whether you use UART (RS-232/TTL) or USB (via CDC class), the interface must be resilient to noise, timing issues, and partial transfers.

The Handshake Mechanism

A professional serial bootloader interface requires a handshake. Instead of blindly sending data, the host should first send a "synchronization" command. The bootloader responds with a "ready" status, identifying the hardware version to ensure the binary is compatible. This prevents flashing firmware meant for a different board revision.

Packetizing the Firmware

You should never send a raw binary stream without structure. By breaking the firmware into discrete packets, you gain the ability to verify each segment before it reaches the flash memory. A typical packet structure looks like this:

typedef struct {
    uint8_t start_byte;   // e.g., 0xAA
    uint16_t packet_id;   // Sequence number
    uint8_t payload_len;  // Length of firmware data
    uint8_t data[64];     // The actual firmware bytes
    uint16_t crc16;       // Checksum for integrity
} boot_packet_t;

The Communication Loop

Once the handshake is established, the interface enters a loop:

  1. Receive Packet: Buffer incoming bytes until the full packet_id and payload_len are reached.
  2. Validate: Perform a CRC check on the received payload. If the CRC fails, send a "NACK" (negative acknowledgment) to the host to request a retransmission of that specific packet.
  3. Program: If valid, trigger your IAP (In-Application Programming) driver to write the data to the pre-partitioned flash sector.
  4. Acknowledge: Send an "ACK" to tell the host to proceed to the next packet.

By implementing this request-response cycle, your bootloader becomes immune to minor serial glitches, ensuring that only verified, bit-perfect data is ever committed to your device's non-volatile memory.

Key Takeaway: Robust bootloader communication relies on packetized data transfers with explicit handshaking and per-packet integrity verification to ensure successful firmware deployment.