LPC17XX GPIO - koson/Embedded-Things GitHub Wiki
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 นั้น ต้องมีการเตรียมการต่างๆ พอเป็นพิธี ดังต่อไปนี้คือ
-
กำหนดฟังก์ชันของขาที่ใช้งาน (ในที่นี้ให้เป็น GPIO)
-
กำหนดทิศทางของสัญญาณ
-
กำหนดการ pullup หรือ pulldown
-
ใช้งานขา GPIO
การกำหนดฟังก์ชันของขาที่ใช้งาน จะกำหนดผ่านรีจิสเตอร์ 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);
##GPIO Interrupt