Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 16 kwi 2024, o 13:18


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 22 ] 
Autor Wiadomość
PostNapisane: 28 maja 2018, o 10:41 
Offline
Użytkownik

Dołączył(a): 31 mar 2017
Posty: 156
Pomógł: 0

Mam kłopot z użyciem timera do przerwania na płytce Nucleo z użyciem bibliotek SPL.

Program w ogóle nie "wchodzi" do funkcji obsługującej przerwanie TIM5_IRQHandler(). Co dziwne, nie wykonuje w ogóle nic, co znajduje się w kodzie poniżej ustawień NVIC. Wrzucam kod, proszę o pomoc/uwagi.

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Początkowo używałem:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

ale też nie działało.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 maja 2018, o 11:26 
Offline
Użytkownik

Dołączył(a): 22 sty 2014
Posty: 1806
Zbananowany użytkownik

Pomógł: 168

Obrazek



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 maja 2018, o 11:35 
Offline
Użytkownik

Dołączył(a): 31 mar 2017
Posty: 156
Pomógł: 0

A co dokładnie oznacza ten "pending state"? Timer odlicza, czy nie? A jeśli odlicza, to dlaczego kod przerwania się nie wykonuje?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 maja 2018, o 12:20 
Offline
Użytkownik

Dołączył(a): 22 sty 2014
Posty: 1806
Zbananowany użytkownik

Pomógł: 168

chodzi o wyczyszczenie flagi od przerwania zanim je włączysz



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 maja 2018, o 12:28 
Offline
Użytkownik

Dołączył(a): 31 mar 2017
Posty: 156
Pomógł: 0

Hmmm...
Jeśli daję
TIM_ClearITPendingBit(TIM5, TIM_IT_Update);
to w działaniu nic się nie zmienia. O to chodzi?

W trybie debug robiąc step over, program zatrzymuje się na linii NVIC_Init(&nvic).

Edit:
Dodałem jeszcze
TIM_ClearITPendingBit(TIM5, TIM_IT_Update);
TIM_UpdateRequestConfig(TIM5, TIM_UpdateSource_Regular);
i program idzie dalej, ale do przerwania nie wchodzi.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 maja 2018, o 18:37 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 15 lut 2017
Posty: 369
Lokalizacja: Gliwice
Pomógł: 34

U mnie Twój przykład poszedł od strzała, tzn "wchodzi" do obsługi przerwania, a dołożyłem jedynie swoją obsługę leda.
STM32F411CEUx na płytce Kamami Nucleo.
Oczywiście wersja z kasowaniem flagi przerwania.

Musisz mieć problem gdzieś indziej, niż w tym kodzie.
Sprawdzałeś efekt na debugerze, czy tylko badasz na pinie?

Czy masz poprawnie zdefiniowane wektory przerwań?
Szczególnie stare STDPeriph library nie miały wszystkich wektorów zdefiniowanych na starcie. lub tylko dla konkretnego procka..
U mnie jest to plik ${ProjDirPath}/startup/startup_stm32f411xe.s
Składnia: [ Pobierz ] [ Ukryj ]
język asm
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Widać wyraźnie, że mamy tablicę konkretnych wektorów, również ten który potrzebujemy: TIM5_IRQHandler.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 maja 2018, o 08:13 
Offline
Użytkownik

Dołączył(a): 31 mar 2017
Posty: 156
Pomógł: 0

U mnie jest tylko plik startup_stm32.s i jest bardzo ubogi:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Co mogę z tym zrobić? Poszukać odpowiedniego pliku i go wkleić?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 maja 2018, o 08:25 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 15 lut 2017
Posty: 369
Lokalizacja: Gliwice
Pomógł: 34

radek04 napisał(a):
U mnie jest tylko plik startup_stm32.s i jest bardzo ubogi:

Najwyższa pora ściągnąć CubeMX tam będziesz miał właściwe pliki.
Wystarczy podmienić ten plik co to podałeś. Gdy będę przed kompem to mogę wskazać odpowiedni.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 maja 2018, o 08:37 
Offline
Użytkownik

Dołączył(a): 31 mar 2017
Posty: 156
Pomógł: 0

Dziękuję.
Niestety niedługo muszę skończyć swój projekt i już nie pora na zmiana bibliotek. Muszę zakończyć z wykorzystaniem SPL. Rozumiem, że w pakiecie z CubeMX znajdę odpowiedni plik, który będę mógł podmienić/dodać?

Edit:
Z Twojego pliku skopiowałem linijki, które dotyczyły Tim5, ale projekt się nie kompiluje. Po zamianie całych plików też się nie kompilowało.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 maja 2018, o 09:10 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 15 lut 2017
Posty: 369
Lokalizacja: Gliwice
Pomógł: 34

Podaj jakie są błędy. Mogę Ci podesłać cały mój projekt do eclipse z dzialajacym timerem. Reszte sobie przepiszesz. Będzie to projekt w System Workbench. Na razie do atolica nie mam dostepu. Bedzie wieczorem.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 maja 2018, o 09:20 
Offline
Użytkownik

