Được. Hai khái niệm này rất quan trọng, nhưng chúng nằm ở hai tầng hoàn toàn khác nhau.
1. Bootloader là gì?
Bootloader có thể hiểu đơn giản là:
Một chương trình nhỏ chạy trước chương trình chính, có nhiệm vụ chuẩn bị hoặc nạp chương trình chính vào vi điều khiển.
Ví dụ với Arduino:
ATmega328P
┌──────────────────┐
Reset → │ Bootloader │ ← chạy trước
├──────────────────┤
│ │
│ Chương trình │ ← chương trình của bạn
│ Arduino │
│ │
└──────────────────┘
Khi bạn nhấn Upload trong Arduino IDE:
Arduino IDE
↓
USB
↓
USB-UART
↓
ATmega328P
↓
Bootloader
↓
Ghi firmware vào Flash
Bootloader nhận dữ liệu chương trình rồi ghi nó vào vùng Flash thích hợp.
Ví dụ
Bạn viết:
int main(void)
{
LED_ON();
}
Sau khi biên dịch, chương trình trở thành mã máy.
Bootloader có thể nhận mã máy đó:
PC
│
│ firmware
▼
Bootloader
│
│ ghi
▼
Flash
│
▼
Application
Sau khi nạp xong, MCU reset và chạy application.
2. Bootloader có phải lúc nào cũng cần không?
Không.
Đây là điểm rất quan trọng.
Có hai cách phổ biến để nạp MCU.
Cách 1 — Qua bootloader
PC
↓
USB-UART
↓
Bootloader
↓
Flash
Ví dụ:
- Arduino
- ESP32 UART bootloader
- một số STM32 sử dụng UART/USB bootloader
Cách 2 — Dùng debugger/programmer
Ví dụ STM32 + ST-Link:
PC
↓
USB
↓
ST-Link
↓
SWD
↓
STM32
↓
Flash
Ở đây không cần application bootloader trong STM32.
ST-Link có thể điều khiển trực tiếp hệ thống debug của Cortex-M và ghi Flash.
3. Vậy Host Controller là gì?
Host Controller có thể hiểu là:
Bộ điều khiển phía máy chủ (host) chịu trách nhiệm điều khiển giao tiếp USB của máy tính.
Trong trường hợp này:
MÁY TÍNH = USB HOST
còn:
ST-Link
Arduino
USB-UART
USB keyboard
USB mouse
...
là:
USB DEVICE
Sơ đồ:
MÁY TÍNH
┌───────────────────┐
│ CPU │
│ │ │
│ ▼ │
│ USB Host │
│ Controller │
└────────┬──────────┘
│
│ USB
▼
ST-Link
Host Controller là phần cứng giúp máy tính gửi và nhận dữ liệu USB.
4. “Host” nghĩa là gì?
Trong USB có hai vai trò cơ bản:
HOST DEVICE
│ │
│────── USB DATA ────────►│
│◄───── USB DATA ─────────│
Ví dụ:
| Thiết bị | Vai trò |
|---|---|
| PC | USB Host |
| Laptop | USB Host |
| STM32 USB Device | USB Device |
| ST-Link | USB Device |
| CH340 | USB Device |
| USB keyboard | USB Device |
| USB mouse | USB Device |
Vì vậy:
Host Controller = bộ điều khiển USB phía máy tính.
5. Tại sao gọi là “Controller”?
Vì nó điều khiển rất nhiều thứ liên quan đến USB.
Ví dụ khái niệm:
CPU
│
▼
USB Host Controller
│
├── phát hiện thiết bị
├── truyền dữ liệu
├── nhận dữ liệu
├── quản lý USB transfer
├── quản lý endpoint
└── điều phối bus USB
Nó là phần cứng ở tầng thấp.
6. Một ví dụ rất dễ hiểu
Khi bạn cắm ST-Link vào máy tính:
PC
│
│ USB
▼
ST-Link
Máy tính phát hiện:
“Có một USB device mới được cắm vào.”
Host Controller thực hiện phần giao tiếp USB ở mức thấp.
Sau đó hệ điều hành và driver tìm hiểu:
“Thiết bị này là ST-Link.”
Phần mềm STM32 có thể bắt đầu giao tiếp với nó.
Sau đó:
STM32CubeIDE
↓
ST-Link software/driver
↓
USB Host Controller
↓
USB
↓
ST-Link
↓
SWD
↓
STM32
7. Điểm rất quan trọng: Host Controller ≠ Driver
Hai thứ này rất dễ nhầm.
Host Controller
Là phần cứng.
USB Host Controller
↑
hardware
Driver
Là phần mềm chạy trên máy tính.
Operating System
↓
USB Driver
↓
USB Host Controller
↓
USB
Có thể hình dung:
PHẦN MỀM
┌────────────────┐
│ Application │
└───────┬────────┘
↓
┌────────────────┐
│ Driver │
└───────┬────────┘
↓
PHẦN CỨNG
┌────────────────┐
│ USB Host │
│ Controller │
└───────┬────────┘
↓
USB
8. Quay lại STM32 của bạn
Bạn đang dùng STM32F103C8T6.
Nếu dùng ST-Link:
STM32CubeIDE
│
▼
ST-Link software
│
▼
USB Driver
│
▼
USB Host Controller
│
▼
USB cable
│
▼
ST-Link MCU
│
▼
SWD
│
▼
STM32F103C8T6
Còn nếu dùng bootloader UART:
STM32F103
▲
│ UART
│
USB-UART
▲
│ USB
│
USB Host Controller
▲
│
USB Driver
▲
│
STM32CubeProgrammer
Hai phương pháp này khác nhau về bản chất.
9. Bạn chỉ cần nhớ 2 câu
Bootloader:
🧠 Một chương trình nhỏ bên trong MCU, thường chạy khi khởi động để nhận/nạp/chuyển quyền sang chương trình chính.
Host Controller:
🔌 Phần cứng điều khiển giao tiếp USB ở phía máy tính (USB Host).
Và nếu nối với câu hỏi trước của bạn thì toàn bộ hệ thống sẽ trở nên rất rõ:
MÁY TÍNH
│
┌───────▼────────┐
│ Application │
│ CubeIDE/Arduino │
└───────┬────────┘
▼
Driver
▼
USB Host Controller
│
USB
│
┌───────▼────────┐
│ Mạch trung gian │
│ ST-Link/CH340 │
│ PICkit/J-Link │
└───────┬────────┘
│
SWD/UART/JTAG
│
┌───────▼────────┐
│ MCU │
│ │
│ Bootloader │ ← nếu sử dụng
│ hoặc │
│ Debug interface │
└─────────────────┘
Đây chính là “chuỗi” mà máy tính đi qua để cuối cùng tác động được đến Flash của một con STM32/AVR/PIC/ESP32.

