การใช้งาน STM32CubeIDE กับ STM32F103C8T6

บทความนี้เกี่ยวกับการใช้ STM32CubeIDE เพื่อพัฒนาแอปพลิเคชันสำหรับไมโครคอนโทรลเลอร์ STM32 ทำไมต้องพัฒนาแอปพลิเคชันโดยใช้ STM32Cube IDE และข้อดีและข้อเสียของการใช้งานคืออะไร?

อุปกรณ์ที่ใช้



STM32CubeIDE เป็นระบบการพัฒนาที่สมบูรณ์เพื่อพัฒนาโค้ดสำหรับไมโครคอนโทรลเลอร์ที่ใช้ STM32 เกือบทั้งหมดจาก ST Microelectronics ตามชื่อที่แนะนำมันคือ Integrated Development Environment (IDE) ที่โดยพื้นฐานแล้วรวมถึงเครื่องมือคอนฟิกูเรชัน STMCubeMx GUI HW และคอมไพเลอร์แบบเต็ม

สามารถใช้เป็นแพลตฟอร์มการพัฒนาสำหรับ MCU ของ STM32 ทั้งหมดไม่ว่าจะเป็นบนบอร์ดพัฒนาเช่นจากตระกูล Nucleo หรือ Discovery ของ ST หรือบอร์ดที่ออกแบบเอง

ข้อดีอีกประการหนึ่งคือช่วยให้ควบคุม MCU ได้ดีขึ้นมาก เมื่อเทียบกับ Arduino แล้วผู้ใช้ไม่ได้ จำกัด อยู่เพียงแค่ฟังก์ชันที่ Arduino มอบให้อีกต่อไปและ MCU นั้นได้รับการพอร์ตไปเพื่ออะไร

ประการหนึ่งการใช้ STM32CubeIDE ผู้ใช้ต้องเข้าสู่ระบบ ST’s ecosystem กล่าวอีกนัยหนึ่งก็คือมันมุ่งไปที่ MCU ในตระกูล STM32 ST ที่มี MCU ของ STM32 ให้เลือกมากมายและวิธีนี้หมายความว่าเมื่อเขียนแอปพลิเคชันแล้วมันค่อนข้างง่ายที่จะโอนย้ายไปยังสมาชิกในตระกูล STM32 ที่มีประสิทธิภาพมากกว่าอีกหากจำเป็น

อีกประการหนึ่งคือ รู้ที่มาของการเขียนโค้ดภาษา C / C ++ กล่าวอีกนัยหนึ่งตัวอย่างเช่น abstractions HW ระดับสูงกว่าบางส่วนจาก Arduino ไม่สามารถใช้งานได้

ไม่ง่ายเหมือนการเรียกใช้ฟังก์ชัน Serial.begin หรือ DigitalWrite เช่นเดียวกับใน Arduino พอร์ต UART หรือ GPIO ซึ่งต้องได้รับการเตรียมใช้งานอย่างถูกต้องไว้ก่อน

นี่คือที่ที่เครื่องมือกำหนดค่า GUI ช่วย อย่างไรก็ตามนี่ยังหมายความว่าผู้ใช้จะต้องตระหนักถึงสถาปัตยกรรมภายในของ MCU และการออกแบบฮาร์ดแวร์ จริง

ดังที่จะเห็นในภายหลังความรู้เกี่ยวกับ HAL API ของ ST ที่เหมาะสมก็ช่วยได้เช่นกัน Hardware Abstraction Layer Application Programming Interface นี้ช่วยให้การเปลี่ยนจาก Arduino ไปใช้ STM32CubeIDE ง่ายขึ้นอย่างมาก

สำหรับวัตถุประสงค์ของบทความนี้จะใช้บอร์ด STM32F103C8T6 เป็นฮาร์ดแวร์เบื้องต้น ที่พร้อมใช้งานและทำหน้าที่ในการแนะนำ STM32CubeIDE

นอกเหนือจาก STM32F103C8T6 แล้วจะต้องมีอุปกรณ์โปรแกรมเมอร์ด้วย คือ STLInk V2 สำหรับใช้ในการอัพโหลดโค้ด

การกำหนดค่าฮาร์ดแวร์


สิ่งแรกที่ต้องทำคือติดตั้ง STM32CubeIDE ตามขั้นตอนบทความด้านล่าง


หลังจากการติดตั้งคุณสามารถเริ่มต้นแอปพลิเคชันได้ เลือกจาก File -> New -> STM32 Project

การใช้งาน STM32CubeIDE


ที่ช่อง Part Number คีย์ STM32F103C8


หลังจากนั้นครู่หนึ่งหน้าจอ MCUs/MPUs List แสดงอุปกรณ์ที่พบ แล้ว คลิกที่ 2


คลิก Next >


ตั้งชื่อโปรเจค ในตัวอย่างเป็น LED -> Finish

ใช้เวลาสักครู่ และนี่คือที่ที่จำเป็นต้องมีความรู้เกี่ยวกับฮาร์ดแวร์ที่แท้จริง แสดงแผนผังของโมดูล MCU เป็น STM32F103C8T6 นี่คือสิ่งที่เลือก


ขาของ STM32 MCU เช่นเดียวกับ MCU อื่น ๆ ส่วนใหญ่สามารถกำหนดค่าสำหรับการใช้งานหลายอย่างเช่น GPIO, ADC, Timer และอื่น ๆ ที่นี่อีกครั้งจำเป็นต้องมีความรู้เกี่ยวกับ ฮาร์ดแวร์ ที่แท้จริงเพื่อกำหนดค่าอย่างเหมาะสมสำหรับการใช้งานตามวัตถุประสงค์

