การสร้างเฟิร์มแวร์สำหรับ STM32WB55 ตอน 2 (เครื่องมือสนับสนุนการพัฒนา)
บทความนี้เป็นตอนที่ 2 ของการแนะนำเกี่ยวกับการพัฒนาซอฟต์แวร์สำหรับชุดพัฒนา STM32WB55 Nucleo Pack โดยหลังจากตอนแรกได้แนะนำชุดเครื่องมือพัฒนาที่จะใช้แล้ว (คงเลือก Keil MDK-ARM) จะมาแนะนำเครื่องมือตัวอื่นๆที่จำเป็น
โปรแกรม STM32CubeProgrammer เป็นซอฟต์แวร์หลักสำหรับติดตั้งเฟิร์มแวร์ลงในตัวหน่วยประมวลผลตระกูล STM32 โดยสามารถเลือกเชื่อมต่อได้ 3 รูปแบบ ได้แก่ ผ่าน ST-Link โดยใช้ความสามารถด้าน programmer/debugger ในการติดตั้งลงชิพหน่วยประมวลผล และผ่าน USB หรือ UART ซึ่งจะใช้การเชื่อมกับ bootloader ของบอร์ด แม้ว่าการติดตั้งเฟิร์มแวร์หลังจาก build แล้ว จะสามารถดาวน์โหลดไปยังหน่วยประมวลผล STM32WB55RG บนบอร์ดผ่าน ST-Link ได้ เรายังคงต้องพึ่งพาโปรแกรม STM32CubeProgrammer ใน 2 สถานการณ์คือ
- การติดตั้งเฟิร์มแวร์ลง USB dongle เพราะตัว dongle ไม่มีชิพที่ทำหน้าที่ ST-Link มาด้วย
- การติดตั้งเฟิร์มแวร์ของการสื่อสารไร้สายไปยังหน่วยความจำเฉพาะของส่วนคอร์ ARM Cortex-M0+ ในตัว STM32WB55RG
อีกหนึ่งตัวช่วยสำคัญคือ โปรแกรม STM32CubeMonitor-RF สำหรับการตรวจสอบการทำงานของโพรโทคอลสื่อสาร เพื่อให้มั่นใจว่าเฟิร์มแวร์ที่พัฒนาขึ้นมีลำดับและข้อมูลต่างๆที่สื่อสารกันถูกต้อง
การใช้ USB dongle เพื่อทดสอบ BLE
ตัว USB dongle มีหน่วยประมวลผล STM32WB55CG บนบอร์ด โดยจะอาศัยส่วน USB บนตัวชิพเพื่อจำลองการทำงานของ USB ในหน้าที่ต่างๆ ชุดซอฟต์แวร์ STM32CubeWB ได้รวมโค้ดตัวอย่างของ dongle ในโฟลเดอร์ P-NUCLEO-WB55.USBDongle ซึ่งจะใช้ปรับการทำงานของ dongle ให้เหมาะกับหน้าที่ต่างๆได้ บทความนี้จะทดลองใช้โค้ดตัวอย่าง BLE_TransparentModeVCP เพื่อเปลี่ยนหน้าที่ของตัว USB dongle ไปใช้งานร่วมกับโปรแกรม STM32CubeMonitor-RF ต่อไป
ขั้นตอนแรกในการโปรแกรมตัว USB dongle เริ่มจากใช้โปรแกรม Keil MDK-ARM เปิดไฟล์ project ของโค้ดตัวอย่าง BLE_TransparentModeVCP จากนั้นจึงทำการ build ตัวเฟิร์มแวร์ ไฟล์ binary ของเฟิร์มแวร์คือ BLE_TransparentModeVCP.hex จะถูกเก็บไว้ในโฟลเดอร์ย่อย MDK-ARM\BLE_TransparentModeVCP\Exe แต่เราจะไม่สามารถดาวน์โหลดเฟิร์มแวร์ลงไปที่ dongle ได้ เพราะไม่มีส่วนเชื่อมต่อ ST-Link สำหรับเขียนลงไปในหน่วยประมวลผล
ขั้นตอนที่สองคือ การสลับโหมด boot ของ USB dongle ไปที่โหมด DFU (Device Firmware Update) โดยผลักสวิทช์ BOOT0 ไปทางปลาย จากนั้นจึงเสียบเข้าพอร์ต USB ของคอมพิวเตอร์ เราจะสามารถโปรแกรมเฟิร์มแวร์ที่เป็นไฟล์นามสกุล .hex เข้าตัว dongle ได้ด้วยการเลือกเชื่อมต่อแบบ USB จากนั้นจึงเปิดไฟล์ .hex แล้วจึงคลิกดาวน์โหลดเพื่อติดตั้ง
หลังจากติดตั้งเฟิร์มแวร์แล้ว ให้ถอด dongle เพื่อมาสลับปุ่ม BOOT0 กลับมาโหมดปกติแล้วเสียบกลับเข้าพอร์ต USB จากนั้นจึงเปิดโปรแกรม STM32CubeMonitor-RF ตัว USB dongle จะทำหน้าที่เป็นแปลงโพรโทคอลระหว่าง BLE และ UART โดยคอมพิวเตอร์จะเห็นตัว dongle ในฐานะพอร์ตอนุกรม การเชื่อมต่อกับ dongle จึงใช้การเลือกพอร์ตอนุกรม (อาจเช็คก่อนด้วย Device Manager) แล้วกด connect
โปรแกรม STM32CubeMonitor-RF จะแสดงรายการของคำสั่งในลำดับชั้นต่างๆ (HCI/GAP/GATT) ของโพรโทคอล Bluetooth Low Energy ซึ่งเราจะสามารถเลือกคำสั่งและกำหนดค่าที่ต้องการเพื่อส่งไปที่ตัว USB dongle ได้ นอกจากนี้ โปรแกรม STM32CubeMonitor-RF ยังมีฟีเจอร์สนับสนุนอีกหลายอย่าง เช่น การตั้ง USB dongle ให้กระจายข้อมูล (advertise)
การโปรแกรมส่วน co-processor
เราสามารถกำหนดบอร์ดพัฒนา STM32WB55 ให้สื่อสารด้วยโพรโทคอลที่แตกต่างกันได้ โดยติดตั้งเฟิร์มแวร์เฉพาะไปที่หน่วยความจำของส่วนคอร์ ARM Cortex-M0+ ชุดซอฟต์แวร์ STM32CubeWB ได้รวมเฟิร์มแวร์ในรูปแบบไฟล์ binary ในโฟลเดอร์ STM32WB_Copro_Wireless_Binaries โดยแบ่งเป็น 3 โฟลเดอร์ย่อย (1X/3X/5X) ตามรุ่นของ STM32WB การเลือกใช้เฟิร์มแวร์ของการสื่อสารจะขึ้นอยู่กับโพรโทคอลและหน้าที่ของเฟิร์มแวร์หลัก โค้ดตัวอย่างที่ใช้อธิบายคือ BLE_Beacon ที่จะประกาศข้อมูล (advertise) โดยใช้ร่วมกับเฟิร์มแวร์ stm32wb5x_BLE_Stack_full_fw.bin
การสร้างและติดตั้งโค้ด BLE_Beacon แบ่งออกเป็น 2 ขั้นตอน เริ่มจากการเตรียมฮาร์ดแวร์โดยใช้โปรแกรม STM32CubeProgrammer เพื่อติดตั้ง/ยืนยัน Firmware Update Service (FUS) แล้วจึงติดตั้งไฟล์ binary สำหรับ ARM Cortex-M0+ หลังจากนั้นจึงเป็นการ build เฟิร์มแวร์ของโค้ดตัวอย่าง ไฟล์ binary ของ FUS และส่วนคอร์ ARM Cortex-M0+ จะอยู่ในโฟลเดอร์ STM32WB_Copro_Wireless_Binaries เหมือนกัน การติดตั้งเริ่มด้วยการใช้โปรแกรม STM32CubeProgrammer เพื่อเชื่อมต่อกับบอร์ดพัฒนา STM32WB55 ผ่านทาง ST-Link
การเชื่อมต่อบริการ FUS จะเริ่มด้วยการเลือกเมนู Firmware Update Services แล้วไปคลิก Start FUS เพื่อเริ่มต้นบริการ FUS แล้วคลิกที่ปุ่ม Read FUS Info จะมีการแสดงสถานะของบริการ รุ่นของ FUS ที่อัพเดทล่าสุดคือ 1.2.0 ซึ่งหากต้องการอัพเดทให้เลือกไฟล์ stm32wb5x_FUS_fw.bin กำหนดตำแหน่งหน่วยความจำที่ 0x080EC000 แล้วคลิก firmware update การอัพเดทเฟิร์มแวร์ของส่วนคอร์ ARM Cortex-M0+ ทำในรูปแบบเดียวกัน โดยเช็คตำแหน่งหน่วยความจำได้จากไฟล์ Release_Notes.html ในกรณี STM32CubeWB รุ่น 1.15 ตำแหน่งหน่วยความจำของ stm32wb5x_BLE_Stack_full_fw.bin คือ 0x080CE000
การทดสอบว่าบริการ FUS และ wireless stack ทำงานถูกต้องหรือไม่ ให้เลือก build โค้ดตัวอย่างแล้วติดตั้ง จากนั้นจึงตรวจสอบสถานะการทำงานที่จะถูกรายงานผ่านพอร์ตอนุกรม VCP บทความนี้จะใช้โค้ด BLE Beacon ที่จะเห็นข้อความแสดงการรายงานสถานะ advertise ผ่านโปรแกรมประเภท serial terminal
終わりに (ในตอนท้าย)
ผมแนะนำการใช้โปรแกรม STM32CubeProgrammer และ STM32Monitor-RF ที่จำเป็นสำหรับการพัฒนาเฟิร์มแวร์สำหรับบอร์ด STM32WB55 นอกจากนี้ โปรแกรมอื่นที่ควรรู้น่าจะเป็นตัว STM32CubeMX ซึ่งใช้ในการสร้าง project หลังจากเลือกว่าจะใช้ฮาร์ดแวร์อะไรบ้าง ขั้นตอนและเครื่องมือสำหรับการพัฒนาเฟิร์มแวร์ให้กับตัวหน่วยประมวลผล STM32WB55 แม้จะซับซ้อน แต่คงหลีกเลี่ยงไม่ได้หากเราต้องการความสามารถที่เกินระดับงานอดิเรกหรือการบ้าน … ไม่ได้พูดเวอร์แต่ดูได้จากโค้ดตัวอย่างที่มาในชุด STM32CubeWB เริ่มจาก BLE profile ต่างๆ (heart rate, blood pressure, HID) BLE mesh ส่วนของ Zigbee มีทั้ง coordinator, router และ client นอกจากนี้ แต่ละโค้ดยังมีตัวเลือกของการใช้ RTOS และฟีเจอร์ low-power (ถึงได้เตรียมช่องใส่แบตกระดุม CR2032 ไว้สาธิต) เนื้อหาตอน 3 คงไม่มีแล้ว ใครสนใจก็อยากให้สมัครมา workshop ที่น่าจะจัดตอนต้นเดือนมกราคมกัน พอได้ไอเดียแล้วก็เอาบอร์ดกลับไปลองกันต่อ อย่างน้อยก็ถือว่ามาช่วยสนับสนุน TESA เพื่อให้มีงบจัดกิจกรรมดีๆต่อไปครับ