Có thể lập trình lại vi điều khiển qua Bluetooth?


7

Tôi đang xem xét việc tạo ra một thiết kế nhúng có ARM Cortex M3 MCU và bluetooth. Tôi muốn có thể cập nhật chương trình cơ sở qua Bluetooth theo định kỳ.

Điều này có thể với chip sau? Từ ST:

http://www.st.com/web/en/catalog/mmc/FM141/SC1169/SS1031

Tôi đã quen với việc kết nối bluetooth với MCU thông qua UART. Bộ nạp khởi động có cần phải được sửa đổi khi tôi muốn lập trình "qua không trung" không? Làm thế nào để một người tải bộ tải khởi động riêng của họ trên thiết bị? Mã bootloader trông như thế nào?

Tôi cũng mở cho các đề xuất khác dựa trên mục tiêu của tôi.


Nếu bộ tải khởi động của bạn chấp nhận các chương trình từ uart sẽ hoạt động tốt. Bạn có thể cần phải điều chỉnh nó để khởi tạo mô-đun BT của bạn, nhưng đó là về nó.
Vladimir Cravero

Một vấn đề quan trọng với bộ tải khởi động là làm thế nào để buộc chip mục tiêu vào chế độ tải. (Lưu ý rằng bạn không thể dựa vào chương trình ứng dụng!) Bạn sẽ làm điều đó như thế nào?
Wouter van Ooijen

2
@WoutervanOoijen Tại sao bạn không thể dựa vào ứng dụng để chuyển bạn sang chế độ "bootloader"? Làm thế nào khác bạn sẽ làm một bản cập nhật firmware từ xa?
dext0rb

Ít nhất là đối với các bộ điều khiển AVR, mã bộ nạp khởi động được thực thi trước, nếu nó tồn tại. Sau đó, có một lệnh nhảy đến địa chỉ chương trình chính trong flash.
sherrellbc

1
Ứng dụng có thể không hợp tác, ví dụ do lỗi lập trình (lỗi nguồn) hoặc lỗi. Đối với tải khởi động từ xa, cách đáng tin cậy duy nhất để buộc mục tiêu vào chế độ tải khởi động là có một trí thông minh riêng biệt (không thể cập nhật) có thể làm điều này (ví dụ như một vi điều khiển nhỏ hoặc một cái gì đó được tích hợp trong mô-đun giao tiếp).
Wouter van Ooijen

Câu trả lời:


7

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.


Cảm ơn bạn! Chính xác những gì tôi đang tìm kiếm - Tôi đã nghe nói rằng STM32 cho phép điều này. Hai câu hỏi: làm thế nào để tải bộ tải khởi động của riêng họ trên thiết bị? Mã bootloader trông như thế nào?
JDS

1
Tôi đã thêm câu trả lời cho các câu hỏi trong bình luận của bạn vào bài viết của tôi ở trên. Vui lòng chuyển những câu hỏi này sang phần chính của câu hỏi chính ở trên bằng cách chỉnh sửa nó, để bất kỳ người dùng nào vấp phải câu hỏi này sau đó không cảm thấy rằng câu trả lời bị ngắt kết nối với câu hỏi.
lợn
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.