Tải tập tin Firmware chương trình và ghi chương trình vào bộ nhớ Flash trong ứng dụng FOTA STM32

Tải tập tin Firmware chương trình và ghi chương trình vào bộ nhớ Flash là hai bước quan trọng cần được thiết kế kỹ  trong ứng dụng cập nhật chương trình từ xa FOTA. Trong bài viết này, mình chia sẻ thiết kế thực tế mà mình đã thực hiện và thử nghiệm thành công. 

1/Tải tập tin chương trình

Phương án cập nhật chương trình từ xa được mình lựa chọn là sử dụng hai phân vùng A và B chứa hai chương trình với phiên bản gần nhất và cập nhật xen kẽ nhau. Trong trường hợp cập nhật thất bại thì thiết bị sẽ quay về phiên bản gần nhất.

Ví dụ chương trình ứng dụng thiết bị đang chạy là 1.5 ở phân vùng A và ở phân vùng B thiết bị có phiên bản 1.4. Khi trên máy chủ quản lý tập tin có phiên bản 1.6 thì thiết bị sẽ tiến hành cập nhật phiên bản 1.6 vào vị trí phân vùng B. Sau đó thiết bị sẽ chạy phiên bản 1.6 ở phân vùng B và có phiên bản 1.5 ở phân vùng A.  Nếu quá trình cập nhật phiên bản 1.6 thất bại thì thiết bị vẫn chạy phiên bản 1.5

Phần đầu của mỗi chương trình ứng dụng là bảng vector ngắt chứa các địa chỉ dẫn đến các trình phục vụ tương ứng với các vector ngắt đó. Trên môi trường phát triển tích hợp (IDE) khi biên dịch chương trình ta phải cấu hình vị trí chương trình nằm ở phân vùng nào trong bộ nhớ. Ví dụ nếu chương trình được biên dịch với địa chỉ bắt đầu là địa chỉ của chương trình ứng dụng vị trí A thì khi thiết bị cập nhật chương trình phải cập nhật vào đúng vị trí A. Nếu không chương trình sẽ không thể hoạt động do bảng vector ngắt trỏ sai vị trí. Tương tự với chương trình được biên dịch với địa chỉ bắt đầu ở vị trí B.

Trong quá trình sử dụng thì không phải lúc nào thiết bị cũng được cập nhật tuần tự từ phiên bản 1.0 lên phiên bản 1.1, 1.2,1,3…mà có lúc thiết bị không được sử dụng trong một khoảng thời gian dài dẫn đến phiên bản của thiết bị là 1.0 nhưng phiên bản trên máy chủ quản lý tập tin đã là 1.4. Nghĩa là phiên bản cập nhật tiếp theo có thể được cập nhật vào bất kì vị trí A hoặc B không theo một quy luật cố định. Để giải quyết vấn đề này mỗi chương trình đều được cấu hình biên dịch cho cả hai vị trí A và B. Ví dụ chương trình ứng dụng phiên bản 1.4 sẽ được đặt tên tập tin là 1.4.0 và 1.4.1 với 1.4.0 là chương trình ứng dụng phiên bản 1.4 được biên dịch cho vị trí A và 1.4.1 là chương trình ứng dụng phiên bản 1.4 được biên dịch cho vị trí B.

Thiết bị nhúng/IoTs tự quản lý phiên bản hiện tại của chính thiết bị và sẽ quyết định lựa chọn phiên bản mới với vị trí phù hợp cho mỗi lần cập nhật. Sau khi kết nối đến FTP server thành công thì quy trình tải tập tin sẽ được tiếp tục như sau (mình đang ví dụ sát với Module 3G/4G của hãng Quectel, tuy nhiên quy trình sẽ tương tự nếu các bạn sử dụng Module 3G/4G của các hãng khác như SIMCOM và kể cả Module Wifi, Ethernet):

Bước 1: Cấu hình đường dẫn chứa tập tin chương trình thông qua hàm FTP_setPath, nếu cấu hình thất bại, bỏ qua quá trình OTA, nếu quá trình thành công chuyển sang Bước 2.

Hình 1. Giản đồ quy trình cấu hình đường dẫn chứa tập tin chương trình

 

Bước 2: Xác định tên đầy đủ của tập tin, cũng chính phiên bản tập tin sẽ tải về bằng cách bằng cách kết hợp tên phiên bản của tập tin và vị trí tập tin sẽ được lưu vào bộ nhớ. Nếu chương trình hiện tại đang ở vị trí FW0 thì sẽ tải tập tin được biên dịch cho vị trí FW1, và nếu chương trình hiện tại đang ở vị trí FW1 thì sẽ tải tập tin được biên dịch cho vị trí FW0.

Hình 2. Giản đồ quy trình chọn tập tin tải về

 

Bước 3: Lấy thông tin kích thước của tập tin cần tải thông qua hàm FTP_getFileSize. Nếu tập tin tồn tại, hàm sẽ trả về kích thước của tập tin, nếu tập tin không tồn tại hoặc xảy ra lỗi thì kết thúc quá trình tải tập tin tại đây.

Hình 3. Giản đồ quy trình xác định kích thước tập tin tải về

 

Bước 4: Tải tập tin sẽ được tải về một hoặc nhiều lần tùy thuộc vào kích cỡ của tập tin so với bộ đệm nhận dữ liệu (phương pháp lưu trữ một phần, lưu trữ nhiều phần và lưu trữ toàn phần). Hàm FTP_downloadFile sẽ được sử dụng để tải tập tin chương trình.
Xem thêm: Các phương pháp lưu trữ tập tin tại đây

Hình 4. Giản đồ quy trình tải tập tin định dạng BIN

Hình 5.Giản đồ quy trình tải tập tin định dạng HEX

 

2/Ghi tập tin vào bộ nhớ

Trước khi ghi chương trình mới vào bộ nhớ Flash cần thực hiện xóa nội dung chương trình cũ đang có tại tại đây. Để xóa một vùng nhớ Flash cần thực hiện các bước sau:

Bước 1: Mở khóa truy cập bộ nhớ Flash

Bước 2: Thực hiện xóa vùng nhớ Flash. Bắt đầu xóa từ địa chỉ bắt đầu của vùng nhớ, xóa đến địa chỉ cuối cùng của vùng nhớ đã được phân vùng cho chương trình ứng dụng.

Bước 3: Nếu bộ nhớ Flash phân vùng theo Page thì thực hiện xóa lần lượt các Page trong phân vùng, ngược lại nếu phân vùng theo Sector thì xóa lần lượt các Sector có trong phân vùng.

Sau khi xóa xong phân vùng dành cho chương trình mới thì mỗi lần tải nội dung tập tin thành công thì thiết bị tiến hành lưu nội dung đó vào bộ nhớ Flash. Khi tải thất bại thì thực hiện lại tải quá trình tải không quá 2 lần, nếu tiếp tục thất bại thì thiết bị sẽ kết thúc quá trình tải tập tin. Nếu toàn bộ quá trình tải và ghi tập tin vào bộ nhớ Flash thành công thì sẽ thực hiện khóa truy cập bộ nhớ Flash.

Hình 6. Giản đồ quy trình tải và ghi chương trình vào bộ nhớ FLASH

Phân tiếp theo: Kiểm tra kiểm tra lỗi tập tin firmware STM32 định dạng HEX và định dạng BIN trong ứng dụng FOTA

Tìm hiểu thê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.

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