STM32F103C8 ile en fazla kac tane EXTI'a izin veriyor

Başlatan Yuunus, 18 Mart 2025, 22:46:42

Yuunus

merhaba; asagidaki sekilde 4 ayri interrupti sorunsuz kullanabiliyorum, ama benim 3 tane daha ihtiyacim var referans dokumana baktigimda sanirim 5 interrupt'a kadar izin veriyor yada ben yanlis yorumluyorum, mesela kesmeyi asagidaki gibi algilamak istedim ama garip durumlar olustu ve asagidaki ornek kod kadar saglikli calismiyor.

su sekilde kesmeleri algilayabilirmiyim.

void EXTI0_IRQHandler(void)
{
   if (EXTI->PR & EXTI_PR_PR0)
   {
    //PA0 haricinde dogru algilayamiyor.
   }

   else if (EXTI->PR & EXTI_PR_PR1)
   {
    //PA0 haricinde dogru algilayamiyor.
   }
}
vs...

sorunsuz calisan kod asagisi.
void EXTI_Init(void)
{
  RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;
  RCC->APB2ENR |= RCC_APB2ENR_AFIOEN;
  GPIOA->CRL &= ~(GPIO_CRL_MODE0 | GPIO_CRL_CNF0);
  GPIOA->CRL |= (0x02<< GPIO_CRL_CNF0_Pos); //PA0 pull up/ pull down
  GPIOA->CRL &= ~(GPIO_CRL_MODE1 | GPIO_CRL_CNF1);
  GPIOA->CRL |= (0x02<< GPIO_CRL_CNF1_Pos);
  GPIOA->CRL &= ~(GPIO_CRL_MODE2 | GPIO_CRL_CNF2);
  GPIOA->CRL |= (0x02<< GPIO_CRL_CNF2_Pos);
  GPIOA->CRL &= ~(GPIO_CRL_MODE3 | GPIO_CRL_CNF3);
  GPIOA->CRL |= (0x02<< GPIO_CRL_CNF3_Pos);
  GPIOA->ODR |= (0xF << 0); // PA0...PA3'e kadar high yap
  AFIO->EXTICR[0] &= ~(AFIO_EXTICR1_EXTI0);
  EXTI->RTSR |= EXTI_RTSR_TR0 | EXTI_RTSR_TR1 | EXTI_RTSR_TR2 | EXTI_RTSR_TR3;
  EXTI->FTSR |= EXTI_FTSR_TR0 | EXTI_FTSR_TR1 | EXTI_FTSR_TR2 | EXTI_FTSR_TR3;
  EXTI->PR = EXTI_PR_PR0 | EXTI_PR_PR1 | EXTI_PR_PR2 | EXTI_PR_PR3;
  EXTI->IMR |= EXTI_IMR_MR0 | EXTI_IMR_MR1 | EXTI_IMR_MR2 | EXTI_IMR_MR3;
  NVIC_EnableIRQ(EXTI0_IRQn);  // Kesme denetleyicisinde kesintiye izin ver
  NVIC_EnableIRQ(EXTI1_IRQn);
  NVIC_EnableIRQ(EXTI2_IRQn);
  NVIC_EnableIRQ(EXTI3_IRQn);
}
void EXTI0_IRQHandler(void)
{
EXTI->PR |= EXTI_PR_PR0;
}
void EXTI1_IRQHandler(void)
{
EXTI->PR = EXTI_PR_PR1;
}
void EXTI2_IRQHandler(void)
{
EXTI->PR = EXTI_PR_PR2;
}
void EXTI3_IRQHandler(void)
{
EXTI->PR = EXTI_PR_PR3;
}

Tagli

Verdiğin kodu çok inceleyemedim ama ilk bakışta yanlış anlamadıysam eğer ilk verdiğin kod doğru bir yaklaşım değil.

EXTI vektörleri pinlere göre eşit olmayan bir şekilde dağılmış oluyor genelde. Bazı vektörler tek bir EXTI'ye bakarken bazıları birden fazlaya bakıyor. Sen sanki EXTI0 içinde - ki bu sadece 0. pinlere bakar, PA0, PB0... gibi - birden fazla pini okumaya çalışıyor gibisin.

Interrupt'a bağlamaya çalıştığın pinler hangileri? Liste halinde verirsen daha ayrıntılı cevap verebilirim.

Bu arada uygulamanı bilmiyorum ama bazı durumlarda interrupt'a gerek de olmaz aslında. 7 adet bana biraz çok gözüktü. Pek çok uygulamada pinleri normal olarak bir döngüde taramak yeterli bir çözümdür. Mesela buton okumak için interrupt'a gerek yok - eğer uykudan uyandırma gibi bir durum söz konusu değilse. Hatta butonları interrupt ile okumak hatalı bir yöntem bile sayılabilir.
Gökçe Tağlıoğlu

Yuunus

asagidaki kod PA0,PA1,PA2,PA3 icin calisiyor, ihtiyacmin 3 tanesi enkoder icin ama diger 4 tanesini kacirmamam gerekiyor.

Tagli

STM32F103'teki ilgili vektörler, ST'nin kendi sağladığı startup dosyasında geçen adları ile şöyle:
EXTI0_IRQHandler
EXTI1_IRQHandler
EXTI2_IRQHandler
EXTI3_IRQHandler
EXTI4_IRQHandler
EXTI9_5_IRQHandler
EXTI15_10_IRQHandler

Görüldüğü üzere EXTI[5,9] ve EXTI[10,15] kesmeleri vektörleri paylaşıyor, ancak diğerleri tek. Yani EXTI0 vektörü içine sadece PA0, PB0... kesmeleri düşer - ki bilindiği üzere bunlar da aynı anda aktif olamaz. Aslında verdiğin yaklaşım doğru, ancak o şekilde EXTI->PR üzerinden kontrol sadece aynı vektörü paylaşan birden fazla kesme olduğu zaman anlam kazanıyor.
Gökçe Tağlıoğlu

Yuunus