LPC17XX GPIO - koson/Embedded-Things GitHub Wiki

LPC17XX GPIO

MCU ร่วมตระกูลกับ LPC17xx นั้นมีหลายเบอร์ แต่การเซ็ตค่า GPIO ก็ไม่ต่างกัน อาจจะต่างกันที่จำนวน ports ซึ่งในที่นี้ใช้รุ่น 100 ขา สามารถดู datasheet ได้จาก LPC1769_68_67_66_65_64_63.pdf และ user manual ได้จาก LPC17XX user manual

การจัดวางขาบนเจ้า LPC1768 นี้จะแบ่งออกเป็น 5 กลุ่ม (5 PORT) โดยไล่ตั้งแต่ PORT0 ถึง PORT4 ซึ่งพอร์ตต่างๆ จะเชื่อมต่อกับรีจิสเตอร์ภายในขนาด 32 บิต แต่ก็ไม่ได้หมายความว่าทุกพอร์ตต้องมีขาครบทั้ง 32 บิต

การตั้งชื่อขาก็ตั้งแบบตรงไปตรงมา นั่นคือ P0.0 ใช้สำหรับ group 0, pin 0 หรือ Port 0, Pin 0 เป็นต้น

แต่ละขาของ LPC1768 จะมีการทำงานได้ใน 4 โหมด ได้แก่โหมด 00 หรือ GPIO ซึ่งเป็นค่าเริ่มต้นตอนรีเซ็ต ,โหมด 01 เป็นฟังก์ชันทางเลือกที่ 1, โหมด 10 เป็นฟังก์ชันทางเลือกที่ 2 และโหมด 11 เป็นฟังก์ชันทางเลือกที่ 3

ขา GPIO ทั้งหมดจะมี power จ่ายให้ตลอดเวลา เราไม่จำเป็นต้องสั่งเปิดปิด power ให้กับ GPIO เช่นเดียวกับอุปกรณ์ต่อพ่วงอื่นๆ

การใช้งาน GPIO ของ LPC1768 ในการใช้งาน GPIO บน LPC1768 นั้น ต้องมีการเตรียมการต่างๆ พอเป็นพิธี ดังต่อไปนี้คือ

  1. กำหนดฟังก์ชันของขาที่ใช้งาน (ในที่นี้ให้เป็น GPIO)

  2. กำหนดทิศทางของสัญญาณ

  3. กำหนดการ pullup หรือ pulldown

  4. ใช้งานขา GPIO

1. กำหนดฟังก์ชันของขาที่ใช้งาน

การกำหนดฟังก์ชันของขาที่ใช้งาน จะกำหนดผ่านรีจิสเตอร์ LPC_PINCON โดยมีการจัดเรียงการควบคุมดังนี้ ดูที่หน้า106 ของ user manual

 PINSEL
ตำแหน่งขาที่ควบคุม 
 LPC_PINCON->PINSEL0[1:0]
 PIN 0.0
 ...
 ...
 LPC_PINCON->PINSEL0[31:30]
 PIN 0.15
 LPC_PINCON->PINSEL1[1:0]
 PIN 0.16
 ...
 ...
 LPC_PINCON->PINSEL1[29:28]
 PIN 0.30
 LPC_PINCON->PINSEL2[1:0]
 PIN 1.0
 ...

 LPC_PINCON->PINSEL2[31:30]
 PIN 1.15 
 LPC_PINCON->PINSEL3[1:0] 
 PIN 1.16
 ...

 LPC_PINCON->PINSEL3[31:30]
 PIN 1.31
 ...

 LPC_PINCON->PINSEL9[23:0] 
 สงวนไว้ ใช้ไม่ได้
 LPC_PINCON->PINSEL9[25:24]
 PIN 4.28
 LPC_PINCON->PINSEL9[27:26]
 PIN 4.29
 LPC_PINCON->PINSEL9[31:28]
 สงวนไว้ ใช้ไม่ได้

