Witam Chciałem umieścić tablice pod stałym adresem w pamieci flash, ale nie na koncu flasha. Do tej pory robiłem to tak: wycinek z pliku linkiera dla GCC [syntax=c] MEMORY { rom (rx): org = 0x08000000, len = 192k var (rx) : org = 0x08030000, len = 64k ram (rwx): org = 0x20000000, len = 64k } .... SECTIONS { .dane : { KEEP(*(.dane)) *(.dane*) } >var...
Jak sprawdzić gdzie kompilator Keila umieścił tablice? Zadeklarowałem jedną zwykłą w RAM a drugą jako static do Flash. A chciałbym się przekonać że tak na prawdę jest. Przeglądałem plik .map ale jak wyłowić z niego potrzebne informacje? Ctrl+F w pliku map i sprawdzasz czy tablica jest pod adresem 0x08xxxxxx (flash) lub 0x20xxxxxx (RAM). Zresztą zobacz...
Istnieje szansa że tak - program po prostu postarał się przypisać adresom odpowiadające im rozkazy no i wyszedł taki oto mix [; Widać tutaj, że tablica wektorów raczej jest dobra, teraz podejrzyj Reset_Handler, a konkretnie adresy które ładuje on do "czyszczenia" .bss i inicjalizacji .data - wg pliku map Reset_Handler był pod adresem 0x08015128 4\/3!!
Niestety nadal nie pokrywają mi się wyniki. Oczywiście brałem wartość począrkową jako 0xFFFF FFFF. A jeżeli chodzi jeszcze o ustawianie DMA + CRC. W takiej knfiguracji ustawiam transmisję memory to memory, gdzie adresem docelowym jest CRC->DR. Jako Peripheral (DMA2_Stream4->PAR) jest tutaj adres w pamięci gdzie jest zapisana tablica z danymi. Inkrementowany...
W plikach ".cpp" extern "C" [syntax=c]extern "C" void SysTick_Handler(void) { GPIOA->MODER = 0; }[/syntax]
Witam Użeram się nad zmuszeniem systemu FSMC do pracy z wyświetlaczem LCD ze sterownikiem ili9320. Jak wyliczyć adresy do komunikacji z wyświetlaczem: Procesor STM32F103VE Linia CS - NE1 Linia RS - A16 Oczywiście chodzi o dwa adresy w zależności od stanu RS. Pozdrawiam Piotr Edit: Czy dobrze myślę, że to 0x6000 0000 i 0x6002 0000
- po co było rzutowanie *(__IO uint32_t*) i dlaczego adres wyliczał się błędnie Nie wiem czemu to usunąłeś, ale to jest KONIECZNE. A to dlatego, że ty nie masz skoczyć pod adres (tablica_wektorów + 4), tylko pod adres który jest zapisany w (tablica_wektorów + 4). I właśnie po to było tam rzutowanie i dereferencja wskaźnika. 4\/3!!
W EP03'2018 był artykuł z przykładami. Po co kopiować tablice do RAM, jeśli możesz się do nich dostawać bezpośrednio (po adresach) przez QSPI?
W uip też ten ból występuje, a problemem jest przekazanie gotowej ramki IP do ARP, ARP nie mając adresu IP w swojej tablicy rozpoczyna procedurę pozyskania adresu MAC, a ramkę z IP odrzuca. Może w tym jest problem. Jeśli chcesz to wykluczyć, przed wysłaniem ramki do komputera wyślij cokolwiek do STM32, żeby ten zarejestrował adres IP i MAC w swojej...
W Twoim działającym przykładzie do rejestru wpisujesz adres tablicy ("&" może być albo może go też nie być - również zadziała wg mnie), natomiast w przykładzie niedziałającym najpierw do funkcji podajesz adres tej tablicy, a potem jeszcze raz wyciągasz adres tego adresu - żeby zaspokoić Twoje potrzeby kompilator zmienną tab umieszcza gdzieś na stosie...
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!!
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ś...
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.
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.
po takiej deklaracji w sekcji .ssitag lądują wskaźniki do tej tablicy, a nie sama tablica, jak wymusic żeby całosć tam wylądowała? Musiałbyś albo w tablicy umieścić nie napisy ("...") tylko po prostu wskaźniki do tych napisów (osobnych obiektów), z których każdy miałby również ten atrybut. Druga opcja to zrobienie tablicy tablic (obecnie masz tablicę...
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...
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...
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...
1) Czy dla zmiennych o rozmiarze poniżej 32bity zawsze przydzielane jest 4 bajtowy rozmiar pamięci? To nie ma nic wspólnego z 32 bitami :) Masz wyrównywane adresy do 4 bajtów, dlatego kompilator dodał Ci w środku tablicę 3 bajtową. Jeżeli chcesz żeby taka struktura miała 9 bajtów to musisz jej nadać atrybut packed. 2) Czy stosowanie zmiennej 8 bitowej...
zostanie wysłana po i2c cała paczka danych, czy może się zdarzyć, że zostanie wysłany kawałek starej tablicy i kawałek nowej ? (w trakcie wysyłania zostaną już nadpisane dane) Czy jednak trzeba sobie jakoś samemu zapewnić to, żeby takie "zbiory" były wysyłane jako całość ? W czasie przesyłania przez DMA, możesz modyfikować zawartość, bo i tak DMA widzi...
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ł....
Witam Jak w temacie chcę połączyć dwa stm32 przez Ethernet ale bez PC, ustawić adresy statycznie, i wymieniać między nimi dane. W uip też ten ból występuje, a problemem jest przekazanie gotowej ramki IP do ARP, ARP nie mając adresu IP w swojej tablicy rozpoczyna procedurę pozyskania adresu MAC, a ramkę z IP odrzuca. Może w tym jest problem. Jeśli chcesz...
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ś...
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.
Pokaż cały kod - inicjowanie, main, Reset_Handler i tablicę adresów wyjątków. Im dłużej patrzę w te kawałki, które podsyłasz, tym więcej mam podejrzeń.
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.
Ja się pozbyłem tablicy pozwalając funkcjom przepisującym zwiekszać sobie adresy od 0 do numbofvar-1. Adresy wirtualne zrobiłem w taki prosty sposób bez udziwnien, przy których potrzebna jest ta tablica.
http://www.st.com/content/ccc/resource/t... lub znajdz funkcję static void low_level_init(struct netif *netif) i tam jest zdefiniowana tablica z adresem. Nazywa się róznie w zależności od wersji (bo to lokalna zmienna)
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...
Po pierwsze - WSZYSTKO jest w komentarzu powyżej tej tabeli, tam jest podana postać assemblerowa - jak sobie ją skompilujesz, to otrzymasz DOKŁADNIE taki sam efekt. Ja pierniczę. Nawet przeszło mi to przez myśl, ale od razu to odrzuciłem bo nie sądziłem że ktoś inny niż ja jest w stanie coś takiego zrobić. A co dopiero Ty, zwolennik uniwersalności i...
Co ty za bajki opowiadasz? to tablicy unsigned charow w flashu stm32 juz nie mozna trzymać? Co cie obchodzi szerokość słowa flash do zapisu , skoro tabelkę 'progmem' constów masz w RO? Kompilator sie martwi jak umieścić tą tablicę. Morzesz mu narzucić makefile'em region/sekcje w której chcesz mieć tą tablicę. Gdzie jest problem? To, że ci nie działa...
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.
Tak na chłopski rozum to tablica przerwań może się zaczynać tylko od adresów, które mają 7 najmłodszych bitów równe 0 i dlatego w rejestrze VTOR te bity są nie zaimplementowane. Wyszczególnienie bitu 29 jako selektora FLASH/RAM służy chyba do zaznaczenia, że np. pamięć zewnętrzna nie może służyć do przechowywania tablicy wektorów przerwań, pomimo że...
Funkcja wyświetla na LCD kolejne wartości wprowadzane do tablicy bufor, nie tylko z pod adresu bufor Ja nie rozumiem tego -> jak można wyświetlać pozycję której nie ma? Ja też tego nie rozumiem, ale wyświetla się zawsze więcej cyfr niż zadeklarowana tablica...
Niee :) Pod adresem 0x0000:0000 znajdziesz sektor w którym jest zapisana tablica partycji. Jeżeli jest prawidłowa, to musisz sprawdzić zawartość bajtów komórek z offsetem 0x01BE i 0x01C2, a z offsetem 0x01C6 masz adres (w bajtach) pierwszego sektora partycji danych czyli BootPartitionRecord (BPR), w którym dopiero masz zapisane wszystkie ważne informacje....
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).
W tym wypadku chyba najprościej będzie to zrobić tak: [syntax=c] float wspkal; uint8_t * ByteArray; ByteArray = (uint8_t *)&wspkal; i2cwrite(adr1, ByteArray[0]); i2cwrite(adr2, ByteArray[1]); i2cwrite(adr3, ByteArray[2]); i2cwrite(adr4, ByteArray[3]); [/syntax] Wtedy traktujesz to co znajduje się pod adresem wspkal, jako tablice czterech bajtów i możesz...
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!!
Jest napisane: ustaw PSIZE na 32 bity. To wpływa na sposób i czas zapisu i nie ma nic wspólnego z organizacją pamięci. W F4 pamięć zapisuje się w słowach 32-bitowych - zrzutuj wskaźnik na uint32_t na tę tablicę i zapisuj po 32 bity.
To chyba jakiś wiekowy kod, bo w tym samym pliku występowały liczby binarne zapisane z przedrostkiem 0b. Taki przedrostek to jest rozszerzenie GCC, nie wiem czemu miałoby to świadczyć o wiekowości lub niewiekowości czegoś - ktoś znał i sobie użył, bardzo wygodne. I wcale nie takie stare, bo oficjalne dopiero od wersji 4.3 (jakieś ~6 lat). Sprawa czysto...
A gdzie włączasz adc? Nie znam cuba czy tam innega mx'a, ale gdzie i jak konfigurujesz adc? Chyba przy inicie DMA powinien być adres adc podany, chyba że masz inny kanał dmą piszący do tych buforów? Jakoś może weź to blokowo rozrysuj jak to ma działac. Może zamiast adc wklep tablice np. sinusa I wysyłaj tego sinusa i patrz czy wychodzi z daca i czy...
Prawdopodobnie nie włączyłeś przerwania odbioru danych w USART - bit RXNEIE w rejestrze CR1. A poza tym . oczekiwanie w procedurze obsługi przerwania to nie jest dobry pomysł, a właśnie to robisz. Masz poniżej tablicę do zainicjowania USART z przerwaniem odbioru w STM32F0 - adresy rejestrów i ich zawartości - wychodzi to sporo krócej niż przy użyciu...
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...
Jeszcze nie pracowałem na procesorach STM32 (co zmieni się jutro), ale z tego co już wyczytałem, to: - w pamięci PMA (widocznej przez okno zaczynające się od 0x40006000) musi znajdować się tablica BTABLE oraz bufory na dane - (ad3) wartość wpisana do BTABLE to offset wewnątrz pamięci PMA, pod którym zaczyna się tablica deskryptorów buforów. EPnTxAddr...
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.
cześć takie dwie sprawy. 1. Zakładając że mam zadeklarowane dwa takie ciągi znakowe [syntax=c]char *str1 = "string numer 1"; char str2[] = "string nr 2";[/syntax] oraz jakąś funkcję która wysyła przekazany ciąg znaków dla przykładu na RS choc może być to jakiś LCD [syntax=c]void wyslijRS(char * ciag);[/syntax] z tego co rozumiem to str1 jest ZMIENNĄ...
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...
O wskaźnikach kolega słyszał? Jak najbardziej słyszał i używał jednakże w tym przypadku wg. mnie wskaźnik będzie miał identyczne zastosowanie jak tablice. Potrzebny podwójny wskaźnik, który mógłby być zwracany z jakiejś funkcji, jednakże należy zauważyć, że wartości tablic są stałe, więc tworzenie wskaźnika, dynamiczna alokacja a następnie wypełnienie...
To za mało - w RAM musiałaby się znaleźć tablica adresów procedur obsługi wyjątków oraz wszystkie funkcje wołane z procedury przerwania (np. SPL). Moim zdaniem problem leży gdzie indziej, np. w źle napisanej obsłudze przerwań UART lub w grubszym błędzie koncepcyjnym.
Nie ma danych pod adresem tej tablicy w pliku wynikowym HEX (w sensie że plik HEX w ogóle nie zawiera takiego adresu). W pliku map tablica się pojawia (tzn. jest po prostu określony jej adres).
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...
stm32 tablica stm32 tablica wskaźników stm32 tablica wskaźnik
dźwięk android głośnik zwalnia komputer pralka whirlpool czerwona dioda
pilot bramy zasięg odbiornik superreakcyjny
Jak wyłączyć Eco Power w Philips FWC170? Dekoder Zgemma, Vu+, Amlogic – samoczynne wyłączanie i restart, przyczyny i diagnostyka