คำตอบของ Austin และ Igor นั้นมีรายละเอียดเพียงพอ อย่างไรก็ตามฉันต้องการตอบมันด้วยวิธีอื่นบางทีคุณอาจเห็นว่าเป็นประโยชน์
LPC11xx (Cortex-M0) มี 4 ระดับสำหรับพิน GPIO, พินทั้งหมดจาก GPIO0.0 ถึง GPIO0.n แบ่งปันหมายเลขอินเตอร์รัปต์เดียวกันและพินทั้งหมดจาก GPIO3.0 ถึง GPIO3.m ใช้หมายเลขอินเตอร์รัปต์เดียวกัน
มีหกขั้นตอนในการเริ่มต้นการขัดจังหวะ GPIO ใน LPC11xx
- ตั้งค่าฟังก์ชั่นพินโดยการแก้ไข Pin Connection Block Registers
- ตั้งค่าทิศทางเข็มหมุดโดยการแก้ไขการลงทะเบียนทิศทางข้อมูล GPIO (ค่าเริ่มต้นคืออินพุต)
- ตั้งค่าการขัดจังหวะสำหรับแต่ละพินแต่ละครั้งคุณต้องไปที่ GPIO อินเตอร์รัลมาสก์ลงทะเบียน GPIOnIE และตั้งค่าบิต (ที่สอดคล้องกับพิน) ลอจิก 1
- ตั้งค่าการขัดจังหวะเพื่อเพิ่มขอบหรือลดลงหรือทั้งสองโดยการปรับเปลี่ยนความรู้สึกขัดจังหวะ GPIO ลงทะเบียน GPIOnIBE และ GPIOnIS
- เปิดใช้งานแหล่งสัญญาณขัดจังหวะไม่ว่าจะเป็น PIO_0 / PIO_1 / PIO_2 / PIO_3 ใน Nested Vectored Interrupt Control โดยใช้ฟังก์ชั่น CMSIS
- ตั้งค่าลำดับความสำคัญของอินเตอร์รัปต์โดยใช้ฟังก์ชัน CMSIS
การติดตั้งโค้ด คุณต้องการสองฟังก์ชัน: หนึ่งค่าเริ่มต้น 6 ขั้นตอนข้างต้นและอย่างที่สองคือตัวจัดการขัดจังหวะซึ่งจำเป็นต้องมีชื่อเดียวกับตัวจัดการที่กำหนดไว้ในรหัสเริ่มต้นstartup_LPC11xx.s
ไฟล์ ชื่อมาจากการPIOINT0_IRQHandler
PIOINT3_IRQHandler
หากคุณใช้ชื่ออื่นคุณจะต้องเปลี่ยนชื่อในไฟล์เริ่มต้น
/*Init the GPIO pin for interrupt control */
void GPIO_Init(){
LPC_IOCON-> =.. //Pin configuration register
LPC_GPIO1->FIODIR = ... //GPIO Data direction register
LPC_GPIO1->FIOMASK = .. //GPIO Data mask register - choose the right pin
LPC_GPIO1->GPIOnIE = .. //Set up falling or rising edge
NVIC_EnableIRQ(PIO_1); //Call API to enable interrupt in NVIC
NVIC_SetPriority(PriorityN); //Set priority if needed
}
/*Must have the same name as listed in start-up file startup_LPC11xx.s */
void PIOINT1_IRQHandler(void){
//Do something here
}