Ở 3 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 tổng quan về FOTA ở phần 1, cách viết chương trình Bootloader ở phần 2, và giải thích về cấu trúc của một file chương trình Intel HEX ở phần 3. Trong phần này mình sẽ hướng dẫn cách lập trình cho chương trình FOTA. Các bạn nên đọc 3 phần trước thật kĩ nhé vì phần 4 này liên kết với 3 phần đó. Những hướng dẫn này cũng có thể tham khảo và áp dụng cho các 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 4: Chương trình FOTA và cách chuyển các chương trình trong mô hình FOTA
1.Chương trình FOTA
Để sử dụng tính năng FOTA, bộ nhớ chương trình trong STM32F103RCT6 sẽ chia làm 4 chương trình chính tại 4 vị trí khác nhau là: Bootloader Firmware, FOTA Firmware, Factory Firmware và Current Firmware. Trong đó, FOTA Firmware có nhiệm vụ thực hiện việc cập nhật chương trình bằng cách kết nối, tải chương trình mới từ server về và lưu vào bộ nhớ flash để thay đổi Current Firmware cho cho thiết bị.
Sơ đồ dưới đây mô tả quá trình hoạt động của thiết bị khi chương trình FOTA được khởi chạy. Vì chương trình này phải thực hiện nhiều công việc có chức năng khác nhau, nên dùng sơ đồ FSM sẽ dễ dàng hơn so với lưu đồ thuật toán để các bạn hình dung được ý tưởng thiết kế. Việc thiết bị chuyển đổi từ trạng thái này sang trạng thái khác sẽ dựa trên điều kiện kết quả thực hiện được của từng trạng thái.
Ta sẽ phân tích một số trạng thái trong sơ đồ:
- Dời bảng vector:
Đây là bước đầu tiên bắt buộc phải có. Các bạn có thể xem lại hướng dẫn tại ở mục 2, phần 2 trong chuỗi bài viết.
- Kết nối Internet + Truy cập Server bằng giao thức FTP
Ở phần kết nối Internet, Module SIM800C đã hỗ trợ tập lệnh AT giúp chúng ta có thể kết nối với Internet và truy cập Server một cách dễ dàng. Các bạn có thể tham khao tại bài viết Giao thức FTP sử dụng STM32F103 và module SIM.
- Kiểm tra phiên bản Firmware trên Server
Bạn thường thấy các firmware khi các bạn tải các phần mềm thường sẽ có version.
Các version khi download phần mềm STM32CubeMX
Version sẽ giúp chúng ta phân biệt được đâu là chương trình mới và đâu là chương trình cũ. Cấu trúc của nó thường là: major.minor.patch (Tham khảo về cấu trúc đặt version tại link sau: Software_versioning)
Trước khi download chương trình về, chúng ta sẽ phải kiểm tra xem firmware trên Server có phải firmware mới hơn không?
Và để so sánh thì trong thiết bị của chúng ta cũng phải lưu lại version chương trình hiện tại mà thiết bị đang chạy, và nó thường sẽ được lưu vào một vị trí trong bộ nhớ Flash.
Trong ví dụ này, file trên Server của mình sẽ có tên là V1.0.0.hex
Gợi ý: Khi sử dụng module SIM800C thì các bạn có thể sử dụng tập lệnh AT+FTPLIST để lấy tên của file.
Sau khi lấy được version của file trên Server ta sẽ phải so sánh với version của firmware đã được lưu trong thiết bị.
– Nếu version trên Server cao hơn thì sẽ download firmware mới về để lưu vào bộ nhớ chương trình.
– Nếu version trên Server thấp hơn hoặc bằng thì sẽ chạy lại Firmware cũ.
- Download Firmware, Kiểm tra dữ liệu và Lưu vào bộ nhớ Flash
Trong ví dụ này, file chương trình của mình khá nhỏ nên mình sẽ download toàn bộ file chương trình trước, sau đó kiểm tra dữ liệu, và cuối cùng sẽ lưu vào trong bộ nhớ Flash. Trong trường hợp firmware có kích thước lớn so với bộ nhớ RAM thì cần phải chia ra và tải nhiều lần.
Bước 1: Download toàn bộ file chương trình
Ở đây, sẽ sử dụng phương thức GET trong giao thức FTP để download file về.
Bước 2: Kiểm tra dữ liệu
Kiểm tra dữ liệu của một file Intel HEX về bản chất là kiểm tra trường checksum từng record trong file (Các bạn có thể xem lại ở phần 3). Từ đó, mình sẽ đưa ra lưu đồ thuật toán tổng quát để kiểm tra như sau:
Bước 3: Lưu chương trình vào trong bộ nhớ Flash
Nếu Firmware bạn đã kiểm tra đúng thì lúc này phải lưu vào bộ nhớ chương trình. Lưu đồ thuật toán sẽ như sau
Để lưu, xóa bộ nhớ Flash, các bạn có thể tham khảo bài viết Các thao tác đọc, ghi và xóa bộ nhớ Flash trên MCU STM32F103C8T6 hoặc Tổ chức bộ nhớ Flash trên chup STM32F411VE.
- Nhảy tới Firmware cũ và Nhảy tới Firmware mới
Ở đây bạn có thể làm theo bước 6 như trong chương trình Bootloader ở phần 2. Tuy nhiên, cách này có một nhược điểm của cách này là mình sẽ không biết thiết bị sau khi reset thì nó thực hiện là chương trình nào. Vì vậy mình sẽ trình bày một cách ở mục 2 dưới đây.
2. Cách chuyển các chương trình trong mô hình FOTA
Sau khi đã lập trình các chương trình rồi, vậy có một vấn đề sau: Khi thiết bị bị reset thì làm sao nó biết nó sẽ chạy ở chương trình nào: Factory Firmware, Current Firmware hay FOTA Firmware?
Lúc này trong bộ nhớ Flash ta nên lưu một giá trị, mục đích để xác định chương trình tiếp theo mà nó sẽ chạy. Lúc này, ta sẽ phải đọc giá trị này ra và từ đó xác đinh vị trí chương trình cần thực thi, nhiệm vụ này sẽ được thực hiện ở bước 1 trong chương trình Bootloader.
Giả sử byte đó được lưu ở vị trí 0x8020400 trong bộ nhớ Flash. Mình sẽ ví dụ bước 1 trong chương trình Bootloader một đoạn chương trình sau:
//Buoc 1 chuong trinh Bootloader
uint32_t diachibatdauchuongtrinh;
uint8_t FWSelection;
FWSelection = *((uint8_t *)0x8020400);
if(FWSelection == 0x02) diachibatdauchuongtrinh = 0x8013800;
else if(FWSelection ==0x01) diachibatdauchuongtrinh = 0x800E800;
else diachibatdauchuongtrinh = 0x8002000;
Vậy để khi bạn muốn chuyển từ chương trình này qua chương trình khác, bạn chỉ cần thay đổi giá trị trong địa chỉ 0x8020400 của bộ nhớ Flash, sau đó reset MCU là được.
Lưu ý rằng địa chỉ này không được nằm trong các page của bộ nhớ các chương trình vì khi thay đổi giá trị này nó sẽ xóa luôn chương trình của các bạn.
Dưới đây là hàm để reset mềm vi điều khiển STM32:
NVIC_SystemReset();
Lời kết: Vậy là thông qua 4 bài viết trong chuỗi bài viết “Cập nhật chương trình từ xa trên vi điều khiển STM32 – Firmware Over The Air (FOTA)”, mình đã hướng dẫn cho các bạn xong một mô hình FOTA cơ bản để thực hiện cập nhật chương trình từ xa trên vi điều khiển STM32F103RCT6. Hi vọng sau các bài viết này, các bạn có thể hiểu thêm về Firmware Over The Air, sau đó có thể tối ưu và phát triền tiếp các mô hình khác phù hợp với các ứng dụng của các bạn.
Phần tiếp theo: Cập nhật firmware sử dụng file BIN thay cho file Intel HEX
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