Skocz do zawartości

STM32F103vet - nie wychodzi z przerwania od Skrzynki odbiorczej CAN


Pomocna odpowiedź

Napisano

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

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

Sprawdź w dokumentacji czy tej flagi się nie resetuje przez wpisanie jedynki do rejestru.

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