เนื่องจากแอปพลิเคชันต้องการไฟกะพริบ LED ในตัวจึงจำเป็นต้องตั้งค่าขาที่เชื่อมต่อกับ LED ภายในบอร์ด เมื่อมองไปที่แผนผังของรูปจะเห็นว่า LED ภายในบอร์ดเชื่อมต่อกับขา PC13 ดังนั้นต้องกำหนดขานี้ให้เป็นขาเอาต์พุต GPIO



ด้วยการคลิกซ้ายที่ขา PC13 -> เลือกเป็น GPIO_Output


สังเกตที่ขา PC13 จะเปลี่ยนเป็นสีเขียว และมีป้ายกํากับเป็น (Label) เป็น GPIO_Output

เราสามารถเปลียน ป้ายกํากับ (Label) เป็นชื่ออื่นๆได้โดยการ ไปที่ System Core


ไปที่ GPIO


ติ๊กเลือกขา PC13 เพื่อแก้ไข (Modifi)



ไปที่ User Label แก้ไขเป็น LED (สังเกตป้ายกํากับเปลียนเป็น LED ตามที่เราแก้ไข)


ไปที่ SYS ที่ Debug เลือกเป็น Trace Asynchronous SW




คลิกที่ Code Generation (เพื่อสร้างโค้ดให้อัตโนมัติ)




ไปที่ Core จากนั้นไปที่ Src แล้วคลิกที่ main.c



เลื่อนหน้าต่างนี้ลงไปที่ฟังก์ชัน int main (void) จะเห็นว่ามันเรียกใช้ฟังก์ชัน 3 ฟังก์ชันแล้ว: คือ HAL_Init () , SystemClock_Config () และ MX_GPIO_Init () ฟังก์ชันที่แท้จริงถูกกำหนดไว้เพิ่มเติมใน main.c. นี่คือฟังก์ชันการตั้งค่า ฮาร์ดแวร์  ที่สร้างขึ้นโดยอัตโนมัติตามการกำหนดค่าของผู้ใช้ที่ป้อนไว้ก่อนหน้านี้


ในตัวอย่างนี้ เราจะมาทดลองสั่งงาน เปิด/ปิด หลอดไฟ LED ที่เชื่อมต่อกับ ขา PC13 ที่มาพร้อมกับบอร์ด STM32 อยู่แล้ว หลักการทำงานคือ ให้มีการทำให้ LED กระพริบด้วยอัตราคงที่ (ให้สลับสถานะลอจิกทุก ๆ 500 มิลลิวินาที)

โดยในบทความนี้จะมีการเพิ่มโค้ด ในส่วน ล่าง /* Private define


 #define LED_Pin GPIO_PIN_13
 #define LED_GPIO_Port GPIOC


การใช้ป้ายกำกับ LED ที่แก้ไขก่อนหน้านี้ตัวสร้างโค้ด และได้กำหนดชื่อบางชื่อเป็น GPIO_PIN_13 แล้วและพอร์ตเปิดอยู่ ในกรณีนี้ LED_Pin คือ GPIO_PIN_13 และ LED_GPIO_Port คือ GPIOC



กลับไปที่ main.c และแทรกสองบรรทัดต่อไปนี้ระหว่าง / * USER CODE BEGIN WHILE * / และ / * USER CODE END WHILE * /


HAL_Delay(500); 
HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);



บรรทัดแรกคือการหน่วงเวลา 500 มิลลิวินาทีและบรรทัดที่สองเพียงแค่สลับขา LED ตามที่กำหนดไว้ก่อนหน้านี้ เนื่องจากอยู่ในลูปหลักจึงทำซ้ำตลอดไปและไฟ LED จึงกะพริบตลอดไป

ส่วนที่สำคัญกว่าของโค้ดคือฟังก์ชันจริงที่ถูกเรียกใช้ในลูปหลัก ฟังก์ชันเหล่านี้เป็นส่วนหนึ่งของ HAL API ที่รวมอยู่แล้วในแอปพลิเคชันที่เพิ่งพัฒนา

การทำความเข้าใจ HAL API นี้และการรู้ว่ามีอะไรบ้างและวิธีการเรียกใช้ฟังก์ชัน HAL ต่างๆจะช่วยให้การพัฒนาโค้ดสำหรับ STM32 MCU ง่ายขึ้นและเร็วขึ้น นี่คือลิงค์ไปยัง User manual ของ HAL API

โปรดสังเกตว่าฟังก์ชันการกะพริบนี้แตกต่างจากการใช้งานการกะพริบของ Arduino ทั่วไปอย่างไรเนื่องจากการเรียกใช้ฟังก์ชัน HAL_GPIO_TogglePin () เพียงครั้งเดียว

การคอมไพล์


ในการการคอมไพล์โค้ด เพียงไปที่แท็บ Project แล้วเลือก Build All


ถ้าไม่มีข้อผิดพลาดในการคอมไพล์ จะขึ้นข้อความ Build Finished 0 errors, 0 warnings. ที่ Console แล้วให้ไปที่โฟลเดอร์ Debug ที่เพิ่มเข้ามา จะพบไฟล์ LED.bin ซึ่งไฟล์นี้เราสามารถนำไปโปรแกรมลงบอร์ดไมโครคอนโทรลเลอร์ STM32 ได้



การโหลดโค้ด



การโหลดโค้ด STM32F103C8T6 ทำตามขั้นตอนลิงค์ด้านล่าง