🌱 Bootloader - Tìm hiểu cấu trúc file HEX và Cách áp dụng trong lập trình Vi điều khiển
Trong bài viết trước, chúng ta đã thảo luận về hai vấn đề chính mà Bootloader cần quan tâm:
-
Sắp xếp dữ liệu trong bộ nhớ
- Liên quan đến cách thức dữ liệu được lưu trữ theo kiểu Endianness (Little Endian hoặc Big Endian).
👉 Tham khảo bài viết về Endianness để hiểu thêm.
- Liên quan đến cách thức dữ liệu được lưu trữ theo kiểu Endianness (Little Endian hoặc Big Endian).
-
File nhị phân và các định dạng
- Bài viết này tập trung giải thích chi tiết về định dạng file HEX, được sử dụng rộng rãi trong việc nạp chương trình cho vi điều khiển.
1️⃣ Các loại file nhị phân cơ bản
-
Định dạng .BIN
- Đây là định dạng nhị phân đơn giản nhất.
- Không chứa thông tin bổ sung hay relocation.
- Các lệnh được tải trực tiếp đến các địa chỉ cố định trong bộ nhớ.
-
Định dạng .ELF (Executable and Linkable Format)
- Chứa thông tin về symbol, relocation, và hỗ trợ việc nạp chương trình vào các địa chỉ tùy ý.
- ELF thường được dùng trong quá trình debug.
-
Định dạng .HEX
- Định dạng phổ biến, đặc biệt với các dòng vi điều khiển 8-bit.
- Chúng ta sẽ phân tích sâu hơn cấu trúc của file HEX dưới đây.
2️⃣ Tại sao cần hiểu cấu trúc file HEX?
- Trong các ứng dụng Bootloader, việc nạp code không thể phụ thuộc vào các công cụ IDE như thường lệ (VD: Keil, STM32CubeProgrammer).
- Thay vào đó, bạn có thể cần:
- Nạp code qua giao thức không dây (Wi-Fi, Bluetooth) hoặc có dây (UART, SPI, I2C).
- Phân tích dữ liệu từ file HEX và ghi trực tiếp vào bộ nhớ FLASH của vi điều khiển.
- Xử lý các lỗi liên quan đến checksum.
Hiểu cấu trúc file HEX là bước cơ bản để thực hiện những điều trên.
3️⃣ Cấu trúc file HEX
Một file HEX gồm nhiều dòng dữ liệu, mỗi dòng có định dạng mã ASCII với cấu trúc sau:
Thành phần | Kích thước | Ý nghĩa |
---|---|---|
Start Code | 1 ký tự | Luôn bắt đầu bằng dấu hai chấm (: ). |
Byte Count | 1 byte (2 số) | Số byte dữ liệu (Data) trên dòng hiện tại. |
Address | 2 byte (4 số) | Địa chỉ offset của dữ liệu. Địa chỉ thực tế = Base Address + Address. |
Record Type | 1 byte (2 số) | Xác định loại dữ liệu (VD: 00 - Dữ liệu thông thường, 01 - Kết thúc file, 04 - Base Address, ...) |
Data | N byte | Dữ liệu sẽ được nạp vào bộ nhớ FLASH. |
Checksum | 1 byte (2 số) | Giá trị dùng để kiểm tra tính chính xác của dòng dữ liệu. |
Các loại Record Type phổ biến:
4️⃣ Ví dụ phân tích một dòng HEX
- Start Code:
:
- Byte Count:
03
(3 byte dữ liệu). - Address:
0030
(Offset 0x0030). - Record Type:
00
(Dữ liệu thông thường). - Data:
02337A
. - Checksum:
1E
.
Kiểm tra Checksum:
- Tổng tất cả các byte (ngoại trừ checksum):
03 + 00 + 30 + 00 + 02 + 33 + 7A = E2
- Đảo bit của
E2
:1D
. - Cộng thêm
1
:1E
.
Kết luận: Checksum đúng.
Hãy tiếp tục tìm hiểu và thực hành để thành thạo cấu trúc file HEX cũng như cách sử dụng chúng trong các ứng dụng Bootloader.