Picproje Elektronik Sitesi

MİKRODENETLEYİCİLER => ARM => Konuyu başlatan: Gökhan BEKEN - 11 Haziran 2014, 17:23:53

Başlık: Kesme içinde kesme
Gönderen: Gökhan BEKEN - 11 Haziran 2014, 17:23:53
Bugün farkettim stm32 ile bir kesme fonksiyonuna girince başka bir kesme olayı gerçekleşmiyor.
Uzun uzun uğraştıktan sonra yöntemimi değiştirerek sorunu çözdüm.

1.kesme: RTC alarm
2.kesme: Harici buton

Sorunlu versiyonda, alarm kesmesinin içinde, bir while döngüsünde sürekli harici buton kesmesinde set ettiğim bir bayrağın durumunu sorguluyorum, FALSE olduğu sürece burdan çıkma diyorum.
while(hariciKesmeBayragi==FALSE){}

Ancak butona bastığımda "hariciKesmeBayragi" adlı değişkenim bir türlü set olmuyor. Yani harici kesmeye girmiyordu.

Ben de RTC alarm kesmesinde işlem yapmak yerine, tıpkı harici kesmedeki gibi bayrak kullandım.
RTC kesmesine girdiği anda "alarmAktif" adlı bayrağımı TRUE yaptım.
main fonksiyonumdaki sonsuz döngümde sürekli, "alarmAktif" bayrağını sorguladım, TRUE ise şunları şunları yap dedim.(daha önce alarm kesmesi içinde yazdığım kodlar) Sorun bir şekilde çalıştı.

not: Bayrak değişkenlerimi volatile olarak tanımladım.
Başlık: Ynt: Kesme içinde kesme
Gönderen: kimlenbu - 11 Haziran 2014, 17:30:55
NVIC sayesinde kesme öncelikleri ayarlanabiliyor, denediniz mi ?

Misal harici kesmeye en düşük önceliği atamak için :

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F;


ekleme :

bir de harici kesmeniz şu şekilde değil mi ?

void EXTI0_IRQHandler(void)
{

  if(EXTI_GetITStatus(EXTI_Line0) != RESET)
  {
//işlemler
    EXTI_ClearITPendingBit(EXTI_Line0);
  }
Başlık: Ynt: Kesme içinde kesme
Gönderen: Gökhan BEKEN - 11 Haziran 2014, 17:50:39
Harici kesmem böyle:
void EXTI0_IRQHandler(){
hariciKesmeBayragi = !hariciKesmeBayragi;
   DelayMs(15);
   EXTI->PR=0x00000001;
}


Öncelik ataması yapmamıştım. Hangi durumda hangisinin önce olabileceği değişebilir. Harici kesmeye öncelik verirsem, bu seferde harici kesmeye girdiğinde RTC alarm kesmesine girmeyecek. Gerçi öncelikleri de duruma göre değiştirilebilir ama denemedim.
Başlık: Ynt: Kesme içinde kesme
Gönderen: Müh. müh. - 11 Haziran 2014, 19:42:40
Sorunu hicte guzel izah edememissiniz. Fakat eger dogru anladiysam,

Bir mcu nun ayni anda birkac interrupt vektorune gidememesi dogal degil mi?
Başlık: Ynt: Kesme içinde kesme
Gönderen: magnetron - 11 Haziran 2014, 19:51:08
biribirini kesen interruptlar için aşağıdaki satırın yazılması gerekiyor

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); 

aşağıda USART1 düşük TIM4 yüksek öncelikli ( TIM4 USART1 'i keser )

  /* Enable the USARTx Interrupt */
  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; 
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
//-------------------------------------------
  /* Enable the TIM4 gloabal Interrupt */
  NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; 
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

Başlık: Ynt: Kesme içinde kesme
Gönderen: Tagli - 11 Haziran 2014, 19:51:51
Alıntı yapılan: meftun - 11 Haziran 2014, 17:50:39
Gerçi öncelikleri de duruma göre değiştirilebilir ama denemedim.
Benim de aklıma o geldi. Kesme kodu içinde diğer kesmenin önceliği değiştirilebiliyorsa sorun çözülür sanırım.

Alıntı yapılan: Müh. müh. - 11 Haziran 2014, 19:42:40
Bir mcu nun ayni anda birkac interrupt vektorune gidememesi dogal değil mi?
Aynı anda değil ama, bir kesme ile uğraşırken, onu yarım bırakıp bir başka kesmeye gidebilir.
Başlık: Ynt: Kesme içinde kesme
Gönderen: Müh. müh. - 11 Haziran 2014, 20:54:04
Alıntı yapılan: Tagli - 11 Haziran 2014, 19:51:51
Aynı anda değil ama, bir kesme ile uğraşırken, onu yarım bırakıp bir başka kesmeye gidebilir.

İşte buda kesme önceliğine göre olur ki,

Ondanda yukarıda bahsedilmiş.