Na wypadek, gdybyś nie zauważył: przy takich deklaracjach i treści procedury konfiguracji DMA, jakie masz obecnie, do rejestru adresu pamięci DMA wpisujesz wartość bajtową odczytaną z pamięci ze zmiennej TxBuf, rozszerzoną zerami do 32 bitów, czyli wysyłasz przez UART zawartość tablicy wektorów wyjątków.
No to musisz mieć tablicę wektorów w RAM [; 4\/3!!
Dla całej aplikacji. W pliku z tablicą wektorów.
Freddie, to wiadomo. Zastanawiam się właśnie na tablicą wektorów przerwań. Myślałem, że do FreeRTOS muszę mieć to inaczej rozwiązane niż dla programu bez systemu. Rozumiem, że wystarczy mi plik z tablicą wektorów.
Słuszna uwaga z tym startupem. Mam go w katalogu projektu, który jest wskazany w ścieżkach eclipsa, ale nie wiem dlaczego nie jest linkowany. Może ma nieprawidłowe rozszerzenie? Teoretycznie istotna jest wielkość liter. Freddie, czy masz może jakiś ładny przykładowy projekt dla CM0? Dla STM32F0 nie, ale możesz spokojnie zrobić małego frankensteina...
Nie dziala jest barszo ogólnym stwierdzeniem. Co nie dziala? DH? masz debuger. Coś innego? Yo tylko była tablica wektorów oczywiście.
W plikach ".cpp" extern "C" [syntax=c]extern "C" void SysTick_Handler(void) { GPIOA->MODER = 0; }[/syntax]
Cortex, po resecie, odczytuje adres stosu i początku programu z początku pamięci. I tego nie przeskoczysz. Przesuwanie tablicy wektorów przydaje się np. jeśli na początku flasha masz kod bootloadera (z własną tablicą wektorów) a potem przechodzisz do właściwej aplikacji, która ma swoją osobistą tablicę wektorów pod innym adresem.
Tylko w tablicy wektorów musisz poprawki wprowadzić. Skrypt linkera nie ma tu znaczenia. 4\/3!!
jeśli nie ma stosownego wpisu w tabeli wektorów przerwań? No dobra, wpis w tabeli jest ale jest o tym napisane tak małymi literkami że mi umknęło :-) Technika jednakowoż nie jest, wydaje mi się, tylko ciekawostką, można ją uznać za przydatną np. w programowaniu zdarzeniowym. Innym mi znanym przykładem jest RTOS QP/C gdzie handlery przerwań tzw. kernel...
teraz postanowiłem uruchomić timer 2 i w żadnych plikach nie widzę funkcji do tego timera. To poszukaj dobrze - musi być w pliku w którym jest tablica wektorów, być może jest to ten sam plik w którym jest startup.
Przeczytaj ten wątek i kup sobie inną płytkę. Co ma płytka wspólnego z tym problemem. Jak tablica wektorów jest zła to nic nie pomoże. Nawet zrobiłem porównanie STM-owego nagłówka z tym autora.
A ja zapytam : czy w tablicy wektorów przerwań znajduje się pod właściwym adresem handler obsługi przerwania od UART4? Bo zapewne nie i dlatego ląduje w DefaultHandlerze. Podejrzewam, że tablicę wektorów masz od STM32 z trzema uartami.
Proponowałbym raczej plik vectors jednak mieć w C, a nie C++ (nic to nie zmienia, poza właśnie problemem z manglowaniem nazw funkcji) (; Ewentualnie właśnie "extern" umieścić w pliku z tablicą wektorów. 4\/3!!
Witam, Wg manual'a do procesora Cortex M3 jeśli się zmienia kod programu lub/i tablicę wektorów przerwań, to przed następną instrukcją powinno się użyć instrukcji ISB, DSB i DMB aby bufory załadowały nowe wartości.
No ale jak zrobisz takie przyporządkowanie o jakim piszesz (bez podziału) to funkcja Reset_Handler ma adres w RAM, więc w tablicy wektorów będzie adres w RAM. Oczywiście zanim ten Reset_Handler się uruchomi, to w RAM nic nie ma - tak więc to nie ma prawa działać... 4\/3!!
Pytasz mnie po co jest tablica wektorów czy dlaczego jest w osobnym pliku? 4\/3!!
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...
Nie zapomnij ustawić wskaźnika stosu przed skokiem do głównego programu. Jego wartość jest na samym początku kodu programu głównego. Ustalając adres bazowy głównego programu pamiętaj o wyrównaniu dla tablicy wektorów przerwań, nie pamiętam dokładnie, ale chyba do 512.
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).
Jak jestem w przerwaniu i robię tak to działa: Większość funkcji FreeRTOSa zwraca jakiś kod błędu, wystarczy go sprawdzić a nie ignorować. Czy jak używam przerwań na FreeRtos to funkcja powinna mieć naked+ interrupt, czy tylko interrupt tak jak tu: W pliku FreeRTOSConfig.h po prostu dorzuć coś takiego: [syntax=C]#define vPortSVCHandler SVCall_Handler...
Tablica wektorów przestawia się sama w zależności od konfiguracji pinów BOOTx. 4\/3!!
Hehe, chyba ślepnę powoli :P Masz dobrą tablicę wektorów? Tablicę wektorów oczywiście napisałem sam, na podstawie twoich projektów dla µC LPC11xx i STM32. No i faktycznie, w tablicy wektorów zapisane miałem: Nie powinieneś działać na rejestrze 0? Tak, dokładnie, jedynka była wynikiem moich poszukiwań niepowodzenia, wcześniej widniało tam zero....
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...
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...
hmmm Dobre pytanie. Ponieważ takie umieszczenie bootloadera pozwala mi uniknąć zabawy z tablicą wektorów przerwań, ominięcie przesunięcia początku programu i tym podobne.
Kod z użyciem samych rejestrów jest mało czytelny, trudny do ewentualnej migracji pomiędzy mikrokontrolerami itp, itd... Nie zgadzam się z Tobą. Ja piszę na rejestrach tak samo. Ten "szablon" to tylko copy paste z różnych fragmentów tego STM dostarczyło. Nie wiadomo nawet jak ta tablica wektorów wygląda i jakie są handler-y.
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!!
Też nie bardzo wiem jaka jest nazwa (wektor) funkcji tego przerwania, więc mam tak: Przecież wystarczy zajrzeć do tablicy wektorów i wszystko stanie się jasne... Można też zajrzeć do manuala, aby dowiedzieć się, że system CSS jest zmapowany na przerwanie NMI. Nie wiem czy czekanie na odpowiedź na forum jest naprawdę szybsze... 4\/3!!
:) 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ść...
No jak nie masz startupa i tablicy wektorów to czego oczekujesz? Zacznij od kompilacji przykładowego projektu dla STM32 z mojej strony - dopiero jak zrozumiesz co i jak to zmieniaj całkowicie "skład" projektu. 4\/3!!
Najprościej będzie chyba wziąć pliki z projektu dla LPC1114 i poprawić w nich stosowne rzeczy (rozmiary pamięci, ich adresy i rozmiary stosów w skrypcie linkera, przerwania w tablicy wektorów). Nie jest to dużo roboty, choć jest dosyć nudna.
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...
Co będzie błędne, bo pierwszą rzeczą jaką robi Twój program jest jednak Reset_Handler, a nie to co przypadkiem trafiło na początek sekcji .text. Co nic nie zmieni bo i tak tablica wektorów jest zapisana "na sztywno" w większości projektów. Tak naprawdę jest to wartość ignorowana jeżeli tablica wektorów jest zrobiona tak jak w większości projektów -...
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...
Ok, wydaje mi się że przewalczyłem ten problem. Tzn teraz mam plik *.ld (sam zedytowałem jakiś znaleziony w bibliotekach STM32) i dodałem tablicę wektorów znajdującą się w w pliku stm32f10x_it.c. (chodzi mi o to by wykorzystać biblioteki bez przeróbek). Wszystko się teraz ładuje do Flasha z tym że jak debuguję to procesor skacze po programie. Tzn wchodzi...
Wygląda na to, że się całość się jakoś skompilowała pomimo warningów i zlinkowała (bo powstały mi pilki hex i elf). ...aczkolwiek rozmiar pliku wynikowego *.hex = 34 bajty każe przypuszczać, że jeszcze sporo przede mną... Brakuje Ci tablicy wektorów i startupa. Prościej będzie Ci zacząć od kompletnego przykładu, ewentualnie od przykładu + modyfikacje...
Próbuję pożenić template Freddiego (stm32_blink_led) z StdPeriph Ale to widziałeś? http://www.freddiechopin.info/pl/artykul... Ma ktoś pomysł co może być nie tak ? W skrypcie linkera należy ustawić rozmiar stosu dla przerwań - domyślnie jest zero, co zwykle źle się kończy. Ustawiłeś...
No to wstaw tam dowolny wkaźnik, żeby reset handler był przesunięty o te 4 bajty. Analogicznie do innych zarezerwowanych. Swoją drogą, czy tablica wektorów musi zawierać osobne adresy do funkcji reserved ? Zdaje się, że starczyła by jedna (pomijając fakt rozszerzalności takiego rozwiązania).
Na początku podziękuję za dobry tutorial. A teraz mam prośbę. Próbowałem odpalić przykład z biblioteki STM32_USB-FS-Device_Lib_V3.3.0 (Virtual_COM_Port). Po pewnych bojach udaje mi się wszystko skompilować, natomiast po uruchomieniu program staje w nieskończonej pętli w funkcji static void __Default_Handler(void) z pliku vector.c. Czyli w tym pliku...
Wszystko fajnie, pod warunkiem, że chce się używać STM32. Dodanie podstawowego wsparcia dla innych układów jest porównywalne z postawieniem projektu na FreeRTOSie - ot po prostu musisz mieć tablicę wektorów i skonfigurowane rozmiary/adresy pamięci i dokładny typ układu. We FreeRTOSie przecież wsparcie dla STM32 czy dla LPC tak samo nie istnieje - tablicę...
No właśnie. Main de facto jest wywoływany ze startupu. Dokładniej z Reset Handlera. Żeby go mieć musisz mieć tablicę wektorów... błędne koło :) Wbrew pozorom main nigdy nie jest punktem startowym całego programu.
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ś...
A czy ja się upieram, że poprawną? Ale te przewidziane 'prawidłowe' też nie zawsze działają. Dajemy 'reset' a program nie uruchamia się z bootloader-a i co wtedy? A nie uruchamia się ponieważ: włączony jest remap, przeniesiona tablica wektorów, zawiera 'byle co', nieustawiona 'power domain' itp. Twardy jump na adres fizyczny w ROM bywa skuteczniejszy.
po co w niektórych implementacjach takich 'rozbiegówek' mamy kod assemblerowy który kopiuje adres stosu do rejestru SP procesora? STM32 może używać dwóch stosów - jednego dla przerwań (nazwanego wyjątkowo myląco "main stack") i drugiego dla wątków (nazwanego "process stack") - a więc i dla "main()". To co jest w tablicy wektorów ląduje w MSP ("main...
Witam, Czy mógłbyś w 2 zdaniach napisać, na czym polegał problem, poza zmianą nazw wywoływanych handlerów w tablicy wektorów ? Sam walczę z właśnie FreeRTOS'em i zachowuje się on bardzo dziwnie. Raz działa, raz nie działa, raz uruchamia się prawidłowo tylko jeden wątek ..
Ustawiłeś odpowiedni adres tablicy wektorów? Rdzeń domyślnie skacze na sam początek przestrzeni adresowej, a jeśli twój program nie przeniesie wektorów w ten obszar, to po prostu nie będzie działał... 4\/3!!
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...
Skoro linker się nie zajmuje ustawieniem LSB tablicy wektorów, to chciałbym zapytać się jak to się dzieje? Zasugerowałem się informacjami na tej stronie http://pygmy.utoh.org/riscy/cortex/led-s... wprawdzie autor, tylko podejrzewa ;) pzdr.
Może po prostu w szale experymentów pomieszałeś trochę zbyt bardzo, bo startup MUSI być "do pary" z linkerem i tablicą wektorów. Ten pliki które zamieściłeś robią to samo co moje i tyle. Ja nie wierzę aby to było jakimkolwiek problemem tutaj... 4\/3!!
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...
Pierwszy raz słyszę, żeby za pomocą komentarzy dało się cokolwiek zrobić w C :) Poszukaj w postach freddiego chopina, zrobił cały tutorial do toolchaina i udostępnił publicznie i nieodpłatnie projekt właśnie do migania diodą na STM32, zawierający plik startup, tablicę wektorów i konfigurację portów GPIO ze sterowaniem jednego pinu za pomocą bitbandingu....
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ć...
arcyimperator napisał: po skoku do Aplikacji z Bootloadera pojawia się dziwne zachowanie: zaczyna się wykonywać kod main() który jest przerwany i widzę w debugerze wykonywanie konstruktorów obiektów globalnych. Możesz pokazać jak to wygląda w debuggerze? Te konstruktory wykonują się jakby z main() czy jakby z przerwania? Późnym wieczorem sprawdzę i...
Tak wracając do tego off-topica - o ile w standardzie gnu89 nic mi nie brakuje, to zostałem zapewne jednym z pierwszych orędowników najnowszego standardu c++11 (czy z racji wersji kompilatora c++0x) jak zwykle w odmianie gnu++11 (gnu++0x). W najnowszej odmianie tego języka jest parę naprawdę fajnych rzeczy, jak na przykład ujednolicenie inicjalizacji,...
Bo ten program jest zły! Cortex-M3 pod konkretnymi adresami oczekuje konkretnych rzeczy - na samym początku flasha - wartości dla SP, potem adresu (adresu! nie instrukcji!) wektora obsługi wyjątku reset itd. Zapomnij o takim prostym programiku - to tak po prostu nie zadziała. Potrzebna Ci jest tablica wektorów, potrzebny Ci jest "normalny" skrypt linkera...
Praktycznie wszystkie te pliki są konieczne, a właśnie to co jest w /inc już nie, bo to jest potrzebne Twojej aplikacji... Pliki konieczne: Makefile startup skrypt linkera tablica wektorów + chyba wymagany jest jeden z plików hdr_..., bo jest zainclude'owany w startupie. Jeśli bawi Cię tworzenie od zera czegoś co już jest gotowe, to proszę bardzo -...
Po prostu przechodzę z avr a tam przy pustej main bylo nieco ponad 100 bajtów. Bez sensu to Twoje porównanie. To przecież dwa różne światy. Sama tablica wektorów przerwań w F103 to 200bajtów (ok. 50 wektorów * 32 bitowy adres). Plus inicjalizacja rejestrów i samego C, plus ustawienie zegara. Wychodzi 1k, jest bardzo dobrze. Nie ma się co tym przejmować,...
Ja stawiam na złe rozszerzenie plików assemblerowych (powinno być .S, a nie .s), bo jakby je w ogóle kompilował i linkował to byś miał błąd, że masz DWA startupy i DWIE tablice wektorów. Jak zwykle więc polecam oprzeć dalsze działania o mój przykładowy projekt, który - w przeciwieństwie do innych znalezionych "w necie" - działa (; http://www.elektroda.pl/rtvforum/topic13...
Jak wygląda sprawa z przerwaniami? Tam zamiast przerwań są używane callbacki. To nie tak jest. Callbacki są całkiem do czego innego. W programie HALowym, to użytkownik pisze obsługę przerwań sprzętowych (tak jak w klasycznym podejściu "rejestrowym") a specyfiką HAL jest tylko to że dostarcza pewnych gotowców na obsługę przerwań. Przykładowo weźmy uart....
Nie wiem jak wygląda Twój projekt. Ja mam w pliku port.c gdzieś tam dopisane tylko 3 linijki: [syntax=c] void PendSV_Handler(void) __attribute__ ((interrupt, naked, alias("xPortPendSVHandler"))); void SysTick_Handler(void) __attribute__ ((interrupt, alias("xPortSysTickHandler"))); void SVC_Handler(void) __attribute__ ((interrupt, naked, alias("vPortSVCHandler")));...
Skrypt linkera z Cube'a "działa" tak, że na początku pamięci ram ląduje sekcja data (zmienne inicjalizowane przy starcie programu - lokalne statyczne i globalne), potem jest bss (zmienne zerowane przy starcie programu - nie inicjalizowane statyczne i globalne). Następny kawałek to _user_heap_stack - czyli sterta i stos "w jednym". Rozmiar data i bss...
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...
Według mnie super pomysł, zrób na youtube z "lektorem" i będzie ekstra! Wg mnie dobrze by było przejść przez środowisko np. eclipse, na szybko wytłumaczyć co to toolchain, gdb, openocd i jak konfigurować (przesiadając się z avrow to wszystko nowe). Później tworzenie projektów wg mnie dla SPL! - startup, tablica wektorów pliki linkera i inne tajemnicze...
liczba=atoi(nrfRX To jest tzw Undefined Behaviour. I jest to błąd bardzo poważny. Wytłumaczę Ci, co to robi. Bierze jeden bajt (zakładam że typ tego jest uint8_t []) i konwertuje do wskaźnika do char. Następnie to na co wskazuje ten wskaźnik (a będzie on wskazywać na jakiś adres w zakresie 0x00:0xff (czyli na tablice wektorów)) jest traktowane jako...
Co to jest "bt_vector_read"? Zamiast 1 dodaj 4 i po problemie. Swoją droga to problemem jest cały sposób, bo można to zrobić 100x prościej i wygodniej... Stwórz sobie strukturę zawierającą dwa wskaźniki na te dwie funkcje, następnie stwórz stałą poprzez zrzutowanie adresu twoich wektorów na typ tej struktury. Albo po prostu nazwy funkcji ustaw jako...
Czy ktoś może mi powiedzieć czy poniższy algorytm ma szanse na realizację? co o nim myślicie? http://obrazki.elektroda.pl/9694939500_1... Po tym jak nowe oprogramowanie znajdzie się w buforze (new soft ) zostanie wywołany bootloader który skopiuje starą tablicę wektorów przerwać pod nowy adres (isr tab 1) i ustawi offset na tą tablicę....
te 2 pliki musze zmienić oraz dane w makefile i linkerze tak ?? W Makefile to za dużo zmian nie będzie (może jakieś nazwy plików), więc głównie linker i tablica wektorów. O to jaki kompilator będzie użyty chodziło mi że w includes są scieżki do g++ i jeśli będzie kompilować się w edge to nie będzie żadnych komplikacji ?? Te ścieżki są wykrywane automatycznie...
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,...
Timery i dokładne odmierzanie czasu w różnych miejscach kodu. Zamiast korzystać z kilku timerów, można w różnych blokach kodu konfigurować 1 timer i wstrzykiwać odpowiednią funkcję przerwania. Oczywiście pod warunkiem, że nie będziemy musieli odmierzać czasu dla dwóch bloków jednocześnie. Wygląda na to, że potrzebujesz po prostu callbacka w jednym...
Czołem, zajrzyj do plików core_cmFunc.h i core_cmInstr.h - sam zobaczysz, że "nic" ciekawego tam nie ma ;) Jedynie dołączają kolejny plik zależnie od używanego kompilatora. Poniżej wycinek z core_cmFunc.h : FreddiegoChopina . O wtyczce się nie wypowiadam, bo nie znam ;)
Fajnie że podałeś jakieś errory czy coś... Mamy zgadnąć co zrobiłeś źle? Powtórzę też to co napisałem ostatnio - poskładałeś sobie projekt z jakichś przypadkowych plików (mój Makefile, jakiś skrypt, startup z tamtej biblioteki), więc jak oczekujesz, żeby to działało, skoro skrypt linkera, startup i tablica wektorów są ze sobą nierozerwalnie połączone,...
Tylko u mnie nie jest to żadna sekwencja. Kanaly 11 i 12 są zamienione. No właśnie - dlaczego? Jak to stwierdziłeś? Próbowałeś kilka razy pod rząd uruchomić konwersję? Wziąwszy pod uwagę Niedoceniasz "HALa" od ST... (; pozostaje uruchomić debugger i sprawdzić co się właściwie dzieje w uC oraz HAL-u. Docelowo warto również sprawdzić metodę Użyj DMA...
(at)habrat włączasz taktowanie AFIO? Dodano: Tak sobie myślę, że grono osób chętnych do analizowania Twojego kodu byłoby większe, gdyby był ładnie sformatowany i ogołocony ze wszystkiego co nie potrzebne, ale to Tobie powinno zależeć ;) Bo teraz to... szybciej można to napisać od zera: [syntax=c]int main(void) { RCC_InitMax(); /* HSE, PLL, 72MHz */...
Na szczęście autor tematu używa profesjonalnego środowiska, a nie jakiejś "samoróbki", więc problemy konfiguracyjne go nie dotyczą, wszystko zawsze ustawia się dobrze. A to akurat jest napisane tam wyraznie ze jak używa sie czegoś innego niz zdefiniowane płytki w projekcie, to wstawiana jest "generic" tablica wektorów tak jak dostarczona przez ARM-a...
Firmowy bootloader mi nie wystarczy. Potrzebuje SPI i prawdopodobnie USB. Ustawiłem w pierwszym programie na: NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x00003000); i w drugim na: NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x00000000); Więc tablica wektorów powinna się przełączać, ale dalej miga tylko czerwona dioda. Uruchomiłem dodatkowo TIM4 i przeniosłem...
A zna ktoś może jakiś dobry przykład pod stm32f107 bo przykłady Freddiego Chopina są na stm32f103. ... Przecież wystarczy zmienić rozmiary pamięci w skrypcie linkera (tylko i wyłącznie). No i zgodnie z RM0008 zmodyfikować tablicę wektora przerwań, którą właściwie już masz w swoim projekcie więc wystarczy, że ją tam przekopiujesz. Minuta roboty Btw....
Sprawdź. To samo dotyczy tez innych wyjątków - musisz tę tablicę odpowiednio zainicjalizować. Jak to jest zrobione |(tzn cz ktoś sobie zadał ten trud) to zależy od toochaina. Niby to w jakim toolchanie jest zdefiniowana tablica wektorów? (at)grzegorzn Które flagi kompilacji są ustawiane przez Ciebie a które przez IDE automatycznie?
Czyżby? Czy dla AVR ktokolwiek przejmuje się skryptami linkera, startupem, tablicą wektorów i Makefilem? Przecież dla tej platformy jest DOKŁADNIE TAK SAMO jak dla ARM, a jakoś nikomu nawet na myśl nie przyjdzie zajmować się tymi plikami - każdy korzysta z gotowców zawartych w pakiecie avr-gcc. Te pliki tam fizycznie są, nikt nie zajmuje się tym jak...
Ponieważ w całym poście jedyną wartą uwagi informacją jest to: nie chce przyjmować klas to obstawiam że używasz C++. W takim razie gotów jestem się założyć, że nie masz nigdzie przy przerwaniach: extern "C" void nazwa_IRQHandler() {...} Bez owego >extern "C"< przerwania definiowane w plikach C++ nie zadziałają (jeśli...
Czy do funkcji HAL_UART_Receive_IT na pewno powinien być przekazywany adres wskaźnika do struktury UART_HandleTypeDef? Dziękuję bardzo za wytknięcie błędu. Jeszcze sporo nauki przede mną. Po zmianie wywołania z HAL_UART_Receive_IT(&huart2, &Received, 1); na HAL_UART_Receive_IT(&huart2, Received, 1); UART zaczął ładnie odbierać dane...
Startup bez zmian. Skrypt linkera - zmienić rozmiar pamieci. Tablica wektorów - poniżej. 4\/3!!
Chce zaimplementować emulację EEPROMu za pomocą FLASHa w mikrokontrolerze STM32F429. Te mikrokontrolery mają taki podział sektorów: https://obrazki.elektroda.pl/6074785200_... (tabelka jest z F41x, ale dla F42x i F43x jest tak samo). No i jak widać używanie ostatnich sektorów jest niewygodne, bo są one bardzo duże. Trzeba użyć któregoś...
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...
Niczym - jest nowszy, szybszy itd. Proponuję rozpocząć przygodę od przykładowego projektu dla stm32f4 z mojej strony, a następnie przenieść podstawowe pliki (tablica wektorów, startup, Makefile, skryt linkera i pewnie coś tam jeszcze) do projektu który chcesz rozwijać. Generalnie Twój problem wynika z tego, że nie dodałeś do projektu syscalls, w których...
Problem wynika z tego, że w Cortexach jeden ze stosów jest inicjalizowany SPRZĘTOWO, po resecie, tak samo pobierany jest adres funkcji Reset_Handler(). Problem o którym piszesz jest znany i polega na tym, że procka resetujesz, on w tym momencie wczytuje sobie SP oraz adres funkcji Reset_Handler(), a następnie programujesz do niego coś nowego, zupełnie...
Tak jak pisze Freddie Chopin mozna ale to bedzie reczne rzezbienie i skladanie kodu tak by zostawic dziure... Ale to jest rzezba okropna i utrudni na pewno prace nad kodem. Takiego rzezbienia nawet w binarce jest jeszcze kilka opcji, ale to nie najlepsze rozwiazanie. Wystarczy zapełnić tą jedną czy dwie strony rzeczami które praktycznie nigdy nie zmieniają...
Tutaj chodzi o sygnał audio, zwyklą muzykę. Chcę z tych 24 bitów zrobić 16 bitów bo taką mam pamięć SRAM. Potem ten sygnał będzie "domiksowany" do sygnału głównego, 24-bitowego. Skoro nasz sygnał muzyki jako już zedytowany, znormalizowany materiał to faktycznie 16 bitów wystarczy w zupełności bez kompromisu jakościowego. Zauważ zresztą że miksując...
Aktualna wersja CDC z CubeMX na F4 (tylko) ustawia zbyt mały rozmiar stosu. Zadałem sobie trud i zrobiłem dwa projekty na F103 i F446. 1. Stos zadajesz w konfiguracji przy generacji projektu. Domyślne wartości są identyczne dla F1 i F4 https://obrazki.elektroda.pl/1101990200_... Tak że jest to za każdym razem 1kB w 100% wystarczający...
Jak dla mnie bez jakichkolwiek zmian będzie... W sumie to sam nie wiem czym się te układy między sobą różnią, ale w plikach na pewno nie będzie żadnych zmian (linker, startup, tablica wektorów, Makefile, gpio, RCC, ...) 4\/3!!
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.
Wiem ale chciałem się dobrać do części bibliotek które dostarcza ST razem z ich definicjami. Na razie nie robię nic poważnego na tym procku więc nie chcę marnować czasu na ponowne odkrywanie ameryki. Chce też zobaczyć na ile CMSIS sprawdzi się dla mnie przy portowaniu aplikacji na inne cortexy. A jak zwykle szacun dla Twojego makefile - trzeci projekt,...
Witam wszystkich. Uzywam Eclipse + OpenOCD (0.9.0) + GCC. Do tej pory używałem STM32F103 (Cortex-M3), a teraz przesiadłem się na STM32F373 (Cortex-M4). Wziąłem ze starego programu skrypt linkera, startup, vectors.c i posklejałem do kupy odpowiednio je modyfikując. Program generalnie odpala się, mogę sterować GPIO. Następnie spróbowałem uruchomić SysTicka....
Witam Jak wyliczyć coś takiego za pomocą preprocesora ? Criterion for valid user code: The reserved Cortex-M0 exception vector location 7 (offset 0x 0000 001C in the vector table) should contain the 2’s complement of the check-sum of table entries 0 through 6. This causes the checksum of the first 8 table entries to be 0. The bootloader code checksums...
Hej Freddie, tym razem to już mam poważny problem i proszę Cię o pomoc. Problem mam cały czas z przerwaniami. Nigdy mi w sumie tak naprawde nie zadziałaly na tym projekcie od stm. Przerobiłem Twoją tablice wektorów przerwań: /** \file vectors.c * \brief STM32 (STM32F101 - STM32F103) vector table and __Default_Handler() * \details STM32...
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 Chyba trzeba szukać dalej: Tablica wektorów jest przesunięta w bootloader: SCB->VTOR = APP_ADDRESS; Tę linię należy usunąć z tego pliku o ile nie masz zamiaru zmieniać mapowania pamięci na adres 0x0 (a...
Gdy dodałem jako atrybut do funkcji "weak" żeby kompilator nie dodawał na wejciu odkładania na stos Atrybut "weak" służy do zupełnie czego innego. To o co Ci chodzi to atrybut "naked" - funkcja z tym atrybutem w zasadzie powinna zawierać tylko assemblera. Co do plików których używasz, to ja mogę polecić jak zwykle to samo, czyli mój szablon dla STM32F1...
Witam, Mam problem z realizacją przerwania z USART3 na STM32L152RBxx. W momencie wywołania przerwania debugger zatrzymuje się na funkcji default_handler(). Poniżej umieszczam kod: main: #include "stm32l1xx.h" #include "stm32l1xx_conf.h" #include <string.h> void GPIO_Conf(void); void RCC_Conf(void); void NVIC_Conf(void);...
Jest źle. Porównaj tablicę wektorów z tą z dokumentacji mikrokontrolera - w Connectivity Line nie ma DMA2_Channel4_5_IRQHandler . Są osobne wektory dla tych kanałów.
Zamiast instalować Windowsa, to ściągnij sobie z mojej strony przykładowy projekt - weź ten dla STM32F1 albo dla STM32F4 - i na jego podstawie opracuj sobie szablon dla STM32L1. Mogę Ci nawet wrzucić kilka plików, bo kiedyś robiłem projekt na STM32L1 i mam ich kilka. http://www.elektroda.pl/rtvforum/topic13... W Twoim projekcie nie ma tablicy...
tablica wektorów tablica wektorów flash tablica wektorów przerwań
pilot toyota baterie raport spalania wyłącznik remontowy
sterowanie domem najprostrzy mikrokontroler
Docieranie silnika VW LT 2,5 po remoncie głowicy Pralko-suszarka Amica AWDG7512CL - instrukcja i specyfikacja