การสร้างเฟิร์มแวร์สำหรับ STM32WB55 (Keil MDK-ARM, STM32CubeIDE, VS Code)
ผมรับปากกับทาง TESA ว่าจะหาวิธีใช้ประโยชน์ชุดพัฒนา STM32WB55 Nucleo Pack ซึ่งได้รับการสนับสนุนจาก STMicro Thailand มาใช้จัดแข่งขัน TESA Topgun Rally #14 ที่พะเยา เลยเขียนบทความนี้เป็นบันทึกของขั้นตอนการทบทวนวิธีใช้งานบอร์ด เพื่อเอามาเตรียมจัด workshop ให้กับผู้สนใจ
ว่าด้วยฮาร์ดแวร์
ชุดพัฒนา STM32WB55 Nucleo Pack จัดเป็นอุปกรณ์ที่น่าสนใจ เพราะให้มา 2 ตัวในชุด คือ บอร์ดพัฒนา STM32WB55 ที่ใช้หน่วยประมวลผลแบบ dual-core คือ ARM Cortex-M4 เป็นหน่วยประมวลผลหลัก และ ARM Cortex-M0+ เป็น co-processor สำหรับงานด้านสื่อสาร นอกจากนี้ยังรวมตัว dongle สำหรับเชื่อมต่อ USB มาด้วย ซึ่งเป็นเรื่องจำเป็นในกรณี Zigbee และ Thread ที่สื่อสารบนโพรโทคอล IEEE802.15.4 ที่คอมพิวเตอร์และสมาร์ทโฟนไม่มีฟีเจอร์นี้มาด้วย
จุดเด่นของตระกูล STM32WB คือ การรองรับ multi-protocol ในย่าน 2.4 GHz โดยสามารถสื่อสารได้ทั้ง Bluetooth Low Energy, ZigBee และ Thread ทำให้หลากหลายในแง่ topology ที่มาปรับให้เข้ากับงานได้ ในส่วนของ Bluetooth Low Energy (BLE) เป็นตัวเลือกที่ดีสำหรับงานแบบ beacon (กระจายสัญญาณ) และโครงสร้างแบบ star (ตัวลูกรองรับ passive R/W หรือเลือกทำ notification ก็ได้) ส่วน Zigbee และ OpenThread (บน IEEE802.15.4) จะรองรับโครงสร้างแบบ mesh ด้วย จึงเหมาะสำหรับขยายขนาดโครงข่ายให้เกินรัศมีสื่อสาร ตัวหน่วยประมวลผลบนบอร์ดเป็นรุ่นย่อย 55 จึงมีความสุดขั้วอีก 1 ขั้นคือ สามารถเปิดใช้งาน BLE ร่วมกับ Zigbee ได้ด้วย
การพัฒนาซอฟต์แวร์สำหรับบอร์ด STM32WB55 ก็ถือว่าง่าย เพราะการเป็นบอร์ด Nucleo จึงมี ST-Link อยู่บนบอร์ดด้วย ทำให้มีกลไก USB แบบ 3 หน้าที่รวมมาด้วย โดยเสียบเข้าพอร์ต USB แล้วจะเห็นเป็น storage สำหรับการพัฒนาซอฟต์แวร์ด้วย mbed (ลากไฟล์ใส่) มีพอร์ตอนุกรม (VCP) จึงใช้ในการรายงานสถานะ และ ST-Link สำหรับใช้กลไก SWD เป็น programmer/debugger ตัวบอร์ดมีอุปกรณ์พื้นฐาน เช่น ปุ่มกดและ LED รวมทั้งหัวต่อทั้งแบบ Arduino และ Morpho (สไตล์ ST) แต่ที่แปลกกว่าชาวบ้านคือ มีซ็อคเก็ตสำหรับแบตกระดุม CR2032 มาด้วย ซึ่งเป็นเรื่องที่ดีเพราะเอาไปทำต้นแบบพวก wearable ง่ายขึ้น
ว่าด้วยซอฟต์แวร์
ทาง STMicro ไม่จัดเป็นขาใหญ่ในวงการ Bluetooth เมื่อเทียบกับเจ้าตลาดเดิม เช่น Texas Instruments เขาเลยเตรียมโค้ดตัวอย่างมาให้แบบจัดเต็ม มีทั้งโค้ดแบบ Bluetooth, Zigbee, Thread รวมไปถึงตัวอย่างที่ทำงานร่วมกับ RTOS โดยรวมมาในชุดของ STM32CubeWB ส่วนของชุดเครื่องมือพัฒนาก็เตรียมมาให้ 3 รูปแบบ ได้แก่ Keil MDK-ARM, IAR และ STM32CubeIDE ที่เป็นของ STMicro เอง โค้ดตัวอย่างจะอาศัย STM32CubeMX ในการสร้าง template เพื่อเรียกใช้ฮาร์ดแวร์ จึงมีไฟล์นามสกุล .ioc มาด้วย ซึ่งจะมีประโยชน์หากเราต้องการปรับแต่งฮาร์ดแวร์ที่จะใช้ในโค้ดชุดนั้น
ในภาพรวมบอร์ด STM32WB ถือได้ว่าเป็นตัวเลือกที่น่าสนใจ หากจะขอบ่นอะไรหน่อย คงเป็นเรื่องที่โค้ดของ wireless ให้มาในรูปแบบ binary firmware ที่จะต้องติดตั้งด้วยโปรแกรม STM32CubeProgrammer ผ่านกลไก Firmware Update Service ไปที่หน่วยความจำเฉพาะของส่วนคอร์ Cortex-M0+ ดังนั้น การ custom อะไรก็ตามในส่วนการสื่อสารไร้สายทั้งหมดจะถูกจำกัด เพราะเราต้องเลือกติดตั้งเฟิร์มแวร์ให้ตรงกับงานที่ต้องการก่อน ข้อจำกัดนี้ก็พอเข้าใจได้ว่าเรื่องนี้เป็น critical ในแง่การเป็น trade secret แต่ก็ทำให้ตัว STM32WB จริงๆแล้วก็เขียนโค้ดให้ทำงานได้เฉพาะ ARM Cortex-M4 เท่านั้น เพราะ Cortex-M0+ จะถูกล็อกไว้สำหรับเป็น comm. co-processor เลย
ว่าด้วยชุดเครื่องมือพัฒนา
โค้ดตัวอย่างของ STM32CubeWB จะมาใน 3 รูปแบบคือ Keil MDK-ARM, IAR และ STM32CubeIDE ซึ่งขอตัดตัวเลือก IAR ก่อนเลยเพราะต้องใช้ไลเซนส์ในการพัฒนา ช่วงนี้ Keil MDK-ARM ปล่อย Community edition ที่เรียกได้ว่า full function มาให้ใช้ฟรีแล้ว (ล็อกฟีเจอร์ PRO เช่น filesystem, CAN ซึ่งไม่กระทบ) แค่ไปลงทะเบียน ARM/mbed หน่อยก็สามารถขอไลเซนส์มาใช้ได้แล้ว เลยกลายเป็นตัวเลือกของ IDE ที่น่าสนใจ (แม้ UI จะคลาสสิกไปหน่อย) เมื่อเทียบกับ STM32CubeIDE ที่เลือกใช้ Eclipse เป็น engine ของ UI อีกตัวเลือกที่น่าสนใจคือ การใช้ VS Code มาหุ้มการ build ของ project ที่สร้างด้วย STM32CubeIDE ซึ่งเป็นผลงานของทีมวิศวกรใน Microsoft ที่จับงาน VS Code Extensionชื่อ Embedded Tools ดังนั้น ผมจึงลองทุกวิธีก่อน เพื่อเลือกชุดเครื่องมือพัฒนาที่น่าจะสะดวกหน่อยในการเอามาใช้จัด workshop
เครื่องมือตัวแรกที่ทดลองคือ Keil MDK-ARM ที่เริ่มด้วยการไปดาวน์โหลดและติดตั้ง Keil MDK-ARM รุ่น 5.37 จากเว็บไซต์ของ Keil จากนั้นจึงเลือกเมนู File > License Management เพื่อเริ่มต้นการ activate ไลเซนส์ตามที่อธิบายในหน้าเว็บของ Community edition พอติดตั้งเสร็จก็จะเห็นหน้าต่างแสดงไลเซนส์ที่ใช้งานไปได้อีก 1 ปี อีก 1 ขั้นที่ต้องเตรียมคือ การติดตั้ง software pack สำหรับรองรับหน่วยประมวลผล STM32WB เพราะตัว Keil MDK-ARM (เจ้าของคือ ARM) จะรองรับทุกตระกูลที่ใช้ส่วนคอร์ ARM เลยจะไม่ติดตั้งชุดเครื่องมือพัฒนาของหน่วยประมวลผลมาเลย โดยจะเลือกติดตั้งได้จากเมนู Project > Manage > Pack Installer แล้วค่อยไปเลือกหน่วยประมวลผลที่จะใช้ (STM32WB55RG) ซึ่งจะไปดาวน์โหลดและติดตั้ง STM32WBxx_DFP
โค้ดตัวอย่างใน STM32CubeWB แบ่งออกเป็น 2 โฟลเดอร์หลักคือ P-NUCLEO-WB55.Nucleo เป็นโค้ดตัวอย่างสำหรับบอร์ดพัฒนา STM32WB55 และ P-NUCLEO-WB55.USBDongle เป็นโค้ดตัวอย่างสำหรับตัว USB dongle ที่มาด้วย หากไล่เข้าไปในโฟลเดอร์ย่อย Applications ก็จะแยกออกเป็นหลายด้านตาม protocol แล้วก็ย่อยลงไปเป็นโค้ดตัวอย่างสำหรับงานต่างๆอีกที นอกจากนั้น STM32CubeWB ยังเตรียมโค้ดตัวอย่างสำหรับฮาร์ดแวร์อื่นๆของหน่วยประมวลผล เช่น UART, SPI, ADC มาด้วย โดยดูได้จากโฟลเดอร์ Examples
การใช้ Keil MDK-ARM กับโค้ดตัวอย่างจะเลือกจากเมนู Project > Open Project แล้วไปเลือกไฟล์นามสกุล .uvproj ในโฟลเดอร์ย่อย MDK-ARM ของโค้ดตัวอย่าง อย่างไรก็ตาม โค้ดตัวอย่างใน STM32CubeWB รุ่น 1.15 ตอนที่ทำบทความนี้ เหมือนพัฒนาขึ้นด้วย MDK-ARM รุ่นก่อน ทำให้มี setting ของคอมไพเลอร์เป็น ARM compiler 5 แต่ตัวคอมไพเลอร์ที่มากับ Keil MDK-ARM รุ่น 5.37 จะเป็น ARM compiler 6 เลยจะไม่สามารถ build ได้ทันที ต้องคลิกขวาที่ชื่อ target แล้วเลือก Options for target … เพื่อเปิดหน้าต่างตั้งค่า จากนั้นแก้ปัญหาใน 2 จุดก่อน
- แท็บ target ให้เลือก ARM compiler เป็น use default compiler version 6
- แท็บ C/C++ ให้ลบตัวเลือก — diag_suppress 1296 ในช่อง Misc controls
หลังจากนั้นจะสามารถ build โค้ดตัวอย่างได้อย่างราบรื่น รวมทั้งสามารถใช้ ST-Link ในการโปรแกรมตัวชิพได้ทันที
STM32CubeIDE เป็นชุดเครื่องมือพัฒนาของบริษัท STMicro เอง โดยสร้างขึ้นด้วยซอฟต์แวร์โอเพนซอร์สคือ ARM gcc ร่วมกับ Eclipse IDE การติดตั้งก็ไปดาวน์โหลดจากเว็บไซต์ของ STMicro การใช้งาน STM32CubeIDE เมื่อเทียบกับ Keil MDK-ARM จะง่ายกว่าในแง่การใช้งานเครื่องมืออื่นๆ เช่น STM32CubeMX รวมทั้งการติดตั้งโค้ด STM32CubeX ต่างๆ ซึ่งก็ไม่ได้แปลกอะไรเพราะมาจากต้นสังกัดเดียวกัน สิ่งที่ผมไม่ชอบคือ หน้าจอจะแน่นไปหน่อยตามสไตล์ IDE ที่ไปต่อยอดมาจาก Eclipse ซึ่งไม่ค่อยเหมาะกับหน้าจอของคอมพิวเตอร์แบบ notebook แต่หากใช้ desktop ไม่น่าจะมีปัญหาอะไร การเปิด project ก็เลือกเมนู File > Open Projects from Filesystem แล้วไปเลือกโฟลเดอร์ย่อย STM32CubeIDE ในโฟลเดอร์ของโค้ดตัวอย่างเท่านั้น
อีก 1 ตัวเลือกคือ การใช้ vcpkg ของ Microsoft เพื่อผนวกเอา toolchain และ setting ของ STM32CubeIDE มาทำงานใน VS Code ตอนอ่านบล็อกของ Microsoft ก็คิดว่าน่าสนใจเพราะปกติก็ใช้ VS Code กับงานอื่นๆอยู่แล้ว รวมทั้งใช้ Platform.io กับงานที่ใช้ ESP32 เป็นปกติ (เลิกใช้ Arduino IDE มาพักใหญ่แล้ว) ตอนเอามาลองทำดู ก็เจอปัญหาไปหลายจุดเลยเอามาบันทึกไว้ก่อน ขั้นตอน
- เริ่มด้วยการติดตั้ง vcpkg ซึ่งในบล็อกบอกให้พิมพ์คำสั่งนี้ใน PowerShell
iex (iwr -useb https://aka.ms/vcpkg-init.ps1)
ปัญหาที่เจอในขั้นนี้คือ คำสั่งนี้ไม่ไปตั้งค่า PATH ทำให้ไปเกิดปัญหาตอนใช้งาน ยังดีที่ตำแหน่งของการติดตั้งจำได้ว่าเป็น USER folder/.vcpkg เลยแก้ปัญหาได้
2. เข้าไปใน VS Code แล้วเลือกติดตั้ง extension ชื่อ Embedded Tools ของ Microsoft
3. ทำการแปลง project ของ STM32CubeIDE ที่บันทึกในไฟล์ .cproject ให้เป็นไฟล์ vcpkg_configuration.json ที่บอกเครื่องมือและขั้นตอนต่างๆในการทำงาน ในกรณีของโค้ดตัวอย่างของ STM32CubeWB จะใช้ File > Open Folder เพื่อเปิดโฟลเดอร์ย่อย STM32CubeIDE จากนั้นให้กดปุ่ม F1 แล้วพิมพ์ว่า Create project from ST project แล้วเลือกไฟล์ .cproject (หากโปรแกรม VS Code เด้ง ก็ทำใจไว้หน่อย)
4. เปิด terminal แล้วพิมพ์คำสั่ง vcpkg activate ตรงนี้หากไม่แก้ปัญหาเรื่อง PATH จะทำอะไรต่อไม่ได้ จึงต้องไปตั้ง PATH ใน environment variable ให้ชี้ไปที่โฟลเดอร์ของ vcpkg และ ninja ที่ติดตั้งไปแล้วด้วย
5. เมื่อทุกอย่างเรียบร้อย การ build ก็ไม่ยากแค่เลือกว่าจะเป็น debug หรือ release แล้วกดปุ่ม build ที่แผงควบคุมด้านล่างของ VS Code
終わりに (ในตอนท้าย)
บทความนี้เป็นบันทึกของประสบการณ์ขั้นแรกในการเตรียมตัวเพื่อจัด workshop อบรมการพัฒนา BLE tracking โดยใช้ STM32WB55 Nucleo Pack ตัวเลือกในตอนนี้ค่อนข้างเอียงมาที่ Keil MDK-ARM เพราะวิธีใช้จะเข้าใจง่ายกว่า หลังจากนี้น่าจะมีอีกสัก 1–2 บทความที่จะมาเล่าเกี่ยวกับเครื่องมืออื่นๆ โดยเฉพาะการติดตั้งเฟิร์มแวร์สำหรับ co-processor และการ sniff ข้อมูลกลางอากาศด้วย STM32MonRF ส่วนเนื้อหาของการเขียนโค้ด BLE อย่างไร จะเอาไปทำโจทย์ asset/product/human tracking อย่างไร และจะประมวลผลข้อมูลอย่างไร คงต้องรอไปเข้าร่วม workshop ครับ