บทความนี้กล่าวถึง การใช้งานคอมพิวเตอร์แบบ Desktop ที่ทำงานด้วยบอร์ด Raspberry Pi 4 Model 4 (2GB RAM) และใช้ระบบปฏิบัติการ Raspbian OS เพื่อนำมาลองสร้างไฟล์ Firmware สำหรับ MicroPython และนำไปใช้กับบอร์ดไมโครคอนโทรลเลอร์ เช่น ตระกูล STM32
แม้ว่า เราจะสามารถดาวน์โหลดไฟล์ MicroPython Firmware (Pre-built) ที่เป็นไฟล์ .dfu สำหรับบอร์ด STM32 เช่น Nucleo Boards ต่าง ๆ ได้ (ดูได้จากเว็บนี้) แต่เราจะมาลองคอมไพล์จากซอร์ซโค้ดเอง
ขั้นตอนการดำเนินการ
- ติดตั้ง GNU ARM Embedded Toolchain สำหรับบอร์ด Raspberry Pi
- ดาวน์โหลด Source Code Repository สำหรับ MicroPython มาจาก Github
- ทำขั้นตอน Build ไฟล์ MicroPython Firmware โดยเลือกใช้บอร์ด STM32F429-Discovery เป็นตัวอย่าง (Target Board)
- ติดตั้ง stlink-tools ซึ่งเป็นโปรแกรมสำหรับการเขียนไฟล์ firmware (.bin) ไปยังบอร์ด STM32 โดยใช้ร่วมกับอุปกรณ์ STLink/V2
- ติดตั้ง Thonny IDE (Python-based) สำหรับ Raspberry Pi
- เปิดใช้งาน Thonny IDE และเชื่อมต่อกับ MicroPython REPL บอร์ด STM32
ข้อสังเกต: การเขียนข้อมูลจากไฟล์ Firmware สำหรับ STM32 ทำได้หลายวิธี เช่น ผ่านทาง STLink/V2 (SWD) หรือบอร์ด Nucleo / Discovery ก็มี Virtual Drive (USB Mass Storage) สามารถลากไฟล์ .bin ไปวางใส่ได้เลย (Drag & Drop) หรือจะใช้วิธี DFU ผ่านทางสาย USB เป็นต้น แต่ในบทความนี้จะสาธิตเฉพาะวิธี STLink/V2
การติดตั้ง GNU Arm Embedded Toolchain
เรามีตัวเลือกอยู่สองวิธีเป็นแนวทางในการใช้งาน
- วิธีแรก: ติดตั้ง Arduino IDE และติดตั้ง Package สำหรับ Arduino Zero/M0 (ATSAMD21) ใน Boards Manager (ศึกษาขั้นตอนจากบทความที่ได้เคยแชร์ไว้แล้ว)
- วิธีที่สอง: ดาวน์โหลดและติดตั้งไฟล์จาก
https://github.com/xpack-dev-tools/arm-none-eabi-gcc-xpack/releases/
ถ้าใช้วิธีแรก ทำคำสั่งดังนี้ เพื่อให้สามารถเรียกใช้คำสั่งต่าง ๆ ของ GNU Arm Embedded Toolchain (32-bit) ได้ และให้ลองทำคำสั่งเพื่อตรวจสอบเวอร์ชันดูก่อน
$ export PATH="$PATH:$HOME/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin"$ arm-none-eabi-gcc --version
ข้อสังเกต: ไฟล์คำสั่งที่เกี่ยวข้องกับ GNU Arm Embedded GCC และติดตั้งโดย Arduino IDE นั้น เป็นเวอร์ชัน 7 (Update 2017-q4-major)
ถ้าใช้วิธีที่สอง ก็ติดตั้งโปรแกรมเอง ตามขั้นตอนดังนี้ โดยดาวน์โหลดไฟล์ .tar.gz (สำหรับสถาปัตยกรรมแบบ ARM ซึ่งมี 2 ตัวเลือกคือ 32 บิต และ 64 บิต) ในตัวอย่างนี้ เราจะนำไปติดตั้งภายใต้ไดเรกทอรี /opt
ของระบบ
ข้อสังเกต: ถ้าใช้วิธีที่สอง จะได้เวอร์ชัน 9 ซึ่งใหม่กว่า
$ wget -c https://github.com/xpack-dev-tools/arm-none-eabi-gcc-xpack/releases/download/v9.3.1-1.1/xpack-arm-none-eabi-gcc-9.3.1-1.1-linux-arm.tar.gz$ tar xvf xpack-arm-none-eabi-gcc-9.3.1-1.1-linux-arm.tar.gz$ sudo mv xpack-arm-none-eabi-gcc-9.3.1-1.1 /opt/xpack-arm-none-eabi-gcc$ sudo chown -R $USER:$USER /opt/xpack-arm-none-eabi-gcc$ export PATH="$PATH:/opt/xpack-arm-none-eabi-gcc/bin"$ arm-none-eabi-gcc --version
ถึงตรงนี้ เราก็มีคอมไพล์เลอร์สำหรับซีพียูตระกูล ARM พร้อมใช้งานแล้ว
การสร้างไฟล์ MicroPython Firmware จาก Source Code สำหรับบอร์ด STM32F429-DISC
ลำดับถัดไป ให้ทำคำสั่งดังนี้ เพื่อติดตั้งแพคเกจที่จำเป็นต้องใช้ และดาวน์โหลด Source Code ของ MicroPython มาจาก Github
$ sudo apt-get install build-essential libffi-dev pkg-config$ git clone https://github.com/micropython/micropython.git
$ cd micropython
$ git submodule update --init
$ make -C mpy-cross
บอร์ดแรกที่ได้เลือกมาลอง (บอร์ดเก่าที่เคยได้ใช้งานมาหลายปีแล้ว) และจะสร้างไฟล์ MicroPython Firmware คือ STM32F429-DISC (ARM Cortex-M4) ซึ่งเป็นบอร์ดที่มี Spec ค่อนข้างสูงสำหรับไมโครคอนโทรลเลอร์
ข้อมูลเชิงเทคนิคเกี่ยวกับบอร์ด STM32F429-DISC
- STM32F429ZI 168MHz (LQFP-144)
- 2MiB Flash, 256KiB SRAM
- 8MiB (64Mbit) SDRAM
- 3-axis Gyro (L3GD20)
- 2.4 inch TFT display
- 2x LEDs
- 1x User Button
- USB OTG
(ดูข้อมูลเพิ่มเติมได้จาก MicroPython — Board STM32F429)
ถัดไปจึงย้ายไปทำคำสั่งภายในไดเรกทอรีสำหรับ STM32 Port ดังนี้
$ cd ports/stm32
$ make submodules
$ make BOARD=STM32F429DISC clean
$ make BOARD=STM32F429DISC V=1
เมื่อทำถึงขั้นตอนนี้แล้ว เราจะได้ไฟล์ .hex และ .dfu สำหรับ MicroPython Firmware แต่เราจะใช้ไฟล์ .bin โดยทำคำสั่งต่อไปนี้ เพื่อสร้างไฟล์ .bin จาก .elf
$ arm-none-eabi-objcopy -O binary ./build-STM32F429DISC/firmware.elf ./build-STM32F429DISC/firmware.bin
ในการเขียนไฟล์ .bin ไปยังหน่วยความจำ Flash ภายในชิปไมโครคอนโทรลเลอร์ STM32F429ZI บนบอร์ด STM32F429-DISC เราจะใช้คำสั่ง stlink
ดังนั้นจึงต้องทำคำสั่งติดตั้งโปรแกรมดังกล่าวก่อน
$ sudo apt-get install stlink-tools
จากนั้นเสียบสาย USB (Mini-USB cable) เพื่อเชื่อมต่อบอร์ด STM32F429-DISC กับบอร์ด Raspberry Pi และทำคำสั่งต่อไปนี้ เพื่อดูว่า มองเห็นอุปกรณ์ USB หรือไม่
$ lsusb | grep ST-LINKBus 001 Device 123: ID 0483:3748 STMicroelectronics ST-LINK/V2
ข้อสังเกต: บอร์ด STM32F429-DISC ได้รวมวงจร STLink/V2 Programmer / Debugger ไว้แล้ว
ถัดไปให้ทำคำสั่งต่อไป เพื่อลองอ่านข้อมูลจากบอร์ด โดยใช้คำสั่ง st-info
$ st-info --probeFound 1 stlink programmers
serial: 513f6e06663f505114412367
openocd: "\x51\x3f\x6e\x06\x66\x3f\x50\x51\x14\x41\x23\x67"
flash: 2097152 (pagesize: 16384)
sram: 262144
chipid: 0x0419
descr: F42x and F43x device
ถัดไปก็เขียนไฟล์ .bin ไปยังบอร์ด โดยใช้คำสั่ง stlink
$ st-flash erase$ st-flash write ./build-STM32F429DISC/firmware.bin 0x8000000
ในการใช้งานและเชื่อมต่อกับ MicroPython REPL ของบอร์ดผ่านทาง USB ให้หาสาย MicroUSB อีกเส้นมาเสียบที่พอร์ต USB User บนบอร์ด STM32F429-DISC เพื่อเชื่อมต่อไปยังพอร์ต USB ของ Raspberry Pi
ถอดสาย Mini-USB ออก แล้วใช้สาย microUSB เชื่อมต่อบอร์ด STM32F429-DISC ที่พอร์ต MicroUSB (อีกด้านหนึ่งของบอร์ด) ไปยังบอร์ด Raspberry Pi
ใช้สาย Jumper ต่อที่ขา PB13 กับขา 5V บนบอร์ด เพื่อจ่ายแรงดันไฟเลี้ยงให้บอร์ดผ่านทาง MicroUSB
การติดตั้ง Thonny IDE สำหรับ MicroPython
ให้ทำคำสั่งดังต่อไปนี้ และลองเปิดใช้งานโปรแกรม
$ sudo apt-get install python3-tk$ sudo -H pip3 install thonny -U$ thonny &
เมื่อเรียกโปรแกรม Thonny IDE ก็จะเห็นหน้าต่างหลักของโปรแกรมดังนี้
จากนั้นไปที่เมนู Run > Select Interpreter แล้วเลือกค่าดังนี้ เราจะใช้ MicroPython แบบ generic และเลือก Virtual COM port ที่ตรงกับบอร์ด STM32F429-DISC
จากนั้นกดปุ่ม Stop/Restart บนแถบไอคอน และให้สังเกตข้อความในบริเวณ Shell ลองพิมพ์และทำคำสั่งของ MicroPython ในส่วนที่เป็น REPL Prompt ได้
การสร้างไฟล์ MicroPython Firmware จาก Source Code สำหรับบอร์ด STM32F4-Discovery
ลองเปลี่ยนมาเป็นบอร์ด STM32F4-Discovery (STM32F407) ดูบ้าง แล้วทำขั้นตอนสร้างไฟล์ MicroPython Firmware
$ make BOARD=STM32F4DISC clean
$ make BOARD=STM32F4DISC V=1
เราจะได้ไฟล์ .hex ดังนี้
build-STM32F4DISC/firmware.hex
บอร์ด STM32F4-Discovery มีวงจร ST-Link/v2 รวมไว้บนบอร์ดแล้ว จึงมีความสะดวกในการใช้งาน และเราก็สามารถใช้งานร่วมกับโปรแกรม OpenOCD ได้เช่นกัน
ถัดไปจะมาลองใช้โปรแกรมนี้ดูบ้าง โดยให้ติดตั้ง OpenOCD และลองตรวจสอบเวอร์ชันของโปรแกรมดังกล่าวเมื่อได้ติดตั้งใช้งานได้แล้ว
$ sudo apt-get install openocd$ openocd --version
Open On-Chip Debugger 0.10.0+dev-01281-gf0909fe9-dirty (2020-06-07-11:34)
เชื่อมต่อบอร์ด STM32F4DISC กับบอร์ด Raspberry Pi ทางพอร์ต USB (ใช้สาย Mini-USB cable) แล้วทำคำสั่งเพื่อตรวจสอบดูว่า เชื่อมต่อกับ ST-Link/V2 ของบอร์ดได้หรือไม่
$ lsusb | grep ST-LINK
Bus 001 Device 036: ID 0483:3748 STMicroelectronics ST-LINK/V2
จากนั้นจึงทำคำสั่งต่อไปนี้ เพื่อใช้ OpenOCD เป็นเครื่องมือ Flasher
$ make BOARD=STM32F4DISC deploy-openocd
หรือจะลองเปรียบเทียบกับการทำคำสั่งที่ใช้ stlink-tools
เป็นเครื่องมือ Flasher
$ make BOARD=STM32F4DISC deploy-stlink
ถอดสาย Mini-USB ออก แล้วใช้สาย microUSB เชื่อมต่อบอร์ด STM32F4DISC ที่พอร์ต MicroUSB (CN5) ไปยังบอร์ด Raspberry Pi
ใช้สาย Jumper ต่อที่ขา PA9 กับขา 5V บนบอร์ด เพื่อจ่ายแรงดันไฟเลี้ยงให้บอร์ดผ่านทาง MicroUSB
จากนั้นลองใช้คำสั่ง picocom
เชื่อมต่อกับ MicroPython REPL ผ่านทาง USB-to-Serial ของบอร์ด
$ sudo apt-get install picocom$ picocom /dev/ttyACM1 -b115200
เมื่อเข้าสู่ Terminal และมีสัญลักษณ์ >>>
ให้ลองทำคำสั่งต่อไปทีละบรรทัด
import machine
print("Hello...")
machine.reset()
ถ้าทำได้แล้ว จะลองเปลี่ยนไปใช้กับ Thonny IDE ก็ได้เช่นกัน
โดยสรุป เราสามารถใช้ GNU Arm Embedded Toolchain และนำมาใช้คอมไพล์โค้ดสำหรับสร้างไฟล์ MicroPython Firmware ได้สำเร็จ และขั้นตอนทั้งหมดทำโดยใช้คอมพิวเตอร์ที่ใช้งานบอร์ด Raspberry Pi 4 Model B แบบ Desktop หรือเราอาจจะกล่าวได้ว่า “ใช้บอร์ด ARM มาทำขั้นตอน Cross-Compile สำหรับบอร์ด ARM”