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...
Witam. Poniewaz chce zostawic w swoim programie pierwsze sektory nieuzywane (ewentualnie bez zadnych konkretnych funkcji) moj program powinien byc wygenerowany z okreslonym offsetem. Przebrnąlem przez skrypt linkera i mam pierwsze 4 kbyte flasha przeznaczone na moja sekcje BOOT, a reszta pamieci na sekcje FLASH. Skoro tablica przerwan tez sie przesuneła...
Też kiedyś o tym myślałem: http://www.elektroda.pl/rtvforum/topic18... Ja bym umieszczał CRC gdzieś na początku programu (w temacie wyżej było na końcu bo był z góry znany rozmiar pamięci FLASH). Rozwiązanie z umieszczaniem tego w tablicy wektorów albo tuż za ostatnim elementem tablicy wektorów jakoś najbardziej mi się podoba.
zobacz co masz w offsecie 0xE0 w tablicy wektorów (tej we flash)
widzę, że jesteś niezłym magikiem bo twoje makefile jest w ogóle nie podobne do tego generowanego przez AVRStudio. Ponieważ nie korzystam z AVRStudio. Ale spróbowałem tak z ręki skompilować ten twój bootloader: make bootloader zazwyczaj kompiluje się przez samo "make", tutaj przez "make all" i niestety dostaję błąd: makefile:28: *** missing separator....
:) 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ść...
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 Tę linię należy usunąć z tego pliku o ile nie masz zamiaru zmieniać mapowania pamięci na adres 0x0 (a tego prawie nikt nie robi) albo jak zamierzasz zmienić i nie zmieniać ciągle tych definicji to dodaj symbol...
Daj nowy region pamięci tylko na przerwania, Flash zaczniesz wyżej. Ja dałbym nawet nowy region na ów eeprom. mógłby być programowany wartościami domyślnymi, albo po prostu przesuń operator . za przerwaniami, choć to mało eleganckie.
Przerwania procesora działają w procesorach AVR na takiej zasadzie, że (pomijając inne operacje) po wystąpieniu danego przerwania ( podczas obsługi przez procesor ) następuje zapamiętanie rozkazu następnego, który byłby wykonany, gdyby procesor nie przyjął przerwania (jego adresu w pamięci flash) i skok pod jeden z adresów z samego początku pamięci...
vtable? To vtable od polimorficznych funkcji C++ (virtual, dziedziczenie klas, ...)? Wiesz że vtable to nie jest to samo co tablica wektorów przerwań? Przy okazji, tablica wektorów przerwań musi być we flash, dopiero po uruchomieniu układu (bez niej się nie uruchomi) można sobie przestawić NVIC tak aby korzystał z tablicy w RAM. Tak więc należy jedynie...
Zakładając 0 stosu i heapu w skrypcie linkera (po to aby nie zmącać Ci obrazu bo on się doda do BSS). Ty oczywiście ustaw je na wartości takie jak powinny być w programie. [syntax=c]make --no-print-directory post-build Generating binary and Printing size information: arm-none-eabi-objcopy -O binary "101n.elf" "101n.bin" arm-none-eabi-size "101n.elf"...
Zbyt dużo Ci nie pomogę chyba - niestety składnia poleceń kompilacji której oczekuje Twoja wersja kompilatora jest zupełnie inna niż moja, dlatego też nie mogę skompilować Twojego przykładu u mnie. Po podstawieniu mojego Makefile'a do Twojego projektu wszystko kompiluje się bez większych problemów (konieczne są drobne zmiany w skrypcie linkera - ustawienie...
To się powinno dać zrobić samymi skryptami linkera i paroma dyrektywami sekcji w kodzie źródłowym. No właśnie mi się nie udało i poszedłem na "łatwiznę" z ręcznym kopiowaniem. Niestety projekt już jest "polutowany" pod M0 (obudowa TSSOP20) a przy projekcie do głowy by mi nie przyszło że M0 nie ma relokacji tablicy wektorów w inne miejsce flash'a;
A przyczyna była błacha. Albo to przeoczyłem bo zdublowałem trochę kodu z aplikacji st u siebie - albo tego tam nie było. Nie był ustawiony adres bazowy tablicy wektorów przerwań - a powinien być na flash. A przed wywołaniem kodu st była u mnie pozostałość (z wcześniejszych aplikacji) która ustawiała adres bazowy tablicy wektorów na ram. no i przerwania...
Nie używaj tej głupawej biblioteki to będziesz wiedział dokładnie Co zrobiłeś i jak to cofnąć. Zmiana wskaźnika stosu PRZED wywołaniem jakiejś funkcji (FLASH_Lock() ) też nie wydaje mi się szczególnie dobrym pomysłem. W ogóle proste zadanie, ale tak je zakręciłeś jakimiś dziwnymi konstrukcjami, że nie wiadomo o co chodzi... A tak przy okazji, to skoro...
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.
Ja bym zrobił wersję nr1 (; Po przeflashowaniu softu i tak (raczej) musisz zrobić reset, więc nie musisz odtwarzać zawartości pamięci RAM, możesz więc sobie generalnie pokasować wszystkie inne zmienne [; Tak naprawdę na karcie możesz mieć dwa obrazy - nowy wsad i "bootloader". Kopiujesz sobie do RAMu "wprost" ten bootloader (kompletny działający z RAMu...
TO masz pecha. BO początku pamięci flash nie da się tak wykorzystać.
Zapisujesz do flash przy pierwszym uruchomieniu po programowaniu. Po resecie sprawdzasz czy tam jest ta wartość i jezeli jest to jest pierwsze uruchomienia, a jeżeli nie to kolejne Bez flagi to raczej się nie da (aslbo przynajmniej sprawdzenia czy coś jest zaprogramowane). Oczywiście mogę sobie wyobrazić rozwiązanie typu - ResetHandler jest do procedury...
No fakt, kilkadziesiąt linii deklaracji tablicy stałych zadeklarowanych jako zmiennych ajmującej pamięć RAM jest o niebo czytelniejsze niż: #define PAGEADDR(n) ((void *)(0x8000000 + (n) * 0x800)) Parę innych rzeczy też jest dziwnie, np. pisanie Flash stronami zamiast słowami, przekształcenia int na adresy itd. Czy jesteś pewny, że nie próbujesz pisać...
Przed uruchomieniem aplikacji przez bootloader należy: - przestawić wskaźnik głównego stosu, - przestawić tablicę wektorów. Robisz te dwie rzeczy? Poniżej fragment mojego bootloadera w którym wykonuję skok do aplikacji. Wszystkie przerwania i układy peryferyjne są "zresetowane" wcześniej. [syntax=cpp-qt]/// beginning of flash block for firmware extern...
Chciałem się zapytać czy ten przykład od Freddie Chopin'a pasował by do STM32F2. Czy trzeba coś zmieniać prócz rozmiaru pamięci Flash, RAM i tablicy wektorów przerwań ?
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...
To poczytaj sobie o pisaniu bootloaderów. Tu tematów było kilka. Po co marnować aż 512kB na bootloader? 1. start programu (jest lub nie) przy takiej wersji bootloadera zakładam ze będzie wgrywany razem z jakąś wersją aplikacji. 2. aplikacja na jakieś polecenie reaguje i wywołuje bootloader mający swoją tablice wektorów. 3. aktualizacja oprogramowania....
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...
Czy procedurę o etykiecie "timer0" masz daleko od początku programu? A może jej w ogóle nie masz? W zasadzie dla procesorów o tak dużym Flash'u powinno się używać rozkazu "jmp", a nie "rjmp" (dlateg adresy w tablicy przerwań są co 2 bajty), ale tak jak napisałeś może też być, pod warunkiem, że nie zostanie przekroczony zasięg rozkazu "rjmp". Wówczas...
(at)TvWidget Uważam że masz złe podejście. Załóżmy że rozmiar bootloadera się zmieni. I co wtedy. Raczej porztbujesz mieć to relatywnie w stosunku do początku aplikacji. Wtedy wystarczy tylko dodać sekcję z tą zmienną (jeżeli ma być we flash) tuz po tablicy wektorów a przed .text. Wtedy bootloader (zakładam że go sam piszesz) zawsze będzie wiedział...
1. Podstawowa zasada jest taka, że najpierw konfiguruje się to co ma wywoływać przerwania, a dopiero potem się to włącza. Innymi słowy - najpierw EXTI, potem NVIC 2. Wywal funkcję NVIC_Conf() - po co Ci ona, domyślnie tablica wektorów jest w pamięci flash i niech tam zostanie. 3. Funkcja obsługi przerwania musi mieć jakiś atrybut świadczący o tym, że...
Witam! Nie jest to wina otoczenia. Miałem ten sam problem. Po pierwsze czy aby dobrze kompilujesz plik wynikowy. To znaczy czy nie nadpisujesz adresu 0x0040h do 0x0043h - tam znajduje sie hasło. Blokujące flash przed wyczyszczeniem, a nawet zczytaniem. Tablica wektorów 0x0000h do 0x003Fh. Program od 0x0044h. Druga sprawa jest taka, że program ładujący...
Najłatwiej kod bootloadera pisać jako osobny projekt - wtedy nie pojawiają się żadne konflikty, a docelowo i tak podczas aktualizowania nie wysyła sie już bootloadera. MarcinKawka : Twój kod wykonuje dwa odwołania do MCUCR w celu zmiany lokalizacji tablicy wektorów przerwań. Wstawka zawiera błąd, ponieważ nie informuje kompilatora o zniszczeniu zawartości...
Tzn, że program może działać dalej poprawnie a debuger wskazuje na to, że jesteśmy w np HardFaultHandlerze ? Mógłbyś nieco rozwinąć myśl ? Czasem może być jakiś problem sprzętowy/programowy/systemowy, który może spowodować wywalenie się debuggera, który będzie np. uparcie twierdził, że jesteśmy wciąż w jakiejś linii, choć mikrokontroler sobie wtedy...
A jakiś link do tego, który mas na myśli? Chociażby blink led Freddiego: https://freddiechopin.info/en/download/c... Osobna sprawa, że plik startowy musi być specyficzny dla procesora. I tak i nie. W sumie to od Ciebie zależy co umieścisz w startupie a co w funkcji main(). Najczęściej w startupie są dwie ważne...
To nie jest moim zdaniem problem z OpenOCD, tylko masz źle skompilowany program. Po tym co mi podesłałeś widzę, że cały kod znajduje się pod jakimiś abstrakcyjnymi adresami, brakuje tablicy wektorów itd. Wrzuć cały projekt (kod, startup, skrypt linkera, makefile). 4\/3!!
No coż, zajrzyjmy do dokumentacji. W papierach od LPC2129: UM10114 LPC21xx and LPC22xx User manual Rev. 03 — 2 April 2008 na str. 22 mamy opisaną pamięć, tablicę wektorów i jej mapowanie. W papierach od LPC1343 (Cortex M3) UM10375 LPC1311/13/42/43 User manual Rev. 2 — 7 July 2010 na str. 53 mamy coś takiego jak: 47 0xBC USB IRQ interrupt...
Bo tam się koledze sporo pomieszało. Nie sądzę. Nie rozumiem, jak działają wektory, nie mogę w necie znaleźć o tym nic sensownego. Wektor czyli tablica jednowymiarowa. Ale dlaczego tutaj &cyfry Tablica (wektor) cyfra zawiera wartość kolejnych pozycji liczby. Tablica 'cyfry' zawiera patterny danej cyfry dla kodu 7 segment. Pattern musi być zamaskowany...
Datasheet podaje, że wytrzymałość pamięci flash to minimum 10000 cykli. Przemyśl, czy naprawdę warto kombinować, bo - uwierz - niepoprawne uruchomienie programu z RAM potrafi czasem sporo namieszać (szukasz błędu który nie istnieje). Co do komend, to po pierwsze musisz mieć inny skrypt linkera (bo nie używasz już flash), musisz wiec inaczej linkować...
Podsumowując... Loader umieszczony jest we flash od adresu 0 i nie ma od tego odstępstw. Aplikacja umieszczona jest pod dowolnym adresem we flash z wyrównaniem do 512. Żadne biblioteki nie maja kodu na stałe przypisanego pod konkretny adres, nawet SPL, wszystkie startupy i tak zależą od linkera, no chyba, że ktoś sobie coś udziwił i coś na stałe przypisał....
(at)nowyARM Może to sobie nawet na początku pamięci flash aplikacji (zaraz za wektorami przerwań przykładowo) ale chyba nie o tym temat. Więc to już drugi Twój post nie na temat. Obawiam się, że zaraz będą wspomnienia 8051 oraz magnetowidów.
Chciałbym ulepszyć pewien produkt zbudowany w oparciu od STM32F101. Udało się zrzucić pamięć FLASH procesora, nie był zablokowany. Zawartość pamięci wygląda na poprawną, widać napisy wyświetlacza, można wyodrębnić funkcje. Mam problem ze zrozumieniem wektora startu. Obszar pamięci FLASH zaczyna się następująco: 0x08000000: 0x20000400 0x08000004: 0x080586F5...
(at)nonor W pliku startup.s masz obsługę wyjątku reset. Jest to miejsce, w którym procesor rozpoczyna wykonywanie programu. Kod w tym pliku: - konfiguruje stos (stosy) - kopiuje sekcję .data do z FLASH do RAM - czyści sekcję .bss - wywołuje globalne konstruktory - wywołuje kod funkcji main Plik vectors zawiera tablicę wektorów przerwań. Z każdym przerwaniem...
...Jeśli nie, to tak jak napisałem w poprzednim poście. Ba , żeby to bankowanie było takie proste jak opisałeś , to fajnie by było , ale niestety nie jest :( Co z przerwaniami , instrukcjami powrotu (RET,RETI) - skąd proc ma wiedzieć na która stronę wrócić po wykonaniu podprogramu :?: Procek który ma 16-bitową szynę adresową , nie może obsłużyć banków...
Witam Potrzebuję zarezerwować fragment FLASH na tablicę ze stałymi, znajdującą się pod stałym adresem. Ma to umożliwić programowanie tych danych niezależne od kodu. Najlepiej by było, gdyby to był obszar o niskich adresach, np zaraz po wektorach przerwań. Czy jest w GCC jakiś mechanizm, pozwalający na wyłączenie bloku FLASH, by nie był w jego obszarze...
Czy dołączyć źródła do projektu, czy wgrać sam bootloader jako inny projekt? Dwa osobne projekty. Kolejna sprawa to zmiana offsetu flash. W przypadku projektu Freddiego czy będzie to tylko zmiana w pliku _rom.ld na: Do przesunięcia dochodzi jeszcze konieczność zmniejszenia rozmiaru dostępnej pamięci. Kolejne pytanie to czy trzeba i ewentualnie jak...
Przyznam się, iż faktycznie chodziło mi po głowie aktualizowanie programu sekcjami:) Wydawało mi się, że miało by to sens w sytuacji gdy urządzenie pracuje w mocno obciążonej sieci i rzadko kiedy znajdzie się czas na podesłanie mu jakiejś paczki z kawałkiem nowego programu. Wówczas łatwiej byłoby przesłać aktualizację tylko jakiejś sekcji (np. jednej...
Dokładnie tak, interesowało mnie dlaczego kod nie działa w takiej sytuacji. Miałem takie problemy z testowaniem własnego kodu po wrzucaniu do ram lub flash naprzemiennie, niestety nie dotarłem do przyczyny i sobie darowałem. Płytka to olimexino stm32 z STM32F103RBT6. Zasadniczo wszystko ma swoje źródło w tablicy wektorów, znajdującej się w pamięci...
Uruchom mikrokontroler w trybie bootowania (coś tam zwarte do masy) - pewnei odzyskasz komunikację z programatorem. Napisz dokładnie, co zrobiłeś i pokaż kawałki kodu. Typowo relokacji tablicy adresów wyjątków używa się przy własnym bootloaderze. Nie rusza się wtedy mapy sekcji, a tylko zmienia bazę pamięci FLASH w skrypcie linkera. No i wyjaśnij, jak...
Kolega cristof_w ma po prostu złe nawyki z programowania c/bascom. W procesorze nie ma żadnego wydzielonego miejsca gdzie należy cokolwiek definiować albo umieszczać . Pamięć flash jest do twojej dowolnej dyspozycji i co chcesz gdzie chcesz umieszczasz. Musisz tylko wziąć pod uwagę że pierwsze komórki tej pamięci mają dodatkowe specyficzne zastosowanie...
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ć...
Wygrzebałem skrypty skądś indziej razem ze startup'em, tablicę wektorów wziąłem tymczasowo od LPC175x/LPC176x, nie mogłem doszukać się pod ten. Niestety w czasie kompilacji linker wypluwa między innymi: [syntax=bash]ld.exe: error: .vectors is too large to fit in FLASH memory segment[/syntax] W skrypcie od tego mam: [syntax=c] __vectors_end__ = __vectors_start__...
Zlecę napisanie działającego szablonu kodu dla STM32F030 gdzie: -pracuje jeden dowolny timer i wywołuje przerwanie -jest funkcja zapisu jednej strony do flash nie powodująca zatrzymania obsługi przerwania timera Nie wiem czy jest to możliwe, lecz wydaje mi się, że by to uzyskać należy przenieść do RAM: -tablicę wektorów przerwań -funkcję obsługi przerwania...
tablica wektor tablica wektor stm32 tablica flash
samsung czcionka czujnik pralka vaillant wyświetlacz symbole
zmywarka ariston zmywarka ariston
Jak włączyć dźwięk w pralce Haier? IVECO Stralis 2006 – brak napięcia na czerwonym przewodzie zaworu pedału hamulca