NẠP CODE VỚI BOOT LOADER STM32



  1. Boot loader là gì
  2. Nhìn sơ đồ chân của vi điều khiển STM32 có khi nào các bạn thắc mắc chân BOOT0, BOOT1 để làm gì không?? Không tự dưng mà nhà sản xuất lại thiết kế chúng mà không có ứng dụng gì. Mục đích của chân này để phân chia các chuẩn nạp code cho MCU tùy thuộc vào mục đích của người sử dụng. Các loại STM32Fxx khác cũng gần giống như STM32F1, hệ thống các chuẩn nạp được phân chia như sau:
    Có 3 chuẩn mode như hình ở trên:
    • Main flash memory: chuẩn này là chuẩn nạp code thông thường của MCU(dùng các mạch nạp như Stlink, Jlink….) thiết kế của nó là chân BOOT0 sẽ được nối đất. Vì lý do này nên chân BOOT đươc thiết kế là nối xuống GND thông qua trở kéo nguồn. Không có sự kết nối này, các mạch nạp sẽ không nhận dạng được IC được nạp và sẽ bị báo lỗi không tìm thấy MCU.
    • System memory : đây là chuẩn nạp code đặc biệt của MCU thông qua những chương trình nạp mà nhà sản xuất cung cấp. Tùy vào dòng MCU mà có các ngoại vi nạp khác nhau như : UART, SPI, USB, I2C.. Ở STM32F103C8T6 chuẩn nạp này chỉ được áp dụng ở UART1 trên chân PA9,PA10. Điều kiện là chân BOOT0 nối nguồn 3V3 và chân BOOT1(PB2) nối GND.
    • Embedded SRAM: chuẩn này cho phép truy cập địa chỉ SRAM nội bên trong IC. Điều kiện là chân BOOT0 nối nguồn 3V3 và chân BOOT1(PB2) nối 3V3. Chuẩn này mình chưa sử dụng, hy vọng có ai đó bổ sung chuẩn này.
  3. Sử dụng boot loader với chuẩn UART.
  4. Chương trình nạp: flash loader demo.
    Module UART: các module UART có bán trên thị trường : USB sang UART dùng PL2303, CH340, CP2102, FT232RL….
    Yêu cầu phần cứng:
    • Máy tính nhận cổng COM của các module UART(đã cài đặt driver….)
    • Cấp nguồn cho module UART, board STM32.
    • Chân BOOT0 nối 3V3, chân BOOT1 nối GND.
    • Có file code nạp đuôi ở 3 dạng file .s19; .hex; .bin.
    • Kiểm tra các bus nối đã được kết nối, không bị lỏng bất cứ chân nào.
    Các bước thực hiện:
    1. Tạo file hex trong Keil C.
    2. Mở keil C lên vào options for Target bằng các kích vào biểu tượng hoặc project -> Options for target, vào tab Output, click vào ô Create hex file sau đó nhấn Rebuild(F7).
      Như vậy là file hex đã được tạo, kiểm tra trong thư mục Object của project.
    3. Đấu nối các dây kết nối.
    4. Mở phần mềm flash loader demo và thực hiện theo như sau.
      • Chọn cổng COM tương ứng với cổng COM của module UART. Các thông số khác giữ nguyên, ngoại trừ baud rate(có thể thay đổi). Nhấn Next để tiếp tục.
      • Lưu ý: Bạn có thể mất vài lần cắm nếu phần mềm không kết nối được với MCU do một vài lỗi(Cắm dây lỏng, đấu nối dây sai hay thiếu, mạch bị hư…). Hãy reset lại mạch và kiểm tra kỹ lại.

      • Kích thước bộ nhớ flash của MCU sẽ xuất hiện. Nhấn next để tiếp tục.
      • Loại MCU và các page nhớ xuất hiện, nhấn Next để tiếp tục.
      • Xuất hiện Tab tiếp theo với nhiều lựa chọn, ở đây mình chọn là Nạp code mới và chọn đường dẫn đến file hex mà mình đã chuẩn bị. Nhấn Next để tiếp tục
      • Nhấn Next để nạp, sau khi nạp xong sẽ có thông báo đã nạp xong.
      • Sau khi nạp xong, đưa mạch trở về trạng thái Main flash memory(BOOT0 nối đất, BOOT1 tùy chỉnh). Reset mạch, mạch chạy bình thường.

      Ưu điểm của phương pháp này là không cần những mạch nạp đắt tiền vẫn nạp được code cho MCU, ứng dụng để tiết kiệm chân VĐK(PA14, PA13, PB3.. những chân cho mạch nạp) mà vẫn đầy đủ các chức năng cơ bản. Đó cũng là công nghệ giúp bảo mật các thiết kế(tìm hoài trên mạch không thấy chân nạp thông thường….).
      Nhược điểm: khá nhiều thao tác(cắm, cắm, reset, lỏng dây..), rườm rà, không debug được lỗi, dễ xảy ra sai sót, cũng như không nhiều chức năng được thêm vào. Và thường chỉ được sử dụng khi không có mạch nạp.