:) Kto szuka nie (ten) błądzi. Dzięki za cierpliwość. Na chwilę obecną przyjmę to za pewnik. Temat jednak pozostawiam otwarty. Jeśli ktoś z czytelników rozumie mą rozterkę i potrafi mi wyjaśnić dlaczego tak a nie inaczej...to proszę się nie krępować :D PS Szczerze mówiąc dziwi mnie trochę to, że Ciebie jako fana logiki nie zastanawia pozorna bezsensowność...
Popatrz bardzo dobrze na te linijki: GPIOA->MODER = (0x01 < (2 * 0)); //Pin PA0 jako wyjście //GPIOA->OTYPER &= ~(1 < 0); //Pin PA0 jako Push-Pull GPIOA->OSPEEDR = (0x03 < (2 * 0)); //Pin PA0 jako High Speed Tablica wektorów ma marginalne znaczeni dopóki nie używasz przerwań - bez nich wykorzystywane...
BoskiDialer -> widzę, że jesteś niezłym magikiem bo twoje makefile jest w ogóle nie podobne do tego generowanego przez AVRStudio. Ale spróbowałem tak z ręki skompilować ten twój bootloader: make bootloader i niestety dostaję błąd: makefile:28: *** missing separator. Stop Czy magik to nie wiem, ale ten Makefile nie zadziała. Na początku linii 28 masz...
Jeżeli nie ma obsługi przerwania to nastąpi reset układu. Dodać należy, że nie będzie to dokładnie reset taki jak w przypadku pinu RESET, czy włączenia zasilania. Będzie to jedynie skok do początku programu, co wynika z kodu przygotowanego przez kompilatora C. Tablica nieużywanych wektorów przerwań jest bowiem wypełniona skokami do __bad_interrupt...
Teraz pozostało mi przenieść projekt z stm32 na lm3s, ponieważ zajmuję się tym w wolnym czasie od pracy, to efektem podzielę się pewnie za kilka dni. To naprawdę nie jest dużo roboty, generalnie (pomijając detale typu zmiana nazw plików czy nazwy projektu) trzeba zrobić mniej więcej "aż" tyle: 1. poprawić tablicę wektorów (to i tak byś miał kiedyś...
Kod w obszarze wektorów przerwań jest jak najbardziej bezpieczny, dopóki przerwania nie zostaną włączone. Czasem tak się robi, gdy zaczyna brakować flasha. Stos trzeba koniecznie zainicjalizować, żeby można było używać CALL i RET. RET powoduje powrót do miejsca z którego podprogram został wykonany. call podprogram ; ret wroci tutaj (reszta programu)...
Witam;) Jeśli chodzi o nadawanie kodu cyfr klawiaturki zestawu to pisałem jakiś czas temu taki program w ramach zaliczenia tegoż przedmiotu. Podejrzewam jednak, że chodzi o wykorzystanie np. HyperTerminal'a i podawanie znaku z klawiatury komputera. Oto program który wówczas napisałem: st7/ TITLE"starter.asm" MOTOROLA #INCLUDE "st72334.inc"...
Pytanie trochę filozoficzno - humorystyczne. Czy chodzi o to aby oszukać oszusta? ;) Wówczas w Cobrze1 będzie dwóch oszustów? Domyślam się, że twórcy COBRA1 umieścili kod startowy od adresu 0xc000 ponieważ gdyby ROM zaczynał się od 0x0000, adresy wektorów przerwań byłyby na stałe w ROM i program użytkownika nie mógłby ich modyfikować. Program wykonywany...
Cześć, Ponieważ pojawiła się prośba o możliwość udostępnienia uproszczonej wersji na inny uC to przedstawię krótką instrukcję jak dostosować projekt do potrzeb. Generalnie w obecnej wersji obsługiwane są dwie rodziny procesorów czyli STM32F4xx i STM32H7xx - prawdopodobnie nie powinno być większych problemów z innymi podobnymi układami STM natomiast...
Czyli jeśli w kodzie C inicjuję jedynie wektor powiedzmy ADC_vect, to jedynie w kodzie asemblerowym jedynie .org ADCaddr będzie pozbawione komentarza <__bad_interrupt>. A propos wektorów i tablicy: Czy inicjalizacja tablicy wektorów przerwań jest zależna od typu mikrokontrolera? W literaturze i w poradnikach internetowych widzę, że wszędzie wektory...
Nie robisz kompletnie nic oprócz wskazania linkerowi pod jakim adresem ma być zlokalizowany kod wynikowy. Tablica wektorów przerwań która pierwotnie była pod adresem 0 znajdzie się pod adresem przekazanym linkerowi - -Wl,-Ttext,0x1e00 spowoduje, że cała sekcja .text (razem z tablicą wektorów) zostanie przeniesiona pod adres bootloadera - właśnie z tego...
Co trzeba w nim zmienić poza wpisaniem rozmiaru ram i flash ( flash - 512K; ram - 64K ) w skrypcie linkera aby uruchomić go na STM32F103ZE. Prawdopodobnie nic. Sprawdź jedynie czy tablica wektorów przerwań jest taka sama w obu modelach.
Skonfigurowałem w tym procesorze odbiór i nadawanie poprzez rs232. Jak stworzyć przerwanie od odbiornika? Gdzie jest tablica wektorów obsługi przerwań itp?
Witam, ze względu na używanie bootloadera w obszarze od 0x8000000 do 0x8004000, potrzebuję pozostałą część aplikacji (nazwijmy ją częścią B) umieścić w dalszym zakresie. Tak więc zmieniam adres aplikacji B oraz wektora przerwań i niestety urządzenie jest rozpoznawane w systemie. Aczkolwiek sam kod działa. Jeśli aplikacji B zmienię adres startowy na...
Wydaje mi się że nie "przesunąłeś" tablicy wektorów przerwań: SCB->VTOR = VECT_TAB_BASE_ADDRESS | VECT_TAB_OFFSET; w pliku system_stm32l4xx.c
czekanie na dostępność EEPROM nie jest potrzebne, bo to już załatwiają funkcje odnoszące się do EEPROM Podeślij proszę do tego jakiś odnośnik, zaglądałem tutaj https://www.nongnu.org/avr-libc/user-man... oraz na dysku do bibliotek ale nie znalazłem implementacji tych funkcji, chętnie zobaczę jak one wyglądają. To co znalazłem...
Sama tablica wektorów przerwań w F103 to 200bajtów (ok. 50 wektorów * 32 bitowy adres). Nawet więcej, bo jest 16 wektorów rdzenia, a STM32F1 mają przynajmniej 60 swoich własnych (max 68 w connectivity) - razem więc jest 76-84, co daje przynajmniej 304 bajty. Do tego często dochodzą osobne handlery dla każdego przerwania (sam zacząłem tam jakiś czas...
Użyj sekcji .progmem.gcc - położona jest ona tuż za tablicą wektorów przerwań i standardowo nic w niej nie ma, a więc ma stały dla danego procesora adres początku.
Ok. Przeszukaj pliki w swoim projekcie po nazwie "SysTick_Handler". Znajdziesz tą nazwę w pliku asemblerowym (lub w pliku *.c) w tablicy wektorów przerwań. Ta tablica zawiera między innymi adres funkcji o nazwie SysTick_Handler. Linker umieszcza tablicę pod odpowiednim adresie w pamięci (zgodnie z datasheet procesora).
Witam. Jestem w trakcie pisania bootloadera po magistrali CAN dla STM32F103VE. Opieram się głównie na publikacji AN2557 zamieszczonej na stronie ST. Potrafię przesłać aplikację użytkownika po magistrali CAN do uC i zaprogramować pamięć Flash od wybranego adresu w górę. Na wstępnie odblokowuje pamięć Flash (FLASH_Unlock(); ) następnie podgrywam aplikację...
Masz w swoim kodzie jakieś przerwania? Coś zmieniłeś w samym programie? Generalnie tablica wektorów z jednego układu oczywiście nie pasuje do drugiego, jednak jak nie masz przerwań to bez znaczenia, bo pierwsze ileśtam wektorów jest identyczne, a do podstawowego działania i tak potrzebujesz tylko dwóch pierwszych wpisów.
Pytań ciąg dalszy: alokując wektory przerwań do innej części FLASH za pomocą attribute((section".aaa")) napotkałem na taki oto problem....a mianowicie linker zawsze umieszcza przerwania w tej samej sekcji...nie ma możliwości umieszczenia wektora 1 np w sekcji .aaa a wektora 9 w seksji .bbb !!! jakby tego było mało to najpierw jest umieszczany wektor...
Zainstalowałem AVR Studio4 i lecę od początku z google i pdf na temat ASM i AVR Powiedzcie chociaż czy w dobrym kierunku zmierzam? Bo jak w złym to odpuszczam i daje sobie spokój, pobawię się migającymi diodami w Bascomie. Tam gdzie nie ma komentarza to nie wiem co to znaczy i co robi ale było w pdf lub innych opisach, jeżeli ktoś może mi wyjaśnić instrukcje...
Co się dzieje jak ARM VIC vector mode jest zablokowany w rejestrze Host Control Register? To w jaki sposób przerwania są realizowane, tzn. wiem że poprzez metodę odpytywania (polling)... z tym, że zauważyłem, że i tak jest wykorzystywana tablica wektorów adresów procedur obsługi przerwania (z rejestru Interrupt Vector Address Register0-N (gdzie N to...
Mój problem polega na tym, że wiele zagadnień rozumiem teoretycznie i często przez brak znajomości szczegółów nie potrafię zapytać konkretniej jak tylko ogólnie. Postaram się jednak sprecyzować moje powyższe pytanie. Tablicę wektorów rozumiem jako pewien określony obszar w pamięci w któymznajdują się odwołania do funkcji tych przerwań. Zastanawia mnie...
Perler: w twoim kodzie jest dużo niedociągnięć.. funkcje Delay powinieneś wywołać przez 'rcall', tu zaś przychodzi brak stosu i brak 'ret' na końcu. w samym Delay widze odkładanie 4 rejestrów (gdzie?) ale niewidze ich zdejmowania ani pętli do opóźnienia.. po wystawieniu wartości 0x00 na porta odrazu dokonujesz skoku do początku pętli i odrazu zmieniasz...
SeerKaza napisał: Czyli co wystarczy że włącze przerwanie i wstawię w mainię funkcje Akurat _w_ main() to raczej średnio Ci się uda (; Chodziło mi o plik main Jeśli całość kompilujesz kompilatorem C++, to funkcje przerwań muszą być extern "C" (jeśli akurat tablica wektorów jest kompilowana kompilatorem C, albo gdy jest w assemblerze). I teraz nie wiem...
Witam, czytając książkę A. Pawluczuka natknąłem się na inicjację wektorów przerwań. Jak wiadomo w książce jest wykorzystywany µC ATmega8515 (niestety ja korzystam z ATmegi32). Przykładowa tablica tutaj: .orgINT0addr ;External Interrupt0 Vector Address reti ; ;---------------------------------------... .orgINT1addr...
Konfiguracja wewnętrznego kontrolera przerwań (to co robisz funkcją), a odpowiedni prolog/epilog assemblerowy (to co robisz deklaracją z "__irq") to dwie odmienne sprawy. Jeśli tablica wektorów w startupie ładuje adres funkcji bezpośrednio (nie ma jakiejś funkcji wrappera), to obydwie te operacje są konieczne. U ciebie właśnie tak jest. 4\/3!!
Oczywiście nie mam racji;). Tablica wektorów jest zdefiniowana w pliku startup_stm32f10x_md_vl.S. Teraz wystarczy, że nawet w main.c dodam sobie void USART2_IRQHandler( void ) i powinno mi to zadziałać. Gdyby coś było nie tak, to będę kontynuował temat. Dzięki za wskazówki!
Przyszedł czas na zrobienie własnego bootloadera a z nim kilka problemów i pytań. Pierwszym problemem jest skrypt linkera: nie potrafię stworzyć sekcji bootloadera na początku programu. Stworzyłem sekcję na końcu. Co muszę poprawić w poniższych skryptach żeby mój bootloader był za tablica wektorów przerwań aż do adresu 0x08000400? Od 0x08000400 ma być...
A tablica wektorów na 100% poprawna? Jak podejrzysz w pliku .lss wektory, to pod właściwym adresem jest adres Twojej funkcji obsługi? P.S. Ten plik na pewno jest main.c, a nie main.cpp? Bo w tym drugim przypadku faktycznie uruchomienie przerwań wymaga kilku wciśnięć klawiszy więcej. 4\/3!!
... jeśli tablica umieszczona jest w pamięci programu a nie RAM to powinno być jednak <<2 a nie <<1 ;) .... a dlaczego? bo każda komórka tej pamięci to dwa bajty. I jeśli są tam dane umieszczone za pomocą .db to te bajty danych są umieszczone w słowach dwubajtowych i dzięki poleceniu <<2 dobieramy się do odpowiedniego bajtu. Natomiast...
W pracy mam jakiegoś AVR64 lub AVR128 , już nie pamiętam co kupiłem. Ale będę miał dostęp dopiero pod koniec tygodnia. Teraz możemy zrobić mały eksperyment i sprawdzić jaki jest rzeczywisty rozmiar wektora przerwań. W załączeniu projekt w ASM który powoduje wywołanie przerwania NMI czyli następny wektor po RESET. Przy czym dzięki temu że mamy projekt...
Nic nie stoi na przeszkodzie, aby ten plik był sobie i plikiem C++, byle miał owe extern "C" - ta deklaracja oznacza tylko, żeby nie manglowało nazw, możesz w takich funkcjach wywoływać dowolne klasy itp. Tak czy siak extern "C" przyda się w pliku z tablicą wektorów, ale i przed faktyczną funkcją obsługującą przerwanie (bo taka może być w dowolnym pliku...
Tylko po co komu te wektory przerwań w RAM? Przecież mogą być spokojnie we flash... Do wykonywania skoków pod adres z rejestru służy instrukcja "bx ...", a nie "mov pc, ...". Przy okazji zawsze ciekawił mnie ten styl pisania 100x "asm volatile(...)" - pomiędzy tymi wywołaniami kompilator może sobie wstawić co mu się podoba, np. wpisać do rejestru r0...
Trzeba zmienić PROGRAM. Domyślnie w STM32 tablica wektorów znajduje się w flash, a to skąd uruchamiasz program czy jak jest skompilowany nie ma żadnego znaczenia. Manual: Boot from the embedded SRAM: SRAM is accessible only at address 0x2000 0000. Note: When booting from SRAM, in the application initialization code, you have to relocate the vector table...
No ale przecież nie masz skryptu linkera - bez tego to po prostu nie ma prawa działać... A ta wtyczka z której korzystasz kompiluje pliki assemblera tylko jeśli mają rozszerzenie .S, a nie .s. Zestaw porad jest taki: http://www.elektroda.pl/rtvforum/topic13... http://www.elektroda.pl/rtvforum/topic13... Weź przykładowy projekt dla STM32,...
No to przykładowe projekty w wersji 1.2.0-rc1 zamieściłem na swojej stronie - www.freddiechopin.info w Download > ARM > Przykłady Czekam na komentarze dotyczące nowości czyli: 1. Kompilacja plików w dowolnych folderach 2. Nieco bardziej standardowe nazwy w pliku Makefile 3. Możliwość definiowania rozszerzeń plików z kodem 4. Możliwość wywołania...
Po czym to rozpoznałeś? Powtarzające się bloki po 8 bajtów na początku pliku wyglądają na zaszyfrowaną tablicę wektorów przerwań. Nie zaszyfrowane powinny się powtarzać 4 bajty adresu we flashu lub ramie. Ktoś się nie przyłożył do szyfrowania. Jak by było zrobione porządnie to cały plik wyglądał by na losowy. Nie jest to AES ani prosty XOR. XTEA? Raczej...
Cześć, Mam problem ze zmianą położenia tablicy wektorów przerwań na STM32F417. Potrzebuję dostępu do pierwszych 4 sektorów pamięci, więc rdzeń musi od początku szukać wektorów pod innym adresem. Odpalenie programu normalnie, a potem ręczne przesunięcie wektorów nie wchodzi w grę. Potrzebują początkowych sektorów do przechowywania nieulotnych danych...
Włączyłeś przerwania, jednak nigdzie nie masz procedury obsługi dla RXCIE i TXCIE. Wywołanie przerwania powoduje skok programu pod adres zdefiniowany w tablicy wektorów przerwań, czyli w Twoim przypadku reset procka. Druga sprawa to błąd w tej funkcji. Ona nigdy się nie zakończy, gdyż brakuje inkrementacji wskaźnika s w pętli. Ale zakładam, że to błąd...
W plikach ".cpp" extern "C" [syntax=c]extern "C" void SysTick_Handler(void) { GPIOA->MODER = 0; }[/syntax]
Bo może wektor przerwań dla tego akurat kanału DMA się nazywa inaczej? Porównaj nazwę Twojej funkcji z zawartością tablicy wektorów. Jeśli masz w projekcie pliki C++, to trzeba przerwania deklarować jako extern "C". 4\/3!!
U mnie kod: .org 0 start: inc r1 rjmp start działa poprawnie (AVR Studio 4, ver 4.12 sp1 build 462). No wiec asemblacja przebiega prawidlowo, lecz podczas debugowania program wyskakuje z obiegu. Tzn. co się dzieje ? Co do eeprom, spróbuj tak: .ESEG eevar1: .DW 0x1234 Po asemblacji wygenerowany zostanie plik nazwa_projektu.eep, wrzucasz go za pomoca...
Na początku flasha masz tablicę wektorów przerwań. Za pomocą NVICa możesz przesunąć tą tablicę lub przenieść do RAM. W załączniku masz przykładowy plik z tablicą wektorów przerwań
Problem z przerwaniami a raczej ich brakiem był związany, wg mojej wiedzy/ obserwacji z nieprawidłowym przeniesieniem tablicy wektorów przerwań. Same instrukcji wg książki: [syntax=c] MCUCR|=(1<<IVCE);// Uaktywnij zmianę wektorów przerwań MCUCR|=(1<<IVSEL);// Przenieś przerwania do sekcji boot-loadera [/syntax] Nie działały, trafiłem na...
Może inaczej przerwanie jest to wystąpienie określonego zdarzenia . Wektor przerwania to miejsce (adres fizyczny w pamięci programu do którego przechodzi mikrokontroler po wystąpieniu określonego przypadku) generalizując tablica wektorów zazwyczaj zawiera jedynie skoki do pod programów obsługi przerwania . Tak bardziej obrazowo siedzisz przed komputerem...
No to musisz mieć tablicę wektorów w RAM [; 4\/3!!
(at)robiw na 99.99% to błąd kompilatora, bo kiedy definiujemy procedurę przerwań np. ISR(INT0_vect) to w domyśle jest ISR(INT0_vect, ISR_BLOCK), czyli w trakcie wykonywania przerwania ponowne przerwanie nie zostanie wywołane dopóki aktualne się nie zakończy. Ten rcall powoduje że blokowanie zostało zdjęte przez reti i to jest problem. No i kod wcale...
tablica wektorów tablica przerwań tablica wektorów flash
dmuchawa bezpiecznik atmega sterowanie wyświetlaczem czujki bingo
parkside serwis laser krzyzowy
Kod błędu P2228 - Czujnik ciśnienia barometrycznego Zwiększone spalanie po wymianie ECU w Dacia Logan MCV 2 1.2 benzyna 2014