Tôi có thực sự cần phải đặt vi điều khiển stm32 vào chế độ bootloader để lập trình không?


7

Tôi đã bắt đầu học vi điều khiển stm32 được một thời gian bằng cách sử dụng một bảng phát triển rất nhỏ "stm32f103c8t6" (hoặc viên thuốc màu xanh). Khi tôi bắt đầu, tôi đã học được từ một số hướng dẫn rằng tôi phải chuyển một người nhảy để lập trình nó.

nhập mô tả hình ảnh ở đây (Ảnh là ảnh chụp màn hình được lấy từ một hướng dẫn ngẫu nhiên, nhưng mọi hướng dẫn tôi đã xem cũng nói rằng)

nhập mô tả hình ảnh ở đây

Bộ nhảy - theo như tôi biết - chỉ thay đổi chế độ khởi động của bộ xử lý để tải từ bộ nhớ hệ thống (bộ tải khởi động) chỉ có hiệu lực nếu tôi khởi động lại bo mạch để bắt đầu khởi động từ đó.

Tôi không biết làm thế nào được coi là "chế độ lập trình" khi tôi đang sử dụng một lập trình viên liên kết ngoài sử dụng SWD.

nhập mô tả hình ảnh ở đây

Vì vậy, câu hỏi của tôi ở đây, Có thực sự có một thứ gọi là "chế độ lập trình" không? và nếu vậy, chính xác thì nó hoạt động như thế nào?

Ngoài ra, điều đáng nói là tôi vừa cố gắng lập trình nó và chương trình hoạt động như mong muốn (Tôi hy vọng tôi đã không làm hỏng bất cứ điều gì: d).

Câu trả lời:


14

Bạn chỉ cần đặt vi điều khiển vào chế độ bộ nạp khởi động nếu bạn sẽ lập trình nó qua UART, sử dụng bộ tải khởi động.

Nói chung, bạn có thể lập trình vi điều khiển qua SWD bất cứ lúc nào.

Các ngoại lệ chính là nếu vi điều khiển đang chạy chương trình vô hiệu hóa SWD bằng cách đặt một SWJ_CFGbit trong AFIO->MAPR(ví dụ: sử dụng các chân được liên kết làm GPIO) hoặc nếu MCU đang chạy ở chế độ năng lượng thấp mà không DBGMCUđặt cờ thích hợp để giữ giao diện gỡ lỗi hoạt động trong các chế độ. Nếu bất kỳ trường hợp nào trong số này là trường hợp, việc đặt vi điều khiển vào chế độ bộ nạp khởi động là một cách giải quyết dễ dàng, vì giao diện SWD đang hoạt động (và chế độ ngủ không được sử dụng) trong khi bộ tải khởi động đang chạy.


1
Bạn thậm chí không cần chơi với các chân BOOT0 / 1 để làm điều đó. Tôi đã khởi động lại thành công bộ tải khởi động ROM trên một số họ STM32 thông qua một số mã hóa cẩn thận. Các chân BOOT là tiện dụng nhưng không hoàn toàn cần thiết.
akohlsmith

