Thuật toán kiểm tra lỗi tập tin firmware STM32 định dạng HEX và định dạng BIN

Các tính năng bootloader hay cập nhật chương trình từ xa (FOTA) cần áp dụng “in-application programming”. Khi đó, firmware của thiết bị không được nạp trực tiếp qua các chuẩn nạp chương trình như JTAG/SWD. Firmware có thể được truyền trực tiếp từ phần mềm máy tính hoặc qua môi trường internet xuống thiết bị, các chuẩn giao tiếp phổ biến được sử dụng ở vi điều khiển nhận dữ liệu tập tin firmware là UART hoặc USB,… Việc không sử dụng một chuẩn nạp chương trình chính thống được tích hợp sẵn và tập tin firmware có thể đi qua nhiều quá trình/ môi trường khác nhau như qua phần mềm máy tính, qua Internet…vv…có thể làm xuất hiện lỗi. Vì vậy để đảm bảo độ tin cậy cho firmware trước khi ghi vào bộ nhớ Flash của vi điều khiển và thực thi nó như một chương trình chính thì việc kiểm tra lỗi tập tin là một công đoạn quan trọng cần thực hiện. 

Có hai định dạng thường sử dụng là tập tin định dạng HEX và tập tin định dạng BIN, các bạn cần tìm hiểu chi tiết qua bài viết Cấu trúc tập tin chương trình nạp cho vi điều khiển. để có thể hiểu được các nội dung chia sẻ tại bài viết này. 

Đối với tập tin định dạng HEX: Sau khi tải một phần hoặc toàn bộ tập tin chương trình về lưu trữ tạm thời tại SRAM, từng dòng dữ liệu sẽ được kiểm tra độ toàn vẹn trước khi được lưu vào bộ nhớ Flash. Kiểm tra lỗi tập tin về bản chất là kiểm tra trường checksum của mỗi dòng trong tập tin. Trường checksum trong tập tin định dạng HEX được tạo ra như sau:

  • Bước 1: Tính tổng toàn bộ các byte trong record trừ trường Start code và trường Checksum
  • Bước 2: Lấy phần bù của 2 byte có trọng số nhỏ nhất trong giá trị tính tổng trên.
  • Bước 3: Checksum Value = 1+ (NOT ((tổng)))

Dựa vào những thông tin trên, giản đồ quy trình kiểm tra checksum được xây dựng dưới thiết bị nhúng như hình 1: 

Hình 1. Giản đồ quy trình kiểm tra checksum

 

Đối với tập tin định dạng BIN: Nhiều dòng vi điều khiển STM32 được tích hợp sẵn phần cứng tính toán CRC và vi điều khiển STM32F411 được sử dụng trên bảng mạch thử nghiệm cũng vậy. Lợi ích của việc thực hiện tính toán CRC trên khối phần cứng được tích hợp trong vi điều khiển STM32 chính là thời gian thực hiện tính toán nhanh hơn gần 60 lần so với thời gian thực hiện tính toán CRC bằng chương trình thuật toán. Khối phần cứng CRC được thiết kế dựa trên CRC-32/MPEG-2, có giá trị POLY=0x04c11db7 và Initial_Crc=0xFFFFFFFF. 

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

Khối tính toán CRC có một thanh ghi dữ liệu đọc/ghi 32-bit (32-bit data register), thanh ghi này được dùng như thanh ghi input để đưa dữ liệu vào khối tính toán CRC và giữ kết quả CRC của phép tính trước.

 

Hình 2. Khối tính toán CRC trong vi điều khiển STM32

Hoạt động của khối phần cứng như sau: Đầu tiên, XOR giá trị Input_Data (32-bit) với Initial_Crc. Nếu bit MSB của kết quả CRC vừa XOR bằng 0 thì dịch CRC qua trái 1 đơn vị, nếu MSB bằng 1 thì dịch CRC qua trái rồi XOR với giá trị POLY ở trên. Tiếp tục thực hiện so sánh bit MSB của Crc cho đến khi tất cả các bit Input_Data đều được xử lý. Kết quả cuối cùng chính là giá trị CRC (32-bit) của quá trình tính CRC.

Hình 3. Giản đồ quy trình kiểm tra CRC

Giải pháp kiểm tra lỗi, độ toàn vẹn dữ liệu sử dụng CRC được lựa chọn đối với tập tin định dạng BIN. Giá trị CRC được tính toán theo thuật toán CRC-32/MPEG-2, có giá trị POLY=0x04C11DB7 và Initial_Crc=0xFFFFFFFF. Giá trị CRC này sẽ được ghi vào vị trí cuối của tập tin trước khi tập tin được truyền xuống vi điều khiển. 

Nhóm nghiên cứu đã viết phần mềm TAPIT_FOTA_Supporting_Tool_v1.0 được thiết kế để thực hiện việc này. Phần mềm sẽ tạo tập tin BIN mới bằng cách đọc nội dung của tập tin định dạng BIN sau khi trình biên dịch tạo thành và tách lần lượt 32-bit dữ liệu, sau đó đảo thứ tự các cặp byte để ghi vào tập tin. Ví dụ thiết bị nhận được 4 byte đầu tiên là 0xE0, 0x13, 0x00, 0x20, phần mềm sẽ đảo thứ tự các cặp byte lại thành 0x20, 0x00, 0x13, 0xE0 và tính CRC cho 32bit dữ liệu đó. Sau khi quá trình tính CRC hoàn thành, phần mềm sẽ ghi thêm kết quả CRC vào cuối tập tin chương trình mới. 

Chúc các bạn thành công. 
Thuong Nguyen và các thành viên nhóm nghiên cứu!

Tìm hiểu thêm:
[HỌC ONLINE TẠI TAPIT: LẬP TRÌNH VI ĐIỀU KHIỂN STM32, VI XỬ LÝ ARM CORTEX – M]
Xem thêm Tổng hợp các bài hướng dẫn Lập trình vi điều khiển STM32 tại đây.
Xem thêm Tổng hợp hướng dẫn Internet of Things với NodeMCU ESP8266 và ESP32 tại đây.

Tài liệu tham khảo:
– STM32 in-application programming (IAP) using the USART
– Reference manual STM32F411xC/E advanced Arm®-based 32-bit MCUs