STM32CubeIDE เป็นเครื่องมือพัฒนาเฟิร์มแวร์ให้กับไมโครคอนโทรลเลอร์ STM32 ที่ออกมาจากผู้ผลิตชิปอย่าง STMicroelectronics แต่เดิมการพัฒนาเฟิร์มแวร์ให้กับไมโครคอนโทรลเลอร์ STM32 ต้องใช้เครื่องมือพัฒนาจากผู้พัฒนา IDE รวม เช่น µVision IDE (ARM Keil), IAR เป็นต้น โดยแต่ละเครื่องมือมีค่าใช้จ่ายที่จำเป็นต้องจ่ายเพิ่มหากต้องการพื้นที่เพิ่ม หรือการปรับแต่งโค้ดเชิงลึก รวมทั้งคอมไพล์เลอร์ต่าง ๆ มักจะเป็นลิขสิทธิ์เฉพาะของผู้พัฒนา IDE การที่ STMicroelectronics ทำ STM32CubeIDE ออกมา แล้วให้ใช้งานฟรี เปิดโอกาศให้นักพัฒนาสามารถเริ่มต้นใช้งานชิป STM32 ได้ง่ายขึ้น โดยไม่ต้องเสียค่าใช้จ่ายเพิ่มไปกับค่าเครื่องมือพัฒนาเฟิร์มแวร์
STM32CubeIDE เกิดขึ้นจากการรวมกันระหว่าง STM32CubeMX + IDE (เช่น ARM Keil) จากเดิมที่ขั้นตอนการพัฒนาเฟิร์มแวร์เริ่มจากการกำหนดขาใช้งานจากในโปรแกรม STM32CubeMX ก่อน แล้วค่อย Export โค้ด HAL มาพัฒนาต่อ เมื่อใช้ STM32CubeIDE สามารถกำหนดขาใช้งาน และเขียนโค้ดโปรแกรมต่อในโปรแกรมเดียวได้เลย โดยโปรแกรม STM32CubeIDE พัฒนามาจาก Eclipse หากเคยใช้งาน Eclipse อยู่แล้ว มาใช้งาน STM32CubeIDE จะเข้าใจขั้นตอนได้เร็วขึ้นมาก ทั้งขั้นตอนการสร้างโปรเจค การดีบัค การตั้งค่าต่าง ๆ
ในบทความนี้จะลองใช้ STM32CubeIDE พัฒนาไมโครคอนโทรลเลอร์ STM32 ในซีรีย์ STM32G0x0 ซึ่งเป็นไมโครคอนโทรลเลอร์ 32 บิต ใช้สถาปัตยกรรม Arm Cortex-M0+ หากเทียบกับซีรีย์อื่น จะพบว่าซีรีย์ STM32G0x0 ถูกวางตลาดให้ราคาต่ำสุด แต่สเปคคุ้มค่า เหมาะสำหรับนำไปผลิตสินค้าอิเล็กทรอนิกส์ที่ทำงานไม่ซับซ้อนมาก แต่ผลิตครั้งละมาก ๆ เฉพาะตัวชิปราคาเริ่มต้นประมาณ $1 เท่านั้น โดยในบทความนี้เลือกใช้ บอร์ดพัฒนา STM32G030C8T6 ในการทดสอบ
1) บอร์ดพัฒนา STM32G030C8T6 หรือบอร์ด STM32 อื่น ๆ
2) เครื่องอัพโหลดโปรแกรม ST-Link V2
การอัพโหลดโปรแกรมลงชิปตระกูล ARM จะทำผ่าน SWD Interface โดยมีขาที่ต้องต่อ 4 ขา คือ SWD, SWC, ไฟเลี้ยงชิป (3.3V) และกราวด์ โดยการต่อ ST-Link V2 เข้ากับ STM32 ให้ต่อ
ตัวอย่างการต่อ ST-Link V2 เข้ากับ บอร์ดพัฒนา STM32G030F6P6 แสดงดังรูปด้านล่าง
ดาวน์โหลดโปรแกรมได้ฟรีที่ลิ้งค์ https://www.st.com/en/development-tools/stm32cubeide.html (เข้าไปแล้วสมัครสมาชิก/เข้าสู่ระบบให้เรียบร้อยก่อน) เลื่อนลงมาหัวข้อ Get Software เลือกกดปุ่ม Get latest ตามระบบปฏิบัติการของเครื่องคอมพิวเตอร์
กดปุ่ม ACCEPT เพื่อยืนยันยอมรับเงื่อนไขการใช้งานโปรแกรม
จากนั้นจะมีไฟล์ .zip ขึ้นแถบดาวน์โหลด ให้รอจนกว่าจะดาวน์โหลดเสร็จ
คลายไฟล์ ZIP ออกมา จะได้ไฟล์ติดตั้ง .exe ให้ดับเบิ้ลคลิกเปิดไฟล์ติดตั้งได้เลย
ที่หน้าต่างติดตั้ง หน้าแรกให้กดปุ่ม Next
เงื่อนไขการใช้งานโปรแกรมจะแสดงขึ้นมา ให้กดปุ่ม I Accept เพื่อยืนยันยอมรับเงื่อนไขใช้งาน
เลือกโฟลเดอร์เก็บโปรแกรม (หรือใช้ค่าที่มีอยู่แล้ว) แล้วกดปุ่ม Next
เลือกไดร์เวอร์ของเครื่องดีบัคที่ต้องการติดตั้ง แนะนำให้เลือกติดตั้งทั้งหมด แล้วกดปุ่ม Next
รอจนกว่าจะติดตั้งเสร็จสิ้น
เมื่อติดตั้งเสร็จจะแสดงข้อความ Completed ให้กดปุ่ม Next
ในหน้าสุดท้ายแนะนำให้กดติ๊กตัวเลือก Create desktop shortcut ค้างไว้แล้วกด Finish
เป็นอันจบขั้นตอนการติดตั้งโปรแกรม STM32CubeIDE
ในโลกคอมพิวเตอร์โปรแกรมแรกมักเป็น Hello World แต่ในโลกไมโครคอนโทรลเลอร์โปรแกรมไฟกระพริบมักเป็นโปรแกรมแรก เนื่องจากการเขียนโปรแกรมไม่ซับซ้อน และสังเกตผลการทำงานได้ง่ายว่าทำงานได้ถูกต้องหรือไม่
ดับเบิ้ลคลิกเปิดโปรแกรม STM32CubeIDE ขึ้นมา
เลือกโฟลเดอร์หลักที่ใช้เก็บทุกโปรเจค (หรือใช้ค่าเริ่มต้น) แล้วกด Launch
หากขึ้นหน้าต่าง Security Alert ให้กด Allow access
หากขึ้นหน้าต่างแจ้ง Features Usage Statistics Agreement แนะนำให้กด Yes
สร้างโปรเจคใหม่ โดยกด File > New เลือก STM32 Project
สร้างโปรเจคครั้งแรก โปรแกรมจะดาวน์โหลดข้อมูลซักครู่
เลือกเบอร์ชิป STM32 โดยพิมพ์ชื่อเบอร์ลงช่องค้นหา (1) แล้วเลือกเบอร์ที่ถูกต้อง (2) แล้วกด Next (3)
กรอกชื่อโปรเจค (1) แล้วกดปุ่ม Finish (2)
หาก STM32 ตระกูลที่เลือกใช้สร้างโปรเจค ยังไม่เคยถูกเลือกมาก่อน โปรแกรมจะดาวน์โหลด SDK มาลงใหม่
ระหว่างดาวน์โหลดอาจมีหน้าต่างเงื่อนไขการใช้งานแสดงขึ้นมา ให้กดปุ่ม I have read, and agree แล้วกด Finish
เมื่อดาวน์โหลดเสร็จ จะมีหน้าต่าง Device Configuration Tool แสดงขึ้นมา (ดังรูป)
ตั้งค่าขาที่ต่อกับหลอดแอลอีดี (บอร์ดพัฒนา STM32G030C8T6 เลือกขา PB1) เพื่อใช้เขียนโปรแกรมไฟกระพริบ โดยกดที่รูปขาของไอซี แล้วเลือกโหมดของขานั้นเป็น GPIO_Output
ตั้งชื่อขาใหม่ โดยคลิกขวาที่ขาต่อหลอดแอลอีดี เลือก Enter User Label
ตั้งชื่อขาใหม่ (ตัวอย่างตั้งเป็น LED) เสร็จแล้วกดปุ่ม Enter จะเห็นว่าได้ชื่อขาใหม่ตามที่ตั้งแล้ว
เมื่อตั้งค่าขาต่าง ๆ เสร็จแล้ว ขั้นตอนต่อไปคือตั้งค่าสัญญาณนาฬิกา โดยกดที่เมนู Clock Configuration จะได้หน้าต่างตั้งค่า (ดังรูป)
ขั้นตอนตั้งค่าสัญญาณนาฬิกาจะแตกต่างกันไปตาม STM32 แต่ละเบอร์ จำเป็นต้องอ่าน Datasheet หรือเอกสารของชิปเบอร์นั้น ๆ ประกอบเพื่อทำความเข้าใจเรื่องการเลือกแหล่งกำเนิดสัญญาณนาฬิกา ตัวคูณสัญญาณ การหารสัญญาณ ความเร็วสัญญาณนาฬิกาสูงสุดของแต่ละวงจร และอื่น ๆ
หากใช้ บอร์ดพัฒนา STM32G030C8T6 และหากผู้อ่านยังไม่เชี่ยวชาญเรื่องการกำหนดสัญญาณนาฬิกา แนะนำให้ตั้งค่าตามผู้เขียนแนะนำไปก่อน ดังนี้
ตั้งสัญญาณนาฬิกาเร็วที่สุดที่ 64 MHz โดย
กดปุ่ม Ctrl + s บนคีย์บอร์ดเพื่อบันทึกการตั้งค่า จากนั้นโปรแกรมจะขึ้นหน้าต่างสอบถามเรื่องการ Gen Code จำนวน 2 ครั้ง ให้กดปุ่ม Yes ทั้ง 2 ครั้ง
เมื่อโปรแกรม Gen Code เสร็จ จะพามาหน้าแก้ไขไฟล์ main.c
การแก้ไขไฟล์ที่ถูก Gen Code ขึ้นมา จะต้องเพิ่มโค้ดลงไประหว่างบรรทัด USER CODE BEGIN และบรรทัด USER CODE END เท่านั้น หากเพิ่มโค้ดนอกกรอบบรรทัดดังกล่าว เมื่อแก้ไขการตั้งค่าขา ตั้งค่าสัญญาณนาฬิกา แล้วให้ Gen Code ใหม่ โค้ดที่อยู่นอกกรอบบรรทัดดังกล่าวจะถูกลบทิ้งหมด (ส่วนโค้ดที่อยู่ระหว่าง USER CODE BEGIN และ USER CODE END จะอยู่เหมือนเดิม)
ตัวอย่างการเพิ่มโค้ดโปรแกรมที่ถูกต้อง อยู่ระหว่างบรรทัด USER CODE BEGIN และ USER CODE END
ตัวอย่างการเพิ่มโค้ดโปรแกรมที่ไม่ถูกต้อง โค้ดที่เพิ่มอยู่นอกบรรทัด USER CODE BEGIN และ USER CODE END
การเขียนโปรแกรมสั่งงานไฟกระพริบเกี่ยวข้องกับคำสั่ง 2 คำสั่ง ดังนี้
ในไฟล์ main.h เลื่อนลงมาบรรทัด while (1) ให้เพิ่มโค้ดโปรแกรมลงไป 4 บรรทัด ดังนี้
กดปุ่มรูปค้อน (1) เพื่อทดสอบ Build โปรแกรม แล้วรอซักครู่ เมื่อ Build เสร็จ จะมีข้อความ Build Finished ขึ้น (2) หากพิมพ์โค้ดถูก จะแสดง 0 errors, 0 warnings (ดังรูป)
หน้าต่างด้านล่างขวา Build Analyzer บอกพื้นที่แรม/Flash ที่ใช้ไป และที่ยังเหลืออยู่
กดปุ่มเครื่องหมาย Play (ปุ่ม Run) เพื่ออัพโหลดโปรแกรมลงบอร์ด
หากกดปุ่ม Run ครั้งแรก จะมีให้ตั้งค่าการอัพโหลด ให้ใช้ค่าเริ่มต้นทั้งหมด แล้วกดปุ่ม OK
แล้วรอซักครู่ หากอัพโหลดสำเสร็จ จะมีข้อความ Download verified successfully ขึ้น (ดังรูป)
สังเกตที่บอร์ด ไฟ D2 จะพริบเรียบร้อยแล้ว
ตัวอย่างเขียนโปรแกรมรับค่าจากสวิตช์ K1 บนบอร์ด มาสั่งเปิด-ปิดหลอดแอลอีดี พร้อมนับจำนวนครั้งที่สั่งเปิด-ปิด
ที่โปรแกรม STM32CubeIDE กดกลับไปที่แท๊บไฟล์ .ioc หรือหากปิดไปแล้ว ให้ดับเบิ้ลคลิกเปิดไฟล์ .ioc ด้านซ้ายขึ้นมาใหม่
ที่ขา PA0 คลิกซ้ายเลือกเป็น GPIO_Input
แก้ไขชื่อขา PA0 โดยคลิกขวาที่ขา PA0 เลือก Enter User Label ใส่ชื่อขาใหม่เป็น SW_K1 กดปุ่ม Enter ได้ชื่อขาใหม่ (ดังรูป)
เนื่องจากวงจรด้านบนไม่ได้ต่อตัวต้านทานเป็น Pull-up ไว้ด้วย ทำให้วงจรสวิตช์ทำงานไม่สมบูรณ์ แต่สามารถเลือกใช้ Internal Pull-up (ใช้ตัวต้านทานภายในชิป MCU) แทนได้ โดยคลิกขยายเมนู System Core (1) เลือก GPIO (2) แล้วเลือก PA0 (3) ที่ช่อง GPIO Pull-up/Pull-down ให้เลือกเป็น Pull-up (4)
กด Ctrl + S เพื่อบันทึกการเปลี่ยนแปลง และกดปุ่ม Yes เพื่อยืนยันให้ Gen Code ใหม่
โปรแกรมจะพากลับมาที่แท๊บ main.c ตามเดิม หากก่อนหน้านี้วางโค้ดไว้ถูกต้อง โค้ดที่วางไว้จะไม่หายไปแม้มีการ Gen Code ใหม่
การรับค่าจากสวิตช์เกี่ยวข้องกับคำสั่งดังนี้
บรรทัด while(1) ปรับโค้ดใหม่ดังนี้
ทดสอบ Build โดยกดรูปค้อน
เมื่อผ่านแล้วจึงกดปุ่ม Run เพื่ออัพโหลดโปรแกรม
ผลที่ได้คือ กดสวิตช์แล้วไฟติด กดอีกครั้งไฟดับ สลับกันไปเรื่อย ๆ