Dołączył(a): 31 mar 2017
Posty: 156
Pomógł: 0

W linii .word 0Ftim5 jest błąd "floating point number invalid startup_stm32.s".
Po jej usunięciu program (while) wykonuje się do czasu ustawionego w timerze, a dalej nic się nie dzieje. Czyli tak, jakby do przerwania dochodziło, ale nie jest oo obsługiwane poprawnie.
Chociaż czas jest jakby 2x za krótki. Mam szynę APB1 50MHz, preskaler 50000 oraz odliczanie do 10000, więc teoretycznie 10s, a while działa 5s. Gdy odliczanie zwiększyłem do 20000, działa 10s.
Czy źle coś rozumiem i preskaler ustawiam względem zegara głównego 100MHz?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 maja 2018, o 10:58 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 15 lut 2017
Posty: 369
Lokalizacja: Gliwice
Pomógł: 34

No nie to tak łatwo nie pójdzie :)
Masz mocno stare biblioteki, a jest kilka zależności między różnymi plikami.
Musisz ze sobą skorelować dwa pliki:
stm32f4xx.h
startup_stm32.s


W tym pierwszym masz numery wektorów (typedef enum IRQn), które muszą się zgadzać z tymi w pliku asm, ale w tym drugim nie masz jawnie numerów wektorów pokazanych. Da się to policzyć.
Składnia: [ Pobierz ] [ Ukryj ]
język asm
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

odpowiada
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Twój szukany wektor to:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Oczywiście jeszcze lepiej numer wektora znaleźć w reference manual.
zatem należy na odpowiedniej pozycji wpisać nazwę wektora. Uzupełniony plik wygląda (mam nadzieję, że się nie pomyliłem, ale w razie czego sam policz) jak niżej, linia nr 68 na listingu.:

Składnia: [ Pobierz ] [ Ukryj ]
język asm
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Plik asemblerowy chyba też trzeba uzupełnić o wpis:
Składnia: [ Pobierz ] [ Ukryj ]
język asm
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

dokładne miejsce to powinieneś już sam znaleźć :)

Oczywiście to jeszcze nie wszystko. Uchwyt (handler) musi być zadeklarowany.
Musisz gdzieś umieścić deklarację:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Możesz to zrobić w pliku main.c albo gdziekolwiek. Ja mam dedykowany plik na uchwyty.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 maja 2018, o 12:25 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 15 lut 2017
Posty: 369
Lokalizacja: Gliwice
Pomógł: 34

radek04 napisał(a):
Po jej usunięciu program (while) wykonuje się do czasu ustawionego w timerze, a dalej nic się nie dzieje. Czyli tak, jakby do przerwania dochodziło, ale nie jest oo obsługiwane poprawnie.
Chociaż czas jest jakby 2x za krótki. Mam szynę APB1 50MHz, preskaler 50000 oraz odliczanie do 10000, więc teoretycznie 10s, a while działa 5s. Gdy odliczanie zwiększyłem do 20000, działa 10s.
Czy źle coś rozumiem i preskaler ustawiam względem zegara głównego 100MHz?


Musisz sobie odpowiedzieć na pytanie: jak sprawdzić częstotliwość zegara głównego?
Pewną podpowiedzią będzie ten wątek:
https://www.elektroda.pl/rtvforum/viewt ... 2#17229822
Podpowiedzią będzie rozdział:
"IV. Analizujemy przydatne na początek pliki: "

Wg danych które podałeś to masz
50 MHz/50000/10000 = 0,1 Hz i faktycznie, by to odpowiadało 10 s.
Prawdopodobnie jednak masz źle ustawiony procesor.
W wątku, który podałem masz opis zmiennych, które trzeba przejrzeć.
Może masz źle ustawione HSI_VALUE albo HSE_VALUE.

Gdy testowałem u siebie to przy zegarze 96 MHz miałem dla wartości początkowych z wątku.
96 MHz/50000/1000 = 1.92 Hz i faktycznie dioda migała co pół sekundy.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 maja 2018, o 12:31 
Offline
Użytkownik

Dołączył(a): 31 mar 2017
Posty: 156
Pomógł: 0

Płytka ma zegar 100MHz, ale wg dokumentacji APB1 to 50MHz (lub max. 50Mhz może mieć). Preskaler dotyczy zegara systemowego? Jeśli tak, to pasuje, bo jest 100MHz.
Dziękuję bardzo za pomoc. Będę testował.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 maja 2018, o 12:36 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 15 lut 2017
Posty: 369
Lokalizacja: Gliwice
Pomógł: 34

radek04 napisał(a):
Płytka ma zegar 100MHz, ale wg dokumentacji APB1 to 50MHz (lub max. 50Mhz może mieć). Preskaler dotyczy zegara systemowego? Jeśli tak, to pasuje, bo jest 100MHz.
Dziękuję bardzo za pomoc. Będę testował.

