sử dụng tính năng System Memory Bootloader có sẵn bên trong chip
Mạch chuyển đổi USB sang TTL (USB-to-UART): Các loại phổ biến là CP2102, FT232, CH340 hoặc PL2303.
Bootloader của STM32 thường lắng nghe trên cổng USART1 (thường là PA9 và PA10 đối với dòng F103).
TX(USB-TTL) -> PA10(RX1): Truyền (TX) vào nhận (RX)
RX(USB-TTL) -> PA9(TX1): Nhận (RX) từ truyền (TX)
GND(USB-TTL) -> GND: Chung mass
3V3(hoặc 5V)(USB-TTL) -> 3.3V(hoặc 5V): Cấp nguồn cho board
Để STM32 chạy vào Bootloader thay vì chạy chương trình chính, bạn cần thay đổi trạng thái của chân BOOT0 và BOOT1 trước khi cấp nguồn hoặc nhấn Reset.
Chế độ nạp (System Memory): BOOT0: Chuyển sang 1 (High / 3.3V),BOOT1: Chuyển sang 0 (Low / GND).
Chế độ chạy bình thường (Flash Memory):BOOT0: 0,BOOT1: 0.
Thao tác:
1.Dời Jumper của BOOT0 sang vị trí 1
2.Nhấn nút Reset trên board STM32 để chip khởi động vào chế độ Bootloader
3.Mở phần mềm Flash Loader (STMicroelectronics STM32CubeProgrammer)
4.Chọn giao tiếp UART, chọn cổng COM tương ứng với USB-to-UART
5.Chọn tốc độ baud (baud rate) phù hợp, ví dụ: 115200 bps
6.Parity: Even
7. Nhấn nút Connect(Màu xanh lá)
-Nếu kết nối thành công:bạn sẽ thấy dữ liệu bộ nhớ chip hiện ra
-Nếu thất bại:Kiểm tra lại dây TX-RX (có bị ngược không?) và đảm bảo đã set BOOT0 = 1 rồi Reset chưa
8.Nhấn tab Open File (hoặc dấu +), chọn file firmware (.hex hoặc .bin)
9.Nhấn Download để bắt đầu nạp. Chờ thông báo 'File download complete'
Sau khi nạp xong:
1.Nhấn Disconnect trên phần mềm
2.Rút dây hoặc tắt nguồn
3.Trả lại Jumper BOOT0 về vị trí 0
4.Nhấn nút Reset trên board
Sử dụng bộ lập trình/debug ST-Link (ST-Link V2, ST-Link V2.1, ST-Link V3)
Kết nối ST-Link với STM32 qua giao tiếp SWD (Serial Wire Debug):
ST-Link SWDIO -> STM32 SWDIO (PA13)
ST-Link SWCLK -> STM32 SWCLK (PA14)
ST-Link GND -> STM32 GND
ST-Link 3.3V -> STM32 3.3V (nếu cần cấp nguồn từ ST-Link)
Thao tác:
1.Kết nối ST-Link với máy tính qua cổng USB
2.Mở phần mềm STM32CubeProgrammer
3.Chọn giao tiếp ST-Link
4.Nhấn nút Connect(Màu xanh lá)
-Nếu kết nối thành công:bạn sẽ thấy dữ liệu bộ nhớ chip hiện ra
-Nếu thất bại:Kiểm tra lại dây kết nối và đảm bảo ST-Link đã được cài driver đúng
5.Nhấn tab Open File (hoặc dấu +), chọn file firmware (.hex hoặc .bin)
6.Nhấn Download để bắt đầu nạp. Chờ thông báo 'File download complete'
Sau khi nạp xong:
1.Nhấn Disconnect trên phần mềm
2.Rút dây hoặc tắt nguồn
3.Nhấn nút Reset trên board STM32 để chạy chương trình mới
Sử dụng bộ lập trình/debug JTAG (ví dụ: J-Link)
Kết nối JTAG với STM32 qua giao tiếp JTAG:
JTAG TCK -> STM32 TCK (PA14)
JTAG TMS -> STM32 TMS (PA13)
JTAG TDI -> STM32 TDI (PA15)
JTAG TDO -> STM32 TDO (PB3)
JTAG GND -> STM32 GND
JTAG 3.3V -> STM32 3.3V (nếu cần cấp nguồn từ JTAG)
Thao tác:
1.Kết nối JTAG với máy tính qua cổng USB
2.Mở phần mềm STM32CubeProgrammer
3.Chọn giao tiếp JTAG
4.Nhấn nút Connect(Màu xanh lá)
-Nếu kết nối thành công:bạn sẽ thấy dữ liệu bộ nhớ chip hiện ra
-Nếu thất bại:Kiểm tra lại dây kết nối và đảm bảo JTAG đã được cài driver đúng
5.Nhấn tab Open File (hoặc dấu +), chọn file firmware (.hex hoặc .bin)
6.Nhấn Download để bắt đầu nạp. Chờ thông báo 'File download complete'
Sau khi nạp xong:
1.Nhấn Disconnect trên phần mềm
2.Rút dây hoặc tắt nguồn
3.Nhấn nút Reset trên board STM32 để chạy chương trình mới
Sử dụng chế độ Device Firmware Upgrade (DFU) qua USB (nếu STM32 hỗ trợ)
Kết nối STM32 với máy tính qua cổng USB:
STM32 USB D+ -> Máy tính USB D+
STM32 USB D- -> Máy tính USB D-
STM32 GND -> Máy tính GND
STM32 VBUS -> Máy tính VBUS (5V từ cổng USB)
Thao tác:
1.Đưa STM32 vào chế độ DFU:
-Cách 1: Set BOOT0 = 1, nhấn Reset (nếu có)
-Cách 2: Sử dụng nút bấm trên board (nếu có)
2.Mở phần mềm STM32CubeProgrammer
3.Chọn giao tiếp USB DFU
4.Nhấn nút Connect(Màu xanh lá)
-Nếu kết nối thành công:bạn sẽ thấy dữ liệu bộ nhớ chip hiện ra
-Nếu thất bại:Kiểm tra lại dây kết nối và đảm bảo đã vào chế độ DFU đúng cách
5.Nhấn tab Open File (hoặc dấu +), chọn file firmware (.hex hoặc .bin)
6.Nhấn Download để bắt đầu nạp. Chờ thông báo 'File download complete'
Sau khi nạp xong:
1.Nhấn Disconnect trên phần mềm
2.Rút dây hoặc tắt nguồn
3.Trả lại Jumper BOOT0 về vị trí 0 (nếu đã thay đổi)
4.Nhấn nút Reset trên board STM32 để chạy chương trình mới
Kiểm tra độ tương thích:
STM32F1 Series: Chỉ hỗ trợ UART. Không dùng được cách này.
STM32F4, F7, L4, G0, H7...: Thường có hỗ trợ SPI Bootloader.
Tài liệu cần tra cứu: Hãy tìm tài liệu AN2606 (STM32 microcontroller system memory boot mode) của ST. Tìm đến mục của dòng chip bạn đang dùng để xem nó hỗ trợ giao tiếp nào và trên chân (Pin) nào
Do máy tính không có cổng SPI, bạn cần một thiết bị đóng vai trò là SPI Master. Có 2 cách phổ biến:
Dùng mạch nạp chuyên dụng có hỗ trợ SPI: Ví dụ ST-Link V3 (dòng cao cấp) hoặc các mạch chuyển đổi USB-to-SPI (sử dụng chip như FT232H, FT2232H).
Dùng một vi điều khiển khác hoặc Raspberry Pi: Dùng Raspberry Pi làm Master để nạp code cho STM32 (Slave).
SPI SCK -> STM32 SCK (PA5)
SPI MISO -> STM32 MISO (PA6)
SPI MOSI -> STM32 MOSI (PA7)
SPI CS -> STM32 CS (tùy chọn, nếu dùng)
SPI GND -> STM32 GND
SPI 3.3V -> STM32 3.3V (nếu cần cấp nguồn từ SPI)
Lưu ý quan trọng:
Bạn phải kết nối đúng vào các chân SPI mà Bootloader quy định (thường là SPI1 hoặc SPI2 tùy chip, xem trong AN2606).
Chân NSS của STM32 phải được Master kéo xuống mức thấp (GND) trong suốt quá trình truyền nhận.
Thao tác:
1.Kết nối SPI với máy tính qua cổng USB
2.Mở phần mềm STM32CubeProgrammer
3.Chọn giao tiếp SPI
4.Nhấn nút Connect(Màu xanh lá)
-Nếu kết nối thành công:bạn sẽ thấy dữ liệu bộ nhớ chip hiện ra
-Nếu thất bại:Kiểm tra lại dây kết nối và đảm bảo SPI đã được cài driver đúng
5.Nhấn tab Open File (hoặc dấu +), chọn file firmware (.hex hoặc .bin)
6.Nhấn Download để bắt đầu nạp. Chờ thông báo 'File download complete'
Sau khi nạp xong:
1.Nhấn Disconnect trên phần mềm
2.Rút dây hoặc tắt nguồn
3.Nhấn nút Reset trên board STM32 để chạy chương trình mới
Nạp firmware qua I2C (Inter-Integrated Circuit) là phương pháp thường được sử dụng trong các hệ thống nạp code giữa 2 vi điều khiển (ví dụ: một con chip Master nạp code cho con STM32 Slave) hoặc khi cần tiết kiệm chân IO.
Kiểm tra khả năng hỗ trợ (AN2606)
Tìm bảng 'Bootloader device interface' cho dòng chip của bạn.
Kiểm tra xem nó có hỗ trợ cổng I2C nào không (thường là I2C1 hoặc I2C2) và nằm trên chân nào (ví dụ: PB6/PB7 hay PB8/PB9).
STM32 cần nạp đóng vai trò là I2C Slave. Bạn cần một thiết bị làm I2C Master để đẩy dữ liệu vào.
Master: Có thể là một vi điều khiển khác, Raspberry Pi, hoặc mạch chuyển đổi USB-to-I2C (như CP2112).
Điện trở kéo lên (Pull-up Resistors): Đây là yếu tố sống còn của I2C. Bạn cần mắc điện trở (thường là 4.7kΩ hoặc 10kΩ) từ đường SDA và SCL lên nguồn 3.3V. Nếu thiếu trở này, giao tiếp sẽ không hoạt động.
SDA(Master) -> SDA(Boot pin)(STM32-Slave): Cần trở kéo lên 3.3V
SCL(Master) -> SCL(Boot pin)(STM32-Slave): Cần trở kéo lên 3.3V
GND(Master) -> GND (STM32-Slave): Chung mass
BOOT0 = 1: Để vào chế độ Bootloader
Mỗi dòng STM32 khi chạy Bootloader I2C sẽ có 2 địa chỉ Slave mặc định (một cho giao diện I2C1, một cho I2C2 nếu có).
Địa chỉ phổ biến nhất thường là: 0b1110110 (tức là 0x76 ở dạng 7-bit).
Khi viết code hoặc dùng tool, cần lưu ý việc dịch bit (bit shifting) cho bit R/W:
-Địa chỉ ghi (Write address): 0xEC
Địa chỉ đọc (Read address): 0xED
Thực hiện nạp:
Cách 1: Dùng STM32CubeProgrammer (Nếu có USB-to-I2C adapter)
Chọn giao thức I2C.
Điền địa chỉ Slave
Kết nối và nạp file .hex/.bin
Cách 2: Tự viết code cho Master (MCU to MCU)
Đây là ứng dụng thực tế nhất của I2C Bootloader (ví dụ: dùng chip ESP32 để nạp code cập nhật cho STM32).
1.Master gửi lệnh đồng bộ: Không cần byte 0x7F như UART. Master chỉ cần gửi đúng địa chỉ Slave của STM32.
2.Lệnh Get (0x00): Master gửi lệnh 0x00 để hỏi phiên bản Bootloader. STM32 sẽ trả lời bằng ACK
3.Lệnh Write Memory (0x31):
Master gửi 0x31 + CheckSum
STM32 gửi ACK
Master gửi địa chỉ bắt đầu ghi (4 bytes) + CheckSum
STM32 gửi ACK
Master gửi số lượng byte (N) + dữ liệu (N+1 bytes) + CheckSum.
STM32 nạp vào Flash và gửi ACK.