ค่าบิต โหมดการทำงาน
00 GPIO
01 Alternate 1
10 Alternate 2
11 Alternate 3

การกำหนดฟังก์ชันการทำงาน ทำได้โดยการกำหนดโหมดการทำงานลงไปในบิตของรีจิสเตอร์ LPC_PINCON->PINSEL ที่สอดคล้องกับขาที่ต้องการ ดังตัวอย่างต่อไปนี้

สมมติต้องการให้ PIN 0.2 เป็น GPIO เราต้องกำหนดบิตใน PINSEL ที่สอดคล้องกันให้เป็น 00 นั่นคือ LPC_PINCON->PINSEL0[5] และ LPC_PINCON->PINSEL0[4] จะได้รูปแบของบิตที่ต้องนำไปใส่ใน LPC_PINCON->PINSEL0 ดังนี้ 1111 1111 1111 1111 1111 1111 1100 1111

สามารถเขียนเป็นคำสั่งในภาษาซีเป็น

LPC_PINCON->PINSEL0 &=  0xffffffCf; 

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

LPC_PINCON->PINSEL0 &= ~((1 <<5)|(1<<4));

##2. กำหนดทิศทางของ PIN

การกำหนดทิศทางของ PIN จะง่ายกว่าการกำหนดฟังก์ชัน เนื่องจากเป็นการกำหนดแบบตรงไปตรงมา บิตต่อบิต

ทิศทางที่ต้องการ ค่าบิต
Input 0
Output 1
FIODIR ตำแหน่งขาที่ควบคุม
LPC_GPIO0->FIODIR[31:0] P0.31 ... P0.0
LPC_GPIO1->FIODIR[31:0] P1.31 ... P1.0
LPC_GPIO4->FIODIR[29:28] P4.29 ... P4.28

ตัวอย่างเช่น ต้องการกำหนด PIN0.2 ให้มีทิศทางเป็น output ทำได้โดยใช้คำสั่ง

        LPC_GPIO0->FIODIR |= (1<<2);

ต้องการกำหนด PIN0.3 ให้มีทิศทางเป็น input ทำได้โดยใช้คำสั่ง

        LPC_GPIO0->FIODIR &= ~(1<<3);

หมายเหตุ ค่าเริ่มต้นของทิศทางของ PIN ต่างๆ คือ INPUT (ค่ารีเซ็ตของรีจิตเตอร์คือ 0x00000000)

###การกำหนดค่าเอาต์พุตของ PIN ต่างๆ ให้เป็น 0 หรือ 1

การกำหนดค่า PIN ให้เป็นลอจิก 0 หรือ 1 ทำได้โดยใชีรีจิสเตอร์ FIOSET และ FIOCLR FIOSET ใช้เพื่อกำหนดให้ PIN เป็นลอจิก HIGH ส่วน FIOCLR ใช้เพื่อกำหนดให้ PIN เป็นลอจิก LOW บางคนอาจจะสับสน เช่นต้องกำหนด 1 ให้ FIOCLR แล้วบิตจะเป็น 0 ซึ่งขัดแย้งกับความรู้สึกที่เคยใช้ MCU เบอร์อื่นๆ มา

###ตัวอย่าง สั่งให้ PIN0.2 เป็นลอจิก HIGH ทำได้โดยใช้คำสั่ง

        LPC_GPIO0->FIOSET |= (1<<2);

เป็นการสั่งให้ PIN0.2 เป็นลอจิก HIGH โดยไม่กระทบกับขาอื่นๆ

หรือถ้าต้องการสั่งให้ PIN0.4 เป็นลอจิก HIGH ทำได้โดยใช้คำสั่ง

        LPC_GPIO0->FIOCLR |= (1<<4);

การอ่านค่าจากอินพุต

การกำหนด internal pullup

##GPIO Interrupt

References

⚠️ **GitHub.com Fallback** ⚠️