Site icon TAPIT

Cập nhật chương trình từ xa trên vi điều khiển STM32 – Firmware Over The Air (FOTA) – P3

Trong 2 phần trước của chuỗi bài viết hướng dẫn cập nhật chương trình từ xa (FOTA) cho dòng vi điều khiển STM32F103 mình đã trình bày về tổng quan, các điều kiện và phân chia chức bộ nhớ của MCU để thực hiện FOTA ở Phần 1 cũng như hướng dẫn cách viết một chương trình Bootloader ở Phần 2. Trong phần này mình sẽ giải thích về tập tin chứa nội dung chương trình (firmware) ở định dạng Intel HEX mà chúng ta sẽ sử dụng trong quá trình FOTA. Các bạn nên đọc qua phần 1 và phần 2 trước để nắm toàn bộ ý tưởng, nội dung của chuỗi bài viết này. Những hướng dẫn của mình cũng có thể được tham khảo để áp dụng cho những dòng vi điều khiển khác.

[HỌC ONLINE: LẬP TRÌNH VI ĐIỀU KHIỂN STM32, VI XỬ LÝ ARM CORTEX – M]

Phần 3: Hiểu tập tin chương trình ở định dạng Intel HEX được sử dụng trong quá trình FOTA

1. Tập tin chương ở định dạng Intel HEX là gì?

Nó là một tập tin chứa nội dung chương trình cùng các thông tin chỉ dẫn với 6 loại HEX record khác nhau theo định dạng Intel HEX. Mỗi record sẽ bao gồm nhiều ký tự ASCII biểu diễn các giá trị theo mã hexadecimal. Trong quá trình FOTA, từ File Intel HEX chúng ta phải tách nội dung chương trình ra và lưu vào bộ nhớ flash của vi điều khiển theo các chỉ dẫn địa chỉ đi kèm trong file.

Khi mở file firmware chúng ta nhìn thấy một loạt các chuỗi kí tự tương tự như sau:

Chúng ta cần phải hiểu được cấu trúc của chuỗi kí tự này mới có thể cập nhật được chương trình cho thiết bị. Bắt đầu thôi!

Mỗi record (hàng) sẽ thường sẽ có 6 trường (field), mỗi trường sẽ có nhiệm vụ riêng. Mỗi hàng có thể kết thúc bằng kí tự CR(0x13)/LF(0x0A)/NULL(0x00).

Tham khảo thêm về cấu trúc của file Intel HEX tại đây

2. Một số ví dụ

Một Intel HEX file phải được kết thúc với một End of File Record.

Khi có record này trong file chương trình thì các địa chỉ lưu dữ liệu trong Data record tiếp theo đó sẽ được cộng với 0x0800 0000 cho đến khi xuất hiện một dòng chứa extended linear address record khác thay thế.
Extended linear address mặc định bằng 0x0000 nếu trong file chương trình không xuất hiện extended linear address record.

Tiếp theo, dòng thứ 2 có record type = 00 nên đây là data record

Start code Byte count Address Record type Data Checksum
: 10 5000 00 F03E…0108 BB

º  0x10 là số lượng data byte có trong record
º  0x5000 là giá trị 16 bit thấp (0-15) của địa chỉ mà dữ liệu sẽ được lưu trong bộ nhớ
º  00 là record type (Data record)
º  F03E…0108 là dữ liệu cần lưu vào bộ nhớ chương trình 
º  BB là giá trị checksum của record.

Dữ liệu mà bạn sẽ lưu vào trong bộ nhớ sẽ lấy từ Data record này. Dữ liệu tại dòng 1 là

F03E0020 01510008 835C0008 F35B0008

Có tổng cộng 16 byte sẽ được lưu vào trong bộ nhớ bắt đầu từ địa chỉ 0x08005000 đến 0x0800500F.
Vậy nó được lưu như thế nào? Ta thử nạp trực tiếp chương trình và kiểm tra bộ nhớ nhé:

Hình như có sự khác nhau? Ta sẽ chia dữ liệu 4byte thành 1 bộ rồi so sánh nào:

Địa chỉ Dữ liệu trong file Dữ liệu trong bộ nhớ
0x08005000 20 00 3E F0 F0 3E 00 20
0x08005004 01 51 00 08 08 00 52 0F
0x08005008 83 5C 00 08 08 00 5C 83
0x0800500C F3 5B 00 08 08 00 5B F3

Từ bảng trên ta có thể thấy sự khác nhau giữa dữ liệu từ trong file chương trình và dữ liệu trong bộ nhớ. Có thể thấy cứ 1 bộ 4 byte thì byte thứ 1 sẽ chuyển thành byte 4, byte 2 chuyển thành byte 3,… như hình dưới.

Từ sự khác nhau đó, chúng ta có viết code để có thể nạp chương trình từ file Intel HEX vào trong bộ nhớ Flash của vi điều khiển STM32 rồi 😀

3.Làm cách nào chúng ta có thể tạo ra một file chương trình?

Để tạo file chương trình (đuôi .hex) bằng KeilC IDE thì làm các bước như sau:

Bước 1: Vào Option -> Tab Output -> Kích chọn Create Executable -> Create HEX File
Bước 2: Thư mục mặc định lưu file chương trình là MDK-ARM/YourProjectName. Thay đổi thư mục lưu tại Select Folder for Objects
Bước 3: Thay đổi tên file chương trình tại Name of Executable
Bước 4: Chọn OK rồi Build thôi! 😆 

Sau khi build thì file chương trình sẽ được như sau:

Đơn giản phải không nào   

=================================================

Bài viết này giúp bạn có thể hiểu về cấu tạo của một file chương trình Intel HEX và cách tạo file chương trình từ phần mềm KeilC. Dựa vào những thông tin này, bài viết tiếp theo sẽ trình bày về cách viết một chương trình FOTA.

Xem tiếp phần 4: Chương trình FOTA và cách chuyển các chương trình trong mô hình FOTA

Theo dõi thêm:
– Cơ bản về cấu trúc và tính năng Vi xử lý ARM Cortex – Mx. 
– Phân biệt các khái niệm Processor Core, Processor và Microcontroller trong Hệ thống nhúng
– Tổng hợp các bài hướng dẫn Lập trình vi điều khiển STM32F1
– Tổng hợp hướng dẫn Lập trình vi điều khiển STM32F4

Chúc các bạn thành công!

Nhóm TAPIT ARM R&D