บทนี้จะอธิบายถึงการใช้งาน GPIO และ Alternate function หรือ ตัวย่อ AFIO ผ่านทาง Register ที่ใช้ควบคุมการทำงาน จะมีวงจรที่เกี่ยวข้อง เช่น GPIO, USART, I2C, TIM, SPI, ADC และอื่นๆ โดยวงจรย่อยทั้งหมดนี้ สามารถดูรายละเอียดตามตารางด้านล่าง
![](https://www.makerwitawat.com/wp-content/uploads/2023/06/image-54.png)
AFIO (Alternate Function I/O) เป็นโมดูลที่ใช้สำหรับกำหนดการทำงานของขา I/O ในโหมดอื่นๆที่ไม่ใช่ขา I/O ธรรมดา เช่น โหมด Alternate Function, External Interrupt และ JTAG โดย AFIO จะช่วยให้ผู้ใช้งานสามารถกำหนดการทำงานของขา I/O ให้เป็นไปตามความต้องการได้ โดยใช้ฟังก์ชัน Remap ซึ่งจะเปลี่ยนแปลงการทำงานของขา I/O ให้เป็นไปตามโหมดที่ต้องการใช้งาน โดย AFIO นั้นเป็นส่วนหนึ่งของชิพ CH32V003 ที่ใช้งานร่วมกับ GPIO และ External Interrupt ในการกำหนดการทำงานของขา I/O
![](https://www.makerwitawat.com/wp-content/uploads/2023/06/image-38.png)
จากตารางด้านบน จะพบว่า นอกจากหน้าที่ใช้งานเป็น Input/Output แล้ว ยังมีวงจรย่อยที่ซ้อนทับกันอยู่ใน PIN เดี่ยวกันบางชนิดอีกด้วย ดังนั้นถ้าเราต้องการใช้งานวงจรย่อยเหล่านี้ จะต้องตั้งค่า Register ที่ Address ตามที่เอกสารระบุให้ถูกต้องก่อน ถึงจะใช้งานได้
Register และ Address ที่เกี่ยวข้อง
โดยทั่วไปแล้ว MCU จะทำงานได้เมื่อเราเขียน Code เข้าไปความคุมค่าต่างๆใน Address ที่ระบุการทำงานในจุดนั้นๆ ในที่นี้จะเป็นส่วนของ GPIO Control โดยมีรายละเอียดดังนี้
![](https://www.makerwitawat.com/wp-content/uploads/2023/06/image-53.png)
ในการกำหนดค่าการทำงานของ GPIO Control จะมี Address เริ่มต้นที่ 0x4001 0000 – 0x4001 3C00 ใช้สำหรับ เปิด/ปิด สัญญาณ GPIO ของ Module ต่างๆ
ในช่วง Address ที่ระบุไว้สามารถแยกย่อยได้ตามตารางที่เกี่ยวข้องด้านล่างนี้
![](https://www.makerwitawat.com/wp-content/uploads/2023/06/image-39.png)
โดยหลักๆแล้ว ในการเปิดการทำงานของวงจรต่างๆ จะใช้ Register ขนาด 32bit ที่ชื่อ GPIO_ ตามด้วยชื่อ PORT ในการ เปิด/ปิดใช้งาน GPIO แบบย่อยหรือ แบบเหมารวม ใน CH32V003 จะมีเฉพาะ PORT A, C, D เท่านั้น
คำย่อต่างๆ จะใช้งานอยู่ใน Code ที่ทาง WCH ให้มา เราสามารถใช่คำย่อเหล่านี้ในการอ้างอิงหรือเขียนโปรแกรมได้
![](https://www.makerwitawat.com/wp-content/uploads/2023/06/image-40.png)
![](https://www.makerwitawat.com/wp-content/uploads/2023/06/image-41.png)
![](https://www.makerwitawat.com/wp-content/uploads/2023/06/image-42.png)
![](https://www.makerwitawat.com/wp-content/uploads/2023/06/image-43.png)
![](https://www.makerwitawat.com/wp-content/uploads/2023/06/image-44.png)
![](https://www.makerwitawat.com/wp-content/uploads/2023/06/image-45.png)
ในการใช้งานบางวงจรย่อยของ GPIO ที่อยู่ใน PIN เดียวกันจะต้องเปิดสัญญาณ Clock ให้ทำงานในส่วนของ APB1 หรือ APB2 โดยดูตามตาราง Register ใน [CH32V003] EP2-ทำความรู้จักกับ Clock Control (RCC) ว่าวงจรย่อยในอยู่ส่วนไหนของ APB
การใช้งานบางครั้ง ค่าเริ่มต้นของ MCU ที่กำหนด Port มาให้ไม่ตรงกับความต้องการที่จะใช้งาน หรือ PIN สลับกัน สามารถแก้ไขสลับ PIN ในวงจรย่อยที่เกี่ยวข้องได้ โดยทาง WCH จะใช้คำว่า Remap ในการแก้ไข โดยมี Register ย่อยของ AFIO กำกับการใช้งาน
![](https://www.makerwitawat.com/wp-content/uploads/2023/06/image-46.png)
Register AFIO (Alternate function Input Output) จะควบคุมการสลับ PIN ในวงจรย่อยนั้นๆเช่น ต้องการสลับ PIN USART1 จาก TX/PD5, RX/PD6 เป็น TX/PD6, RX/PD5 ก็สามารถทำได้ ตามตาราง Register ด้านล่างนี้
![](https://www.makerwitawat.com/wp-content/uploads/2023/06/image-47.png)
![](https://www.makerwitawat.com/wp-content/uploads/2023/06/image-48.png)
Code ที่เกี่ยวข้อง
![](https://www.makerwitawat.com/wp-content/uploads/2023/06/image-49.png)
code ที่เกี่ยวข้องกับการควบคุม Register RCC จะอยู่ที่ไฟล์ ch32v00x_gpio.h และ ch32v00x_gpio.c ใน folder ที่อยู่ใน Framework หลักที่ทาง WCH เตรียมไว้ให้ โดยทั่วไปจะมีการเรียกใช้งาน Function หลักๆดังนี้
![](https://www.makerwitawat.com/wp-content/uploads/2023/06/image-50.png)
![](https://www.makerwitawat.com/wp-content/uploads/2023/06/image-51.png)
บทสรุป
ในการเปิดใช้งานจะต้องเปิด สัญญาณ Clock และกำหนด หน้าที่การทำงาน ตามที่ต้องการก่อนเสมอในครั้งแรก เพื่อใช้งาน GPIO ต่างๆ
CH32V003 : https://shopee.co.th/witawat57/23167328296
สนับสนุนร้านค้าของเรา เพื่อจะได้เป็นกำลังใจเขียนบทความใหม่ๆ