Chyba jednak nie do końca.
Zegar domyślnie nie jest ustawiany z pełną prędkością, ani szyny.
Timer również może mieć różne taktowania.
Wszystko co sobie zażyczy programista.
Niestety nie mamy wiedzy jak ustawiasz taktowanie procka i parametry systemu.
Chodzi mi, że "płytka ma zegar 100 MHz" jest mało precyzyjne :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 maja 2018, o 14:32 
Offline
Użytkownik

Dołączył(a): 31 mar 2017
Posty: 156
Pomógł: 0

Szybkość później. Najpierw rzeczy najważniejsze :)
Nie wiem, czy dobrze rozumiem. Linię .word EXTI4_IRQHandler mam wpisać w 10. wierszu g_pfnVectors, a .word TIM5_IRQHandler w 50.?
Czy też po prostu muszą tam być, niezależnie od miejsca? Ty dałeś na 68. To ma znaczenie?
Czy muszę modyfikować plik stm32f4xx.h?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 maja 2018, o 15:57 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 15 lut 2017
Posty: 369
Lokalizacja: Gliwice
Pomógł: 34

radek04 napisał(a):
Nie wiem, czy dobrze rozumiem. Linię .word EXTI4_IRQHandler mam wpisać w 10. wierszu g_pfnVectors, a .word TIM5_IRQHandler w 50.?

Nie, linia z EXTI4 to był przykład. Jak jej tam nie masz, a nie korzystasz z EXTI4 to nic nie rób.
Ważne by w odpowiednie miejsce dać TIM5_IRQHandler .

radek04 napisał(a):
Czy też po prostu muszą tam być, niezależnie od miejsca? Ty dałeś na 68. To ma znaczenie?

Dokładnie tak to zrób.

radek04 napisał(a):
Czy muszę modyfikować plik stm32f4xx.h?

Tak. Najlepiej go wykorzystać do wpisania deklaracji o której pisałem w poprzednim wątku.
void TIM5_IRQHandler(void);



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 maja 2018, o 21:13 
Offline
Użytkownik

Dołączył(a): 31 mar 2017
Posty: 156
Pomógł: 0

Coś chyba robię źle. Mam mnóstwo błędów.
Powinienem wkleić tylko tę jedną linijkę
.word TIM5_IRQHandler w 68. linii oraz
.weak TIM5_IRQHandler
.thumb_set TIM5_IRQHandler,Default_Handler w dowolnym miejscu
pliku sturtup_stm32.s, a także void TIM5_IRQHandler(void) w pliku stm32f4xx.h?

Przepraszam, że tak głupio pytam, ale już nie chcę nic sam kombinować, bo nie wychodzi.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 maja 2018, o 21:39 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 15 lut 2017
Posty: 369
Lokalizacja: Gliwice
Pomógł: 34

radek04 napisał(a):
Coś chyba robię źle. Mam mnóstwo błędów.
Powinienem wkleić tylko tę jedną linijkę
.word TIM5_IRQHandler w 68. linii

Tak, dokładnie w tej linii.
Obrazek

Na pozycjach obok, 67 i 69 to nie wiem co masz, tych linii nie ruszaj.

radek04 napisał(a):
oraz
.weak TIM5_IRQHandler
.thumb_set TIM5_IRQHandler,Default_Handler w dowolnym miejscu
pliku sturtup_stm32.s,

Może być na końcu pliku.

radek04 napisał(a):
a także void TIM5_IRQHandler(void) w pliku stm32f4xx.h?

Dokładnie tu.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 maja 2018, o 07:29 
Offline
Użytkownik

Dołączył(a): 31 mar 2017
Posty: 156
Pomógł: 0

Działa. Jesteś wielki. Bardzo dziękuję za pomoc, a przede wszystkim cierpliwość.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 maja 2018, o 09:39 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 15 lut 2017
Posty: 369
Lokalizacja: Gliwice
Pomógł: 34

Napisz zatem jakieś podsumowanie, tak by inni czytający mieli pewność co faktycznie pomogło.
W ten sposób wątek będzie bardziej pomocny.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 cze 2018, o 12:33 
Offline
Użytkownik

Dołączył(a): 31 mar 2017
Posty: 156
Pomógł: 0

Aby użyć przerwania od timera - dla przykładu TIM5 - na płytce STM32F4 Nucleo z wykorzystaniem SPL należy zmodyfikować następujące pliki:
-sturtup_stm32.s: jako 67. g_pfnVectors wpisać (edytować, nie dodawać) .word TIM5_IRQHandler oraz
.weak TIM5_IRQHandler
.thumb_set TIM5_IRQHandler,Default_Handler w dowolnym miejscu tego pliku;
-stm32f4xx.h: void TIM5_IRQHandler(void) w dowolnym miejscu.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 22 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 0 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO