บทนี้จะอธิบายถึงการใช้งาน GPIO และ Alternate function หรือ ตัวย่อ AFIO ผ่านทาง Register ที่ใช้ควบคุมการทำงาน จะมีวงจรที่เกี่ยวข้อง เช่น GPIO, USART, I2C, TIM, SPI, ADC และอื่นๆ โดยวงจรย่อยทั้งหมดนี้ สามารถดูรายละเอียดตามตารางด้านล่าง

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

จากตารางด้านบน จะพบว่า นอกจากหน้าที่ใช้งานเป็น Input/Output แล้ว ยังมีวงจรย่อยที่ซ้อนทับกันอยู่ใน PIN เดี่ยวกันบางชนิดอีกด้วย ดังนั้นถ้าเราต้องการใช้งานวงจรย่อยเหล่านี้ จะต้องตั้งค่า Register ที่ Address ตามที่เอกสารระบุให้ถูกต้องก่อน ถึงจะใช้งานได้
Register และ Address ที่เกี่ยวข้อง
โดยทั่วไปแล้ว MCU จะทำงานได้เมื่อเราเขียน Code เข้าไปความคุมค่าต่างๆใน Address ที่ระบุการทำงานในจุดนั้นๆ ในที่นี้จะเป็นส่วนของ GPIO Control โดยมีรายละเอียดดังนี้

ในการกำหนดค่าการทำงานของ GPIO Control จะมี Address เริ่มต้นที่ 0x4001 0000 – 0x4001 3C00 ใช้สำหรับ เปิด/ปิด สัญญาณ GPIO ของ Module ต่างๆ
ในช่วง Address ที่ระบุไว้สามารถแยกย่อยได้ตามตารางที่เกี่ยวข้องด้านล่างนี้

โดยหลักๆแล้ว ในการเปิดการทำงานของวงจรต่างๆ จะใช้ Register ขนาด 32bit ที่ชื่อ GPIO_ ตามด้วยชื่อ PORT ในการ เปิด/ปิดใช้งาน GPIO แบบย่อยหรือ แบบเหมารวม ใน CH32V003 จะมีเฉพาะ PORT A, C, D เท่านั้น
คำย่อต่างๆ จะใช้งานอยู่ใน Code ที่ทาง WCH ให้มา เราสามารถใช่คำย่อเหล่านี้ในการอ้างอิงหรือเขียนโปรแกรมได้






ในการใช้งานบางวงจรย่อยของ GPIO ที่อยู่ใน PIN เดียวกันจะต้องเปิดสัญญาณ Clock ให้ทำงานในส่วนของ APB1 หรือ APB2 โดยดูตามตาราง Register ใน [CH32V003] EP2-ทำความรู้จักกับ Clock Control (RCC) ว่าวงจรย่อยในอยู่ส่วนไหนของ APB
การใช้งานบางครั้ง ค่าเริ่มต้นของ MCU ที่กำหนด Port มาให้ไม่ตรงกับความต้องการที่จะใช้งาน หรือ PIN สลับกัน สามารถแก้ไขสลับ PIN ในวงจรย่อยที่เกี่ยวข้องได้ โดยทาง WCH จะใช้คำว่า Remap ในการแก้ไข โดยมี Register ย่อยของ AFIO กำกับการใช้งาน

Register AFIO (Alternate function Input Output) จะควบคุมการสลับ PIN ในวงจรย่อยนั้นๆเช่น ต้องการสลับ PIN USART1 จาก TX/PD5, RX/PD6 เป็น TX/PD6, RX/PD5 ก็สามารถทำได้ ตามตาราง Register ด้านล่างนี้


Code ที่เกี่ยวข้อง

code ที่เกี่ยวข้องกับการควบคุม Register RCC จะอยู่ที่ไฟล์ ch32v00x_gpio.h และ ch32v00x_gpio.c ใน folder ที่อยู่ใน Framework หลักที่ทาง WCH เตรียมไว้ให้ โดยทั่วไปจะมีการเรียกใช้งาน Function หลักๆดังนี้


บทสรุป
ในการเปิดใช้งานจะต้องเปิด สัญญาณ Clock และกำหนด หน้าที่การทำงาน ตามที่ต้องการก่อนเสมอในครั้งแรก เพื่อใช้งาน GPIO ต่างๆ
CH32V003 : https://shopee.co.th/witawat57/23167328296
สนับสนุนร้านค้าของเรา เพื่อจะได้เป็นกำลังใจเขียนบทความใหม่ๆ