1
Cũng lưu ý rằng bộ tải khởi động ROM hỗ trợ một số loại giao diện, không chỉ UART. Mặc dù `103 có USB, nhưng đó không phải là một trong những giao diện được hỗ trợ bởi bộ tải khởi động ROM. Trên các biến thể STM32 sau này là nó.
Chris Stratton

1
@ChrisStratton Không nhất thiết phải đơn giản như các biến thể "sau này", nhưng về cơ bản bạn đã đúng. Ứng dụng ST Lưu ý AN2606 có một bản tóm tắt dài trong đó các bộ phận STM32 có bộ tải khởi động nào và tính năng nào được hỗ trợ.
duskwuff -inactive-

@akohlsmith vốn không phải là khoa học tên lửa (6-7 dòng mã để gọi). Nhưng bộ tải khởi động bên trong hơi vô dụng vì nó không kiểm tra xem hình ảnh có đúng không, không cung cấp bất kỳ giải mã nào cho hình ảnh được tải và không hoạt động nếu bạn bảo vệ bộ nhớ. Tôi sử dụng trong các thiết bị sản xuất của riêng mình - viết chúng khá đơn giản và dễ dàng.
P__J__

4

Có thể có nhiều cách để lập trình bảng, sử dụng các công cụ khác nhau. Một trong số đó, có vẻ khá dễ dàng là sử dụng ST-Link V2 (google nó) và OpenOCD.

  1. Để cả hai nút nhảy khởi động về "0". Kết nối các chân SWDIO, SWCLK, GND với các chân thích hợp của ST Link. Cấp nguồn cho bảng chú ý xem nó là 5V hay 3.3V. ST-Link thuận tiện có đầu ra 3,3V có thể được sử dụng. Vì bo mạch nhận 5V từ đầu nối USB, không kết nối các chân nguồn khác cùng lúc với cổng USB. Có thể hữu ích khi có một cáp có 4 thiết bị đầu cuối ở phía ST-Link và phân chia các thiết bị đầu cuối 3 + 1 ở phía bảng. Bảng sẽ sáng lên một đèn LED và có thể bắt đầu nhấp nháy với đèn kia, nếu nó được lập trình.

  2. Đã cài đặt OpenOCD, các phiên bản gần đây có thể ít lỗi hơn (ví dụ: ít nhất là 0,9.x hoặc tốt hơn 0,10.x). Các phiên bản cũ hơn, có trong các bản phân phối Linux, có thể có vấn đề với việc đặt lại cấu hình và yêu cầu xử lý các tệp cấu hình.

  3. [tùy chọn] Nếu bạn chạy Linux và không thoải mái khi chạy OpenOCD với quyền root, hãy tạo một tệp /etc/udev/rules.dcó nội dung sau:

    SUBSYSTEMS=="usb", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="3748", MODE="0664", GROUP="stlink"

Điều này sẽ cho phép các thành viên của stlinknhóm truy cập vào thiết bị ST-Link. Tạo nhóm này và thêm chính mình vào nó. Bạn có thể sử dụng bất cứ nhóm nào thuận tiện.

  1. Giả sử máy chủ Linux và cài đặt OpenOCD mặc định trên toàn hệ thống, kiểm tra xem kết nối có ổn không, MCU còn sống và OpenOCD có thể nói chuyện với nó:

     openocd -f interface/stlink-v2.cfg -f target/stm32f1x_stlink.cfg

Tùy thuộc vào phiên bản OpenOCD, những điều sau đây cũng có thể hoạt động:

     openocd -f interface/stlink-v2.cfg -f target/stm32f1x.cfg

Nếu mọi thứ đều tốt, OpenOCD sẽ in một số thông tin về MCU (điện áp, số điểm ngắt CT, v.v.) và tiếp tục chạy.

  1. Có thể chạy OpenOCD như một daemon và sử dụng telnet để sử dụng nó, nhưng tôi nghĩ sẽ thuận tiện hơn khi khởi động nó mỗi lần. Giả sử bạn có một tệp nhị phân được biên dịch đúng, giả sử blinky.bin, bạn có thể lập trình nó vào MCU với tập lệnh sau:

    OPENOCD="openocd -f interface/stlink-v2.cfg -f target/stm32f1x_stlink.cfg"
    $OPENOCD -c "init" -c "reset halt" -c "stm32f1x mass_erase 0" -c "flash write_bank 0 blinky.bin 0" -c "reset run" -c "shutdown"
    

Lưu ý rằng có tên tệp trong tập lệnh này mà bạn sẽ cần điều chỉnh. Có lẽ là một ý tưởng tốt để bắt đầu với một cái gì đó thực sự đơn giản.

Ở trên chủ yếu giả định Linux là máy chủ lưu trữ, nhưng các bước nên tương tự về mặt khái niệm trong Windows, sau khi cài đặt trình điều khiển và điều chỉnh cách mọi thứ được cài đặt, như đường dẫn, v.v.


4

Nếu bạn đang sử dụng một lập trình viên ST-Link (SWD), thì bạn không cần đặt bảng vào "chế độ lập trình".

Bộ tải khởi động là thứ cho phép chip "tải xuống" và chạy một chương trình mới. Bộ nhảy "chế độ lập trình" sử dụng các chân BOOT để báo hiệu cho bộ tải khởi động ROM rằng nó cần sẵn sàng để tải xuống một chương trình mới, nếu không, chip sẽ bắt đầu chạy chương trình đã có trong bộ nhớ. Vì bạn đang sử dụng SWD để lập trình, bộ tải khởi động ROM là không cần thiết.

[sửa]: như Chris Stratton và duskwuff chỉ ra bên dưới, bộ tải khởi động ROM STM32F103 không hỗ trợ lập trình thông qua USB, chỉ có UART và không thể xóa được. Có một bộ tải khởi động flash người dùng riêng biệt có thể được tải lên bo mạch hỗ trợ lập trình qua USB (tức là để sử dụng với Arduino IDE), nhưng nó không sử dụng các chân BOOT (do đó không bị ảnh hưởng bởi jumper "chế độ lập trình") .


1
Bộ tải khởi động liên quan ở đây là trong ROM (hoặc, ít nhất, flash không thể sửa đổi người dùng). Nó tách biệt với đèn flash của người dùng và không thể xóa trên SWD.
duskwuff -inactive-

@duskwuff, cảm ơn đã sửa! Tôi đã nghĩ về một con chip khác.
youtooth

2
Điều này không chính xác - bộ tải khởi động ROM nhà máy trên STM32F103 không hỗ trợ USB , mặc dù trên nhiều biến STM32 sau này. Do đó, bất kỳ bộ tải khởi động USB chức năng nào cho `103 sẽ phải nằm trong flash ứng dụng chứ không phải ROM, và do đó để nhập nó, các chân khởi động sẽ được đặt cho khởi động flash bình thường, không phải là boot booter của ROM.
Chris Stratton

@ChrisStratton, cảm ơn đã sửa! Rõ ràng tôi chỉ sử dụng các bộ phận STM32 hỗ trợ USB / DFU cho bộ tải khởi động của nhà máy, vì vậy tôi không biết rằng nó không được hỗ trợ trên chip này.
youtooth

"chỉ UART" cũng không đúng - nó hỗ trợ một loạt các giao diện, chỉ là (trên `103) USB.
Chris Stratton
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.