STM32F0 EXTI Problemi

Başlatan quarko, 26 Haziran 2016, 03:35:17

quarko

Merhabalar arkadaşlar. STM32F030R8 ile çalışıyorum. Projemde External Interrupt ları kullanıyorum. İnit ayarlarını "Falling Edge" olarakta ayarlasam, "Rising Edge" olarak ayarlasam her ikisindede interrupt alıyorum. Fikri olan ?
"Aslanlar kendi hikayelerini yazmadıkça, avcıların kahramanlık hikayelerini dinlemek zorundayız."

hakansefau

Merhaba,

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE);
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
  GPIO_Init(GPIOC, &GPIO_InitStructure);

  /* Enable SYSCFG clock */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
  
	/* Connect EXTI6 Line to PA6 pin */
  SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC, EXTI_PinSource6);
	
	/* Connect EXTI7 Line to PA7 pin */
	SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC, EXTI_PinSource7);
	
  /* Configure EXTI0 line */
  EXTI_InitStructure.EXTI_Line = EXTI_Line6 | EXTI_Line7;
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  EXTI_Init(&EXTI_InitStructure);

  /* Enable and set EXTI0 Interrupt */
  NVIC_InitStructure.NVIC_IRQChannel = EXTI4_15_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPriority = 0x00;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);


Bu kodu direk kullanabilirsin. Burada oluşturacağın Handler fonk. da istersen high low kontrolü de yapabilirsin, bu uygulamaya göre bazı durumlarda Falling veya rising seçimleri sıkıntı yaratabiliyor, benim önerim rise veya fall durumlarını handlerde kontrol etmek daha profesyonel geliyor.

muhittin_kaplan

PuP, Pdown ayarlarını yaptınız mı ?

http://www.mcu-turkey.com/stm32f0-uygulamalari-external-interrupt/

şurada Baran EKREM in Yazısı mevcut.

Erhan YILMAZ

Yazılımda kusur aramadan önce donanıma da bakmak lazım. Girişleri(yükselen/düşen kenar) nasıl uyguluyorsun butonla mı, anahtarla mı, elektronik devre ile mi? Sıçrama(bouncing) falan oluyorsa benzer sorunlar oluşabilir.

quarko

External Interruptları init ettiğim fonksiyonum şöyle.

void InitEXTI(void)
{
  GPIO_InitTypeDef        GPIO_InitStructure;
  NVIC_InitTypeDef        NVIC_InitStructure;
  EXTI_InitTypeDef        EXTI_InitStructure;
  
  /* Configure input1 pin as input floating */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  GPIO_Init(GPIOC, &GPIO_InitStructure);
  
  /* Connect EXTI5 Line to PC5 pin */
  SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC, EXTI_PinSource5);
  
  /* Configure EXTI5 line */
  EXTI_InitStructure.EXTI_Line = EXTI_Line5;  
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
  EXTI_InitStructure.EXTI_LineCmd = ENABLE; 
  EXTI_Init(&EXTI_InitStructure);
  
  /* Enable and set EXTI4_15 Interrupt */
  NVIC_InitStructure.NVIC_IRQChannel = EXTI4_15_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}



SYSCFG ve GPIOC clocklarını daha önceki bir fonksiyonda açıyorum bu arada. Sinyali direk pine, sinyal jeneratörü vasıtasıyla uyguluyorum. Arada bir devre vardı. Acaba ondan mı problem oluyor diye devreyi aradan çıkardım. İşlemcinin pinine giden sinyali de osiloskop ile inceliyorum. Herhangi bir sıçrama, bouncing vs. görünmüyor. 
"Aslanlar kendi hikayelerini yazmadıkça, avcıların kahramanlık hikayelerini dinlemek zorundayız."

yldzelektronik

Pull Up yapmış olmanız ile bir ilgisi olabilir mi?
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

quarko

Alıntı yapılan: yldzelektronik - 27 Haziran 2016, 09:52:16
Pull Up yapmış olmanız ile bir ilgisi olabilir mi?

Hayır hocam, pull-up ile ilgisi yok. Hepsini denedim zaten. Pull-up, pull-down, floating... Maalesef bir sonuç alamadım. Sıkıntım tam olarak şu idi. Mesela ben external interrupt ı rising edge olarak ayarlıyorum. Ama kesmeyi, hem rising edge de, hem de falling edge de alıyorum. Girişe buton falan bağlı değil. Sıçrama vs. durumları da yok. Osiloskop ile gözlemliyorum zaten. En sonunda vazgeçip yazılımsal olarak hallettim işimi. Ama aklımda kaldı. Bir problem var stm32f0 serisinin external interrupt ında. !
"Aslanlar kendi hikayelerini yazmadıkça, avcıların kahramanlık hikayelerini dinlemek zorundayız."

ferdem

Debug yapıyor musunuz? Kesmede kenar tipi EXTI_RTSR, EXTI_FTSR kaydedicileri ile belirleniyor. Konfigürasyondan sonra bu kaydedicilere bir bakın.
Kesmeye girdiği yere "breakpoint" koyup bir bakın, eğer EXTI_RTSR de ilgili bit 1 olmamasına rağmen yükselen kenarda kesmeye girdiyse o zaman bir problem var diyebiliriz.
Osiloskopla bakıyorum diyorsunuz ama bir de şu şekilde bakın: Mikrodenetleyicinin herhangi bir pinini kesme girişine bağlayın(jumper). Bu pin Resetten sonra çıkışa şartlanıp lojik0 yapılsın, kesmeyi düşen kenara kurun ve 3 saniye sonra pin lojik1 olsun, kesmeye girmemesi lazım.

quarko

Alıntı yapılan: ferdem - 27 Haziran 2016, 11:10:51
Debug yapıyor musunuz? Kesmede kenar tipi EXTI_RTSR, EXTI_FTSR kaydedicileri ile belirleniyor. Konfigürasyondan sonra bu kaydedicilere bir bakın.
Kesmeye girdiği yere "breakpoint" koyup bir bakın, eğer EXTI_RTSR de ilgili bit 1 olmamasına rağmen yükselen kenarda kesmeye girdiyse o zaman bir problem var diyebiliriz.
Osiloskopla bakıyorum diyorsunuz ama bir de şu şekilde bakın: Mikrodenetleyicinin herhangi bir pinini kesme girişine bağlayın(jumper). Bu pin Resetten sonra çıkışa şartlanıp lojik0 yapılsın, kesmeyi düşen kenara kurun ve 3 saniye sonra pin lojik1 olsun, kesmeye girmemesi lazım.

Evet debug yapıyorum. EXTI_RTSR ve EXTI_FTSR register larında doğru değerler oluyor. Konfigürasyon da bir problem görünmüyor. Buna rağmen benim ayarlamadığım kenarda da kesme üretiyor. Exti girişini mcu nun bir başka pinine bağlayıp, dediğiniz gibi deneyeceğim. Bakalım sonuç ne olacak.
"Aslanlar kendi hikayelerini yazmadıkça, avcıların kahramanlık hikayelerini dinlemek zorundayız."

PROTECH_

Kesmenin içerisinde
pin değerini okuyup eğer  high değilde low alıyorsan
sorunun yazılımsal dır değilse donanımı kontrol etmen gerekir

Aşağıdaki örnek resime daha net bakmanı sağlar

void extiX_IRQHandler()
{
 
if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_5)==reset)
{
  while(1);  //trap
}

}
Multi-Core ,RTX,ThreadX, FreeRTOS, MODBUS  RTOS - Electronic-Hardware -- BERLIN