Sử dụng Raspberry Pi để nạp (flash) chương trình cho STM32 thông qua cổng serial UART. Không cần mạch nạp. Dựa trên bài blog của Matthew Dunn tại đây Các bước được thực hiện trên Raspberry Pi 3 model B
- Cài đặt stm32flash trên Ras Pi:
sudo apt-get install stm32flash
(thông tin chi tiết của stm32flash xem tại đây)
- Sử dụng full UART ở GPIO thay vì Bluetooth:
- Sửa file /boot/config.txt:
sudo nano /boot/config.txt
- Thêm dòng sau vào cuối:
dtoverlay=pi3-miniuart-bt
- Chặn console chạy ở Serial port:
- Sửa file /boot/cmdline.txt
sudo nano /boot/cmdline.txt
- Xoá chuỗi:
console=serial0,115200
- Khởi động lại Ras Pi
- Kết nối STM32 với Ras Pi như sau: (chú ý BOOT0 bỏ jumper ngắn mạch đi và kết nối vào pin ở giữa, BOOT1 nối 0, xem hình bên dưới)
STM32 | Raspberry Pi |
3.3V | 3.3V (pin 1) |
G | GND (pin 2) |
A9 (TX) | GPIO15 (RX) (pin 10) |
A10 (RX) | GPIO14 (TX) (pin 8) |
R | GPIO2 (pin 3) |
BOOT0 | GPIO3 (pin 5) |
Để nạp được chương trình thì tất nhiên là phải có chương trình đã. Ta sử dụng file .hex đầu ra sau khi build từ Keil để nạp. Đảm bảo rằng Keil output ra file .hex sau khi build:
Ấn F7 để build.
Sau khi build xong, file .hex sẽ nằm ở <thư mục project>/<tên project>/<tên project>.hex
Gửi file .hex tới Ras Pi, ví dụ gửi thông qua VNC bằng VNC Viewer:
- Mở terminal gõ
stm32flash -h
để hiển thị hướng dẫn sử dụng - Để nạp, ta dùng lệnh sau:
sudo stm32flash -b 115200 -R -i 3,-2,2:-3,-2,2 -v -w /path/to/hex /dev/serial0
Trong đó:
-b 115200
để đặt baud rate là 115200-R -i 3,-2,2:-3,-2,2
để đặt chu trình khởi động và reset. Cụ thể 3,-2,2 tức là GPIO3=BOOT0=HIGH -> GPIO2=R=LOW -> GPIO2=R=HIGH, đây là trình tự để reset stm32 về bootloader trước khi nạp. -3,-2,2 tương đương GPIO3=BOOT0=LOW -> GPIO2=R=LOW -> GPIO2=R=HIGH, đây là trình tự để reset stm32 về bộ nhớ flash để chạy chương trình sau khi nạp.-v
để xác thực ghi (nạp)-w /path/to/hex
để ghi (nạp) file hex ở đường dẫn /hex/file/path/dev/serial0
là thiết bị ở serial0 của Ras Pi, ở đây là stm32 được nối tới GPIO14 và GPIO15
- Lệnh nạp của stm32flash trên khá dài dòng, trừ đường dẫn file hex ra thì những tham số còn lại đều là cố định. Để đơn giản hoá cú pháp, mình đã viết một shell script thay đổi cú pháp. Với script này thì chỉ cần gõ
sudo pi2stm32 /path/to/hex
trên terminal là có thể nạp cho stm32 được rồi. - Lấy script về:
wget https://raw.githubusercontent.com/vinhcatba/pi2stm32/master/pi2stm32
chmod +x pi2stm32
sudo cp pi2stm32 /usr/local/bin
- Sau đó ở bất kỳ đâu chỉ cần mở terminal lên gõ
sudo pi2stm32 /path/to/hex
là có thể nạp chương trình cho stm32.
Bởi vì ta kết nối STM32 với Ras Pi qua serial UART, nên ta luôn luôn có thể xem giao tiếp giữa 2 thằng, sử dụng phần mềm CuteCom
- Cài đặt CuteCom:
sudo apt-get install cutecom
- Mở CuteCom trên Ras Pi:
- Vào Setting chọn baud rate tương ứng với chương trình trên STM32, có thể bỏ chọn Display Ctrl characters cho dễ nhìn. Chọn Device là /dev/ttyAMA0 và ấn Open