Skocz do zawartości

[C] [STM32f4 discovery] EXTI przerwania zewnętrzne


niezly_patyk

Pomocna odpowiedź

Cześć,

mam problem z przerwaniami w stm32f4 na płytce discovery. Napisałem swoją konfiguracje przerwań bazując na książce K.Paprockiego "uC STM32 w praktyce".

Problem polega na tym że w momencie wystąpienia przerwania uC w nim zostaje/zawiesza się - zostaje wywołana f-cja z pliku startup_stm32f4xx.s

/**
* @brief  This is the code that gets called when the processor receives an 
*         unexpected interrupt.  This simply enters an infinite loop, preserving
*         the system state for examination by a debugger.
* @param  None     
* @retval None       
*/
   .section  .text.Default_Handler,"ax",%progbits
Default_Handler:
Infinite_Loop:
 b  Infinite_Loop
 .size  Default_Handler, .-Default_Handler

Zdesperowany szukałem kodów na st.com, co nie przyniosło większych rezultatów. Ostatecznie przedstawiam czyjś kod który (podobno) działa poprawnie - u mnie dalej te same objawy. źródło

void EXTILine3_Config(void) {
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
       EXTI_InitTypeDef EXTI_InitStructure;
/* Enable GPIOA clock */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
/* Enable SYSCFG clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);

/* Configure PA3 pin as input floating */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_Init(GPIOA, &GPIO_InitStructure);

/* Connect EXTI Line3 to PA3 pin */
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource3);

/* Configure EXTI Line3 */
EXTI_InitStructure.EXTI_Line = EXTI_Line3;
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 EXTI Line3 Interrupt to the lowest priority */
NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
while (1) {

	GPIO_SetBits(GPIOD, GPIO_Pin_14);
	Delay(0x3FFFFF);
	GPIO_ResetBits(GPIOD, GPIO_Pin_14);

	if (EXTI_GetITStatus(EXTI_Line3) != RESET) {

		GPIO_SetBits(GPIOD, GPIO_Pin_13);

		EXTI_ClearITPendingBit(EXTI_Line3);
	}

	GPIO_SetBits(GPIOD, GPIO_Pin_15);
	Delay(0x3FFFFF);
	GPIO_ResetBits(GPIOD, GPIO_Pin_15 | GPIO_Pin_13);
}

Objaw wygląda następująco:

Po zdebugowaniu program działa poprawnie (na przemian zapalają się ledki 14 i 15).

Przy wystąpieniu przerwania program wpada w nieskończoną pętle o której pisałem wyżej.

Jeśli 'trafie' z przerwaniem na chwile w której świeci się led 14 to pozostaje ona zapalona.

Led 13 która powinna zaświecić po wystąpieniu przerwania nie zapala się.

Co mogłem pokręcić? Jak doprowadzić do poprawnego działania programu?

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.