Skocz do zawartości

STM32F103vet - nie wychodzi z przerwania od Skrzynki odbiorczej CAN


kamil87

Pomocna odpowiedź

Witam,

Zacząłem trochę eksperymentować z STM32 F1 i chciałem wypróbować komunikacje CAN, udało mi się skonfigurować wszystko poprawnie tak że układ odbiera wiadomości i je wysyła. Problem pojawił się przy próbie wsadzenia tego w przerwanie.

Korzystam z bibliotek ST, jako środowisko używam System Workbench for STM32 czyli Eclipsa przygotowanego przez ST. W pisaniu kodu podpierałem się przykładami dostarczonymi z biblioteką. Konfiguracja NVIC wygląda tak:

CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE);  	
CAN_ITConfig(CAN1, CAN_IT_FMP1, ENABLE);	

//Konfiguracja Modułu NVIC w zakresie przerwań od CAN
NVIC_InitTypeDef NVIC_CAN;


NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);		

NVIC_CAN.NVIC_IRQChannel = 	USB_LP_CAN1_RX0_IRQn ;
NVIC_CAN.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_CAN.NVIC_IRQChannelSubPriority =0;
NVIC_CAN.NVIC_IRQChannelCmd =ENABLE;
NVIC_Init (&NVIC_CAN);

NVIC_CAN.NVIC_IRQChannel = 	CAN1_RX1_IRQn ;
NVIC_CAN.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_CAN.NVIC_IRQChannelSubPriority =0;
NVIC_CAN.NVIC_IRQChannelCmd =ENABLE;
NVIC_Init (&NVIC_CAN);

Uruchamiam przerwania od obu skrzynek FIFO. W priorytety nie wnikalem bo na tym etapie to nie ma znaczenia.

Kod procedur obsługi przerwania wygląda tak:

void USB_LP_CAN1_RX0_IRQHandler()
{
CAN_Receive(CAN1,CAN_FIFO0, &RxMessage);
GPIO_SetBits(GPIOB, GPIO_Pin_12);
}
void CAN1_RX1_IRQHandler()
{
CAN_Receive(CAN1,CAN_FIFO1, &RxMessage);
GPIO_SetBits(GPIOB, GPIO_Pin_13);
}

Dołączyłem zapalanie diody po wejściu w przerwanie żeby wiedzieć czy kod przerwania się wykonuje.

Praca układu wygląda tak że po uruchomieniu wysyła ramki, steruje wyświetlaczem alfanumerycznym i reaguje na przyciski (wysyła ramki po wciśnięciu przycisku). Gdy wysyłam pierwszą ramkę do układu z innego układu, zapala się dioda dołączona do pinu 13 (tzn że wchodzi do procedury obsługi przerwania) i procesor przestaje reagować na przyciski. Wrzuciłem do procedury funkcję nadającą ramki i okazuje się ze po tym "zawieszeniu" ciągle wykonywana jest procedura obsługi bo ramki leciały bez przerwy.

To co mnie dziwi to to że do projektu pliku nie jest dodawany plik stm32f10x_it.c, a w pliku startup_stm32.s w miejscu gdzie wymienione są nazwy procedur obsługi przerwania dla układów zewnętrznych (nie związanych z procesorem) są same "0", w takim stanie układ w ogóle nie wchodził do przerwania, dopiero gdy uzupełniłem na odpowiednich pozycjach nazwy procedur zaczął wchodzić do procedury, tylko że jej nie opuszcza po wykonaniu.

Próbowałem "czyścić" flagę poleceniem:

CAN_ClearFlag(CAN1,CAN_FLAG_FMP1);

ale bez efektu.

Mam wrażenie że mam jakiś problem ze środowiskiem ale ciężko mi go zidentyfikować. Czy jest ktoś w stanie mi coś podpowiedzieć?

Pozdrawiam

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • 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.