Có, bạn có thể thực hiện cập nhật chương trình cơ sở từ xa với STM32.
Bây giờ bạn có hai lựa chọn:
- sử dụng bộ tải khởi động được lập trình tại nhà máy của STM32
- viết bộ nạp khởi động của riêng bạn
Sử dụng bộ tải khởi động được lập trình tại nhà máy yêu cầu khởi động chip bằng pin BOOT1 kéo thấp và BOOT0 kéo lên cao và mô-đun Bluetooth cần được kết nối với một thiết bị ngoại vi USART cụ thể (có các giao diện khác, tùy thuộc vào kiểu STM32 cụ thể, nhưng tôi giả sử USART có ý nghĩa nhất ở đây). Ngoài ra, bạn cần viết một ứng dụng để giao diện với bộ nạp khởi động, theo giao thức lệnh của bộ nạp khởi động được ghi lại ở đây . Để tránh việc viết mã để giao diện với bộ tải khởi động, bạn có thể sử dụng ứng dụng trình diễn Flash Loader STM32 ; tất nhiên, điều này đòi hỏi đầu kia của kết nối Bluetooth phải được cắm vào PC, vì vậy nó không có ý nghĩa trong mọi tình huống.
Khả năng khác là viết bootloader của riêng bạn, giúp bạn kiểm soát nhiều hơn. Ví dụ, bạn có thể kích hoạt bộ tải khởi động bằng trình tự chỉ phần mềm, do đó bạn không cần phải đặt một số chân nhất định theo yêu cầu của bộ tải khởi động được lập trình tại nhà máy. Tất nhiên, việc viết một bộ nạp khởi động như vậy đòi hỏi nhiều nỗ lực hơn so với việc sử dụng một bộ đã được viết, thử nghiệm và vận chuyển với MCU.
Một số ý kiến ngắn gọn về việc viết bootloader của riêng bạn. Bootloader là một đoạn mã phần sụn giống như bất kỳ phần mềm nào khác. Nó được tải vào MCU trong quá trình sản xuất (hoặc gỡ lỗi) cùng với mã chính.
Mặc dù là mã giống như bất kỳ mã nào khác, vì bộ tải khởi động được sử dụng để lập trình lại chương trình cơ sở của MCU, nên nó có một vài cân nhắc đặc biệt. Trước hết, để đơn giản, bạn có thể muốn biến bộ nạp khởi động của mình thành một đoạn mã hoàn toàn riêng biệt với mã chính của bạn. Chỉnh sửa các tập lệnh liên kết của bộ nạp khởi động và mã chính, để mỗi tập lệnh sử dụng một phân đoạn bộ nhớ flash hoàn toàn khác biệt. Bằng cách đó, bạn có thể cập nhật mã chính mà không cần chạm vào bộ nạp khởi động. Khi bộ nạp khởi động là một phần của mã chính, nếu quá trình cập nhật gặp phải bất kỳ loại sự cố nào, thì thiết bị của bạn sẽ bị brick. Mã bootloader cần phải rấtđáng tin cậy, vì một lỗi trong bộ tải khởi động có thể là sự khác biệt giữa người dùng có thể tự phục vụ thiết bị sau khi cập nhật bị lỗi, so với việc buộc phải đưa nó đến trung tâm dịch vụ. Cá nhân, tôi sẽ làm cho bộ tải khởi động nhỏ và đơn giản nhất có thể, thậm chí còn đi xa hơn để tránh sử dụng các ngắt, vì theo cách chúng làm cho mã ít dự đoán hơn. Thông thường tôi là tất cả cho các ngắt, nhưng đây là trường hợp tôi chống lại việc sử dụng chúng.
Tóm lại, bộ tải khởi động được tải khi thiết bị khởi động và thường chỉ điều khiển bằng tay với mã chính. Tuy nhiên, khi thực hiện cập nhật firmware, bộ tải khởi động sẽ chạy mã riêng sau khi khởi động thay thế. Mã này phải bao gồm một số loại giao tiếp (trong trường hợp của bạn) hoặc trình điều khiển lưu trữ, để nó có thể nhận / đọc nhị phân cho mã được cập nhật, qua Bluetooth, Ethernet, thẻ SD, ổ đĩa flash hoặc bất cứ thứ gì. Sau đó, nó sẽ xóa mã cũ và lập trình lại bộ nhớ flash với mã mới.
Một trong những thủ thuật phải được thực hiện khi lập trình lại bộ nhớ flash là di chuyển (sao chép) một phần mã bộ nạp khởi động vào RAM, vì bạn không thể chạy mã từ flash trong khi nó được lập trình (ngay cả khi địa chỉ được đọc khác với địa chỉ đang được lập trình). Ngoài ra, mã nhị phân được cập nhật sẽ được ghi vào flash cũng phải có trong RAM. Thông thường sẽ không có đủ RAM để lưu trữ toàn bộ mã cho bản cập nhật, do đó, không có gì lạ khi nhận / đọc một phần mã, viết, nhận / đọc một phần mã khác, viết mã, v.v.
Lập trình bộ nhớ flash không phải là vấn đề đơn giản để ghi dữ liệu vào các địa chỉ mong muốn. Có một hướng dẫn lập trình flash cho từng thành viên của sê-ri STM32 (ví dụ, đây là hướng dẫn sử dụng cho sê-ri STM32F10x). Tóm lại, do các chi tiết cấp thấp về cách triển khai bộ nhớ flash, trước khi lập trình lại một khối nhất định, bạn sẽ cần đưa ra lệnh xóa cho nó. Ngoài ra, bạn không thể thực hiện bất kỳ lần đọc nào từ flash trong khi nó đang được lập trình, vì vậy hãy quên các ngắt, DMA, v.v. trừ khi không có khả năng họ sẽ cố đọc từ flash trong khi nó được viết.