Austin ve Igor cevapları yeterince ayrıntılı. Ancak, başka bir şekilde cevaplamak istiyorum, belki yararlı bulursunuz.
LPC11xx (Cortex-M0), GPIO pinleri için 4 seviyeye sahiptir, GPIO0.0 - GPIO0.n arasındaki tüm pinler aynı kesme numarasını paylaşır ve GPIO3.0 - GPIO3.m arasındaki tüm pinler aynı kesme numarasını paylaşır.
LPC11xx'de GPIO kesmesini başlatmak için altı adım vardır
- Pim Bağlantı Bloğu Kayıtlarını değiştirerek pim işlevini ayarlayın.
- GPIO veri yönü kaydını değiştirerek pin yönünü ayarlayın (varsayılan değer girilir).
- Her bir pin için kesmeyi ayarlayın, GPIO kesinti maskesi kayıt GPIOnIE'ye gitmeniz ve bit (pime karşılık gelen) mantık 1'i ayarlamanız gerekir.
- GPIO kesinti algılama kayıtlarını GPIOnIBE ve GPIOnIS'i değiştirerek yükselen kenar veya düşen kenar veya her ikisi için kesmeyi ayarlayın.
- Kesme kaynağını CMSIS işlevlerini kullanarak Yuvalanmış Vektörlü Kesme Kontrolünde PIO_0 / PIO_1 / PIO_2 / PIO_3'ü etkinleştirin.
- CMSIS işlevlerini kullanarak kesme önceliğini ayarlayın.
Kod uygulamaları. İki işleve ihtiyacınız vardır: biri yukarıdaki 6 adımı başlatır ve ikincisi, başlatma kodlarında tanımlanan işleyiciyle aynı ad olması gereken kesme işleyicisidir, startup_LPC11xx.s
dosya. İsimler gelmektedir PIOINT0_IRQHandler
için PIOINT3_IRQHandler
. Farklı bir ad kullanırsanız, başlangıç dosyasındaki adları değiştirmeniz gerekir.
/*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
}