Nạp chương trình cho stm32c8t6 qua bootloader

Khi làm 1 project có tính thương mại, việc update và bảo trì chương trình cho khách hàng nhất thiết phải có, bạn không thể đưa mạch nạp cho khách rồi bảo họ làm theo hướng dẫn để nạp file hex được. Thay vào đó chúng ta sẽ update firmwave khách qua chương trình bootloader

Một vài ứng dụng của chương trình bootloader

  • Nạp code không cần mạch nạp gốc, chỉ cần 1 module UART-USB bất kì
  • Làm mạch nạp offline (máy nạp code hàng loạt)
  • Tạo chức năng FOTA (Firmware Over The Air) tức là cập nhật từ xa qua internet, wifi, bluetooth

Về phần lí thuyết các bạn có thể tìm hiểu về OTA tại đây:

DEMO chương trình bootloader

Do stm32f103c8t6 có 128 Page bắt đầu từ 0 và mỗi page là 128KB nên mình sẽ tạo 1 buffer đúng bằng kích cỡ của 1page, bởi mỗi lần ghi vào flash chúng ta phải ghi cả page chứ không thể ghi lẻ tẻ được.

Khơi tạo ram cho 1 page

Chương trình xóa page, do mỗi lần ghi vào xóa page đó đi

Chương trình đọc 1byte kiểu 16 ra từ 1 địa chỉ

Chương trình ghi data vào 1 page + check lại, chúng ta sẽ cần nhập vào tham số là page vần ghi và size (thực ra cái này size mặc định là 1024 rồi)

Phương pháp giao tiếp với máy tính

Đầu tiên phần mềm sẽ gửi dữ liệu gồm số lượng byte của code, ở dưới đọc xong sẽ phẩn hồi OK cho app biết nó sẵn sàng nhận data. Sau đó app sẽ gửi liên tục gửi 1page (1024byte) xuống cho ở dưới nạp vào flash, sau khi nạp xong sẽ nhảy tới phần vùng thực thi code

Chương trình ngắt UART nhận dữ liệu

Sau khi nhận dầy đủ mình sẽ set cờ goto_aplication=1

Ở hàm main check cờ và nhảy tới vùng code thực thi

Demo chương trình c# gửi dữ liệu

Thiết kế giao diện

Hàm mở code

Hàm nạp code xuống

Chương trình demo

Chương trình code demo mình sẽ cho gửi 1 đoạn văn bản lên mỗi 500 mili giây. Do phần vùng của chương trình này bắt đầu ở địa chỉ 0x08002000 nên ngay khi vào hàm main, chúng ta dời bảng vector ngắt đến địa chỉ này, đồng thười cũng bật isr lên luôn

Khi biên dịch các bạn tích chọn creat file hex trong build option

Trong thẻ tagret sửa địa chỉ bắt đầu thành 0x8002000

Sau đó ấn build để lấy file hex

Khi khởi động mạch, chip sẽ chạy chương trình boot trước, sau khi nạp code xuống thành công chíp sẽ nhảy sang chương trình chính ! Các bạn có thể thêm 1 nút nhấn để khi khởi động chương trình boot sẽ kiểm tra nút nhấn để quyết định xem nó chạy ở bootloader hay nhảy tới phân vùng code chính

DEMO

Download

Tải full project tại đây:
https://drive.google.com/open?id=17tEAYjTLKRL0ZrXpkZRS82JDyFM1v0Ek

 

Từ tác giả:

Có rất nhiều bạn inbox trực tiếp cho mình để hỏi các vấn đề giống nhau, các bạn vui lòng để lại thắc mắc dưới phần bình luận, mình sẽ phản hồi trong vòng 24h. Điều này sẽ giúp những người cùng thắc mắc có thể tự đọc, tìm hiểu mà không cần mất công hỏi lại mình. Like và comment cũng là một cách rất tốt để Google đánh giá cao bài viết và cho hiển thị lên thanh tìm kiếm, điều này sẽ giúp các bài viết tiếp cận được những người cần đến nó !

Nếu thấy các bài viết thật sự có ích đối với bạn, các bạn có thể donate cho mình tại tài khoản:

Giới thiệu Đào Nguyện 28 bài viết
DIY,chế cháo, viết blog chia sẽ kiến thức về lập trình,điện tử - IoT. Rất mong được giao lưu, kết bạn với các bạn cùng đam mê. Địa chỉ Facebook: https://www.facebook.com/nguyendao207

Hãy bình luận đầu tiên

Để lại comment nếu có thắc mắc, mình sẽ phản hồi trong 24h