Skocz do zawartości

[STM32][C] Przyciski i przerwania zewnętrzne


danioto

Pomocna odpowiedź

Witajcie,
mam dziwny problem tak jak w temacie. A mianowicie, myślałem, że z EXTI już mnie nic nie zaskoczy, a tu taki bąbel. Mam trzy przyciski podłączone do PB2, PB12 oraz PB13. Przerwanie od PB12 i PB13 są wykonywane poprawnie, jednak jeżeli wcisnę PB2, wtedy program cały czas wchodzi do handler'a od EXTI15_10...

#define Switch1 		GPIO_Pin_12
#define Switch2 		GPIO_Pin_2
#define Switch3 		GPIO_Pin_13

void GPIOInit(void)
{
//Switch'e - PB2, PB12, PB13
GPIO_InitStructure.GPIO_Pin = Switch1 | Switch2 | Switch3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}

void NVICInit(void)
{
NVIC_InitTypeDef NVIC_InitStructure;

NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}

void EXTIInit(void)
{
 	EXTI_InitTypeDef EXTI_InitStructure;

 	GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource2);
 	GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource12);
 	GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource13);

 	EXTI_InitStructure.EXTI_Line = EXTI_Line2 | EXTI_Line12 | EXTI_Line13;
 	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
 	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
 	EXTI_InitStructure.EXTI_LineCmd = ENABLE;
 	EXTI_Init(&EXTI_InitStructure);
}

void EXTI2_IRQHandler(void)
{
if (EXTI_GetITStatus(EXTI_Line2)!=RESET)	
{
	Wyslij("Switch2!");
}
EXTI_ClearITPendingBit(EXTI_Line2);
}

void EXTI15_10_IRQHandler(void)
{
if (EXTI_GetITStatus(EXTI_Line12)!=RESET)
{
	Wyslij("Switch1!");
}
if (EXTI_GetITStatus(EXTI_Line13)!=RESET)	
{
	Wyslij("Switch3!");
}
       EXTI_ClearITPendingBit(EXTI_Line12);
       EXTI_ClearITPendingBit(EXTI_Line13);
}

Aha, funkcja Wyslij() to moja funkcja wysyłania stringów po USART'cie. Tak jak napisałem, problem polega na tym, że po wywołaniu przerwania od EXTI2 program cały czas wchodzi do funkcji obsługi przerwania od EXTI15_10.

P.S. Tak, korzystam z biblioteki StdPeriph, ale tylko tymczasowo, by szybko obsłużyć całą elektronikę. Jak wszystko przetestuję, to będę optymalizował 😉

Pzdr.

Daniel

Link do komentarza
Share on other sites

Ja robie tak samo i wszystko działa jak należy. Spróbuj nie włączać przerwań od PB12 i PB13 i zobacz co sie stanie. Wykluczyłeś że masz gdzieś zwarcie PB2 z PB12 czy PB13?

Dodaj jeszcze na wszelki wypadek

	NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);				// Grupa priorytetow
Link do komentarza
Share on other sites

Dzięki Harnaś za odpowiedź, ale... Już działa. Nie wiem, czy przypadkiem czegoś w tzw. międzyczasie nie zmieniałem, ale już wszystko śmiga. Naprawdę nie mam pojęcia co mogło być nie tak. Swoją drogą dodałem proponowane przez Ciebie osadzanie tablicy wektorów, tak jak mówisz, na wszelki wypadek. Dzięki za pomoc, temat do zamknięcia 🙂

Pzdr.

D

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.