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 myślę, że rozwiązaliśmy problem dostatecznie go podsumowując, także zamykamy. A ja dziękuję za zagorzałą :) dyskusję. Pozdrawiam. Temat okazał się być niedostatecznie rozwiązany gdzyż funkcje nie działały poprawnie. A oto 100% działające kody do obsługi flash: Wyłączenie zabezpieczenia zapisu wybranych oczywiście grup stron : [syntax=c]if((GPIOA->IDR...
"Rejestry GPIO" to nic innego jak adresy w pamięci. Operuj adresami, a nie nazwami. Makra najprawdopodobniej będziesz musiał napisać sobie sam.
Jak już korzystasz z bibliotek ST to masz chociażby funkcje: FLASH_Status FLASH_ProgramHalfWord(uint32_t Address, uint16_t Data) i FLASH_Status FLASH_ProgramWord(uint32_t Address, uint32_t Data) Operując na wskaźnikach możesz tam zapisać zmienne dowolnego typu, czy całe struktury.
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...
czy też muszę użyć trzech liczników? Procesor mam na płytce typu STM32F100RB. Nasuwa mi się pytanie czy w ogóle potrzebujesz to zrobić na timerach. A nie po prostu użyć przerwań od zboczy na pinach (EXTI). Typowo czas martwy G-M podawany jest rzędu 100µs, czyli nawet jak na wolny F100 jest to mnóstwo czasu i nie ma ryzyka zgubienia impulsów. Co...
Ok, zrobię ja albo na poczatku, albo na koncu flasha Dodano po 1 Tak się nie da. Chyba, że kod programu zostanie podzielony na dwie sekcje i jedna będzie umieszczona przed tablicą a druga za tablicą. A jak zastosowac sekcje np. dla całego pliku, żeby nie definiowac przy każdej zmiennej? Ty się lepiej najpierw zastanów czy na pewno chcesz to zrobić.
Maskujesz błąd błędem. Najpierw zrozum, co się dzieje w Twoim kodzie. while((SPI1->SR & SPI_SR_BSY) == 0) - to znaczy "powtarzaj tak długo, jak długo SPI nie pracuje (bo skończył transmisję)". Kiedy wyjdziesz z tej pętli? Co masz w niej powtarzać? To się kupy nie trzyma. Wciąż podejrzewam jednak, że oprócz tych 10 błędów masz jeszcze jedenasty...
extern należy dodać wtedy gdy dołączamy ten sam plik .h kilka razy (zresztą kompilator nas o tym uprzejmie poinformuje). Wskaźnik jest zmienną wskazującą na dane w obszarze flash i jest umieszczony w RAM'ie'. Wskaźnik może wskazywać również na dane w RAM'ie.
Ja w takich przypadkach stosuję metodę którą na swoje potrzeby nazwałem "split objects". Obiekt u mnie składa się po prostu z dwóch części - stałej i zmiennej. Zwykle "główny" obiekt jest stały, a ten "zmienny" fragment jest podrzędny, jednak są sytuacje w których robię to odwrotnie, głównie wynikające z polimorfizmu lub dlatego że łatwiej/lepiej jest...
Witam, Wiem, pytanie bardzo podstawowe ( dopiero raczkuję ) ale naprawdę coś nie mogę odnaleźć odpowiedzi w jaki sposób odczytać zawartość bajtów (bezpośrednio z pamięci) zmiennej strukturalnej? wszystkie moje pomysły nie podobają się kompilatorowi.
Witam, Kiedyś miałem bardzo podobny objaw i okazało się, że jedna zmienna nie była zainicjalizowana, w związku z czym przyjmowała losowe wartości, ktore zmieniały się w zależności od położenia zmiennej w pamięci mikrokontrolera - na skutek dopisywania dalszych częsci programu to miejsce zmieniało się. I raz program działał dobrze, a raz szedł w maliny...
volatile ma wiele zastosowań, ten kwantyfikator jest traktowany jako side effect przez co kompilator nie może kawałka kodu w pełni zoptymalizować (np zapisywanie danych w pętli for nie może być zastąpione przez memcpy) Użycie zmiennej const volatile nie ma sensu, const volatile może nieść tylko informację dla programisty, że w danym kawałku kodu, nie...
odpisałeś w trakcie edytowania przeze mnie pierwszego posta. Użycie zmiennych pomogło na błąd debuggera lecz problem tego samego adresu pozostał. Co ciekawe, podglądając pamięć okazuje się że wartości inicjalizacji są zapisane do pamięci prawidłowo. Problem polega na przypisaniu złych adresów do wyrażeń słownych określających zmienne. Nie bardzo orientuje...
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...
Nie znam tej biblioteki, pół minuty temu pobrałem jej źródła, ale z tego co patrzę, to struktura FILINFO zadeklarowana jakoś tak: [syntax=C]// FatFS R0.08b, ff.h typedef struct { DWORDfsize; /* File size */ WORDfdate; /* Last modified date */ WORDftime; /* Last modified time */ BYTEfattrib; /* Attribute */ TCHARfname[13]; /* Short file name (8.3 format)...
W przypadku wciągnięcia śmieci ze zmiennej automatycznej dostajemy przewaznie, kolokwialnie mowiac, syf, nie zero. To samo dotyczy nie zainicjalizowanego statica w funkcji. Już to przerabiałem z powodu 'zapomnienia' zainicjalizować strukturki do liczenia CRC. Problem polega jedynie na pomyleniu adresu zmiennej / rejestru z ich zawartością. Oj polega....
Do czego używać tą pamięć? Stos czy jakieś zmienne. Kod tylko w SRAM1 (nie do końca, sprawdź wypowiedź kolegi Freddie Chopin niżej), dane mogą być gdziekolwiek.
Okazało się, że podszedłem do tematu z niewystarczającą wiedzą. Przed każdym zapisem, należy określony sektor wyczyścić instrukcja Sector Erase. Chcialbym móc kasować pojedyncze komórki i aktualizować tam niektóre dane, jednakże pamięci flash tego nie umożliwiają, cóż coś za coś. Może uda się niektóre zmienne zapisywać do flashu procesora. Coś wymyślę,...
Stawiam na różne adresy kodu w pamięci Przecież adresy są takie same. Adresy używanych zmiennych zresztą też.
Uruchomiłem kod, który wkleiłeś. Dopisałem tylko definicje dla Bank_NAND_ADDR ( 0x70000000 ), CMD_AREA ( 0x00010000 ), ADDR_AREA ( 0x00020000 ) i DATA_AREA ( 0x00000000 ). W funkcji FSMC_NAND_ReadID() pominąłem zapis do struktury i odczytuję zmienną data - mam w niej prawidłowe dane. Dodano po 8 Może nie włączyłeś taktowania dla FSMC? Ja mam to w innej...
Dziękuję za wyczerpujące wyjaśnienie. Rozwiązało mi to problem w paru rzeczach, z którymi się borykałem. Co do wpisywania struktury w pamięć wreszcie udało mi się to zrobić tak jak opisuje ten temat. Funkcja load co prawda przypisuje tej zmiennej zadeklarowany adres, ale już nie wpisuje tam wartości przypisanych w definicji zmiennej. Wpisanie do flasha...
OK, działa :-) Dzięki serdeczne. Inicjalizację FSMC dałem na samym początku, gdyż pierwotnie "chciałem" tam też mieć zmienne globalne (a w wewnętrznej pamięci sam stos) i inaczej by się nie inicjalizowały, ale obecnie jest to mało istotne.
Coś naplątałeś... Aby uzywać malloca bez dziwnych errorów, musisz zadeklarować odpowiednią ilość miejsca na stertę . Co z tego, ze twoje zmienne zajmują niewiele ramu, skoro najpewniej ustawiles sobie parę kB sterty, i gdy przekroczysz te pare kB, program ci sie natychmiast wykrzaczy, bo oczywiście najpewniej nigdy nie sprawdzasz, czy malloc przypadkiem...
Witam, Mam pewne pytanie dotyczące zmiennej globalnej wyspecyfikowanej jako const. Taka zmienna nie może zostać zoptymalizowana i jest trzymana w sekcji nazywanej .rodata, która to znajduje się w pamięci FLASH. (W mikrokontrolerach stm32) W takim razie jeżeli zadeklaruje np. tabelicę: [syntax=c]const uint8_t tablica[1000]; [/syntax] to oznacza, że taka...
Takich rzeczy się nie da debugować zdalnie. Generalnie technika jest taka że się eliminuje problem po problemie. 1. Zobacz w debugerze czy trafia to do pamięci tam gdzie chcesz. 2. Zrób tablicę z danymi testowymi i po prostu wyślij to do DAC-a I tak po kolei eliminuj zmienne z równania. Innej medoty nie ma.
Tworzysz sekcję, sekcje umieszczasz w odpowiedniej pamięci, a zmienne w tejże sekcji. 4\/3!!
Od kilku dni testuję nowe środowisko Crossworks v.2.0 for ARM z układami STM32. Równolegle pracuję w środowisku Ride7 i wszystko w nim działa bez problemu (wierzchołek stosu jest zawsze daleko w pamięci od zmiennych globalnych) W Ride7, stos układów STM32 jest ustawiany bezpośrednio po resecie na wartość 0x20000000 + rozmiar RAM co w moim przypadku...
Przypadkiem :) Jeśli bufory są zmiennymi globalnymi, sizeof zwróci Ci rozmiar tablicy pomnożony przez wielkość typu tej tablicy. Jeśli przekazujesz je przez parametr, cóż... sizeof zwróci Ci liczbę 4. W Twoim przypadku zadziałało, bo to pewnie zmienne globalne, a DMA bez sensu kopiuje 4x więcej danych (jakieś śmieci z jednej części pamięci do drugiej...
U mnie w kodzie nie ma ...... /* * sterownik dla Margas * wersja dla NUCLEO STM32F446RE * działa dzieki życzliwości i zaangarzowaniu członków forum ELEKTRODA * wspomagających moją skromną wiedzą programistyczną * za co jestem im bardzo a to bardzo wdzęczny * data xx-xx-2024 */ #include "STM32TimerInterrupt.h" #include "STM32_ISR_Timer.h"...
Po prostu za mało pamięci dla tablic rezerwujesz. Pamiętaj że jak chcesz przechować 4 znaki to tablica powinna mieć 5 elementów (ostatni znak: NULL - \0 )
Yup. A potem jeszcze sekcję na ta pamięć. I zmienne które chcesz mieć w tej pamięci musisz opatrzyć atrybutem umieszczającym je w tej własnie sekcji. Może też skorzystać np ze wskaźników, jeśli tak jest komuś wygodniej. 4\/3!!
Ok, kod jest prawidłowy, to problem odczekania kilku taktów zegara po włączeniu.
Mnóstwo instrukcji assemblera nie może być wykonanych w jednym cyklu zegara... w sumie wszystkie wykonywane są w tej samej liczbie i zależy ona od PIPELINE'u... pobranie instrukcji, dekodowanie, wykonanie, zapis do pamieci, akumulacja wyniku. To jest taki najprostszy pipeline i umożliwia on właśnie wykonywanie instrukcji w "jednym" cyklu zegara.......
bez apelacyjne operator extern powinno się tam znaleźć. To zleży jak przebiega proces kompilacji. Jeżeli kompilujemy wszystkie pliki na raz to w sumie ta dyrektywa o której wspominasz działa tak jak oczekujesz i rzeczywiście zmienna jest zadeklarowana tylko raz. Natomiast jak kompilujemy każdy plik źródłowy osobno do postaci pośredniej i później linkujemy...
Pytanie po co uzywasz HIDa skoro postawiles komunikacje na libusb? Uzywanie interrupt endpointów nie wymaga od razu wykorzystania klasy HID. Ja mam tak: 0 - control 1 - ep bulk in 2 - ep bulk out 3 - ep interrupt in 4 - ep interrupt out 5 - ep isoc in Moje urządzenie ma się nijak do klas zdefiniowanych przez standardy, wszystko jest vendor specific,...
Przykładów można szukać w SPL - można się w ten sposób dowiedzieć, w których rejestrach i co trzeba wpisać. Powoli szykuję tutorial do STM32 bez biblioteki, ale to jeszcze trochę potrwa. Kłopoty z bibliotekami są wielorakie. Ostatni kłopot - to to, do czego nas zachęcają przykłady z użyciem bibliotek, czyli deklarowania struktur jako zmiennych i pracowitego...
Strona ST. Emulacja eepromu.
If the peripheral is mapped on AHB: the delay should be equal to 2 AHB cycles. To może być to, zaraz sprawdzę. Dodano po 15 Tak, to jest to. Zaraz po uruchomieniu zegara nie wolno wpisywać lub czytać tej pamięci. Aż dziw że do tej pory tak intensywnie używana ta pamięć nie zbuntowała się. Po wstawieniu kilku taktów opóźnienia po włączeniu zegara, wszystko...
Freddie rozumiem, ze korzystasz z gcc i nieużywane sekcje wyrzuciłeś? Ja to rozwiązanie stosowałem jeszcze z TrueStudio i poza zwiększeniem rozmiaru o tego stringa nic mi nie "urosło" ;] No chyba, ze sposób kolegi m.ki coś tam zmienia, ja jak to rozgryźć doszedłem analizując źródła stdlib i po drodze nie natrafiłem na żadne dynamiczne alokowanie pamięci....
Teraz jest taki problem. Jutro spróbuję poszukać pliku. Arduino:1.8.9 (Windows 10), Płytka:"Generic STM32F1 series, BluePill F103C8, STM32CubeProgrammer (SWD), Enabled (generic 'Serial'), None, Low/Full Speed, Smallest (-Os default), Newlib Nano (default)" A subdirectory or file sketch already...
W skrypcie linkera po prostu stwórz nową sekcję umieszczoną w konkretnych miejscach. Tutaj przykład z wydzielonymi dwoma ostatnimi stronami pamięci: MEMORY { rom (rx) : org = 0x08000000, len = 128k - 2k rom_p126 (r): org = 0x08000000 + 126k,len = 1k rom_p127 (r): org = 0x08000000 + 127k,len = 1k ram (rwx)...
Dane wpisane do tego skryptu zakładają, że nie korzystasz z ŻADNYCH wyjątków. Musisz sobie je ustawić w zależności od swoich potrzeb. __irq_stack_size = 0; Czyli po wejściu w przerwania mam dostępne 0 pamięci ram na zminne? W skrócie: Funkcji ustawiającej stosy przekazane jest 0 dla trybu XXX, a więc (w zależności od kolejności) dany stos będzie pokrywał...
Obecnie korzystam z STM32F030F4P6. No to nie masz dużego wyboru. Jeśli masz tych zmiennych nie więcej niż kilkadziesiąt, to wystarczy jeśli zajmiesz na eeprom dwa obszary 1k. Czyli stronę 14 i 15 a PAGE_NB_PVP ustawisz na 1. Jeżeli chciałbym, by EEPROM zapisywał mi od strony załóżmy 15, to wtedy ta linijka kodu przyjmie taką postać?: #define EEPROM_START_ADDRESS...
A nie można po prostu zapytać autora, co ma na myśli pisząc o "wielu zmiennych"? ;) To ma być orientacyjny szacunek ich liczby w kodzie, czy jakieś konkretne oszacowanie zużycia pamięci na podstawie planowanego programu?
A właśnie, że jest sposób na efektywne wykorzystanie DMA przy odbiorze, nawet dla zmiennej długości ramek. Wystarczy ustawić przerwanie od stanu IDLE dla kanału szeregowego U(S)ART, które generowane jest po zakończeniu transmisji. W tym momencie wszystkie dane są już w zdefiniowanym w DMA obszarze pamięci.
Wnioski są proste: wszystko, co jest zadeklarowane na poziomie zewnętrznym z atrybutem const i wszystko, co jest zadeklarowane wewnątrz procedur z atrybutami static const ląduje tylko w pamięci nieulotnej (o ile ktoś nie zaszalał ze skryptem konsolidatora). Oczywiście należy przy okazji mieć świadomość tego, jak należy użyć const w C deklarując stałą...
Podejrzyj kod asemblera i zobacz czy na pewno wykonują się zmiennoprzecinkowe instrukcje. U mnie dodatkowo trzeba było włączyć optymalizację oraz podlinkować libm i libg z katalogu fpu kompilatora i tak zauważyłem, że sporo zależy właśnie od wersji kompilatora. Mnożenie wykonuje od razu sprzętowo ale do pierwiastkowania trzeba go zmusić. A pozwolę też...
Już zgłupiałem. Niemniej jednak fizyczny zapis dokonywany jest po 4 bajty na raz jeśli ustawiłeś zapis 32-bitowy. Więc: mam w buforze daną o wartości 0xAB <- 1 bajt. Zapisuje ją pod adres = 0, więc komórki od 0 do 3 zawierają 0x000000AB tak? Następna zmienna powiedzmy 0xCD zostaje zapisana pod adres 4. I komórki od 4 do 7 zawierają 0x000000CD. Więc...
Nawet nie trzeba pisać całego menagera pamięci, wystarczy poprawić funkcje free/malloc/alloc/realloc tak, aby zmieniały wartość zmiennej globalnej określającej wielkość wolnego obszaru sterty - w c++ właściwie wystarczyłoby pokryć operatory new i delete oraz new[] i delete[]. Z drugiej strony wobec istnienia stosu na niewiele to by się zdało.
Aby wyjaśnić Ci Twój problem, podaję Ci metodę "czytania" typów zmiennych, który wyjaśnia wszystko. Jest kilka zasad: 1. Czytanie zaczynamy od nazwy zmiennej 2. Czytamy w prawo dopóki nie dojdziemy do "końca", po osiągnięciu "końca" czytamy w lewo od nazwy zmiennej 3. Obowiązują nawiasy, które są "lokalnymi końcami" Tak więc: const char * const l_wartosc[]...
Skonfigurowałem TIM1 do sterowania jasnością. Tak jak zalecił kolega BlueDarco chciałem zapalać segmenty przy końcu okresu (update) i gasić przy CC1. Na początek chciałem wygenerować przebieg o wypełnieniu 50% wiec: Zgodnie z RM przy TIM1_CH1 może pracować DMA1Channel2, a do TIM1_UP DMA1Channel5: https://obrazki.elektroda.pl/3207967500_...
Witam. Mam 2 problemy które wynikły w czasie mojej zabawy z ARM. Mam nadzieję że ktoś mi podpowie co jest nie tak. Mam dwie funkcje które pod AVR działały bezbłędnie a pod ARM już nie do końca chcą funkcjonować. Wypunktuję te problemy. 1. Funkcja "SD_writeSingleBlock" z biblioteki do obsługi karty SD ze strony darhmanitech.com. Funkcja: http://obrazki.elektroda.pl/1642057700_1...
Przepisanie zmiennej do zmiennej jest na ARM atomowe jeśli zmienne te są 32-bitowe lub mniejsze (pomijamy dziwne akcje typu pakowanie struktur itd.). Jeśli zmienna jest większa, to musisz dodać sekcję krytyczną (np. blokować przerwania). Przepisywanie po jednym bicie przy użyciu bitbandingu na pewno nie będzie atomowe - wręcz przeciwnie (; łał czyli...
Mam prośbę-czy mógłbyś zerknąć na stronę 14-tą gdzie jest tabelka którą nie wiem jak rozumieć, czy wynika z niej pojemność czy nie? śli chciałbyś zapisać 2000 dwubajtowych niezależnych elementów, to ta emulacja eepromu się nie nada - potrzebowałbyś przecież 2000 x (2 + 2) = ~8kB, a tam pojemność ograniczona jest przez rozmiar strony (1 lub 2kB - zależnie...
Jakie tam na przykład bugi występują? W różnych funkcjach - różne traktowanie osi X i Y, różne typy tych samych zmiennych. We funkcjach tego samego typu - np rysowanie - raz wykonanie bezpośrednio przez pisanie do pamięci, raz przez funkcję typu putpixel, któr robi to samo co pisane do pamięci, ale w kilku niepotrzebnych krokach/makrach; w jednych...
Witam, czy ktoś z forumowiczów wie jak umieścić w pamięci flash tablicę z wartościami przeskalowanego sinusa (wartości stałoprzecinkowe). Chcę, aby tablica miała np. 1024 elementów (od 0 do 2pi) dla tego zapis na sztywno wartości będzie nie wygodny. tj. [syntax=c]const s16 tab_sin[1024] = {wartosci}[/syntax] Wolałbym zapis: [syntax=c]const s32 tab_cos0[1024]...
Witam, Mam urządzenie którego sercem jest mikrokontroler STM32. Chciałbym, w pierwszej fazie uzyskać możliwość podgląd stanu pracy urządzenia przez internet (strona internetowa, aplikacja na tel), natomiast w kolejnej sterowanie tym urządzeniem. Urządzenie wyposażyłem w ESP8266 i nawet udało mi się zapisywać z mikrokontrolera poprzez ESP8266 wartości...
(assignment makes integer from pointer without a cast Przetłumacz sobie to na polski: "operator przypisania powoduje zmianę wskaźnika na wartość całkowitą bez rzutowania" i chyba jest jasne w czym jest probiem? `*(__IO uint16_t*)(Page_127 + i)` - abstrahując od tego czy jest to poprawne, jest to "komórka w pamięci reprezentująca wartość typu uint16_t",...
Funkcja taka powinna przyjmować wskaźnik na "const char*", skoro i tak go nie zmienia (wiem że go nie zmienia, bo jakby próbowała, to byś miał zwiechę przy stringach z flasha) i wtedy problemu nie ma. Taki dobry nawyk (; Jeśli "parametr wskaźnikowy" nie jest modyfikowany, to powinien być const i tyle. Kompilator czepia się całkiem słusznie, bo zakłada,...
Szkic używa 13532 bajtów (20%) pamięci programu. Maksimum to 65536 bajtów. Zmienne globalne używają 2824 bajtów pamięci dynamicznej. maple_loader v0.1 Resetting to bootloader via DTR pulse Reset via USB Serial Failed! Did you select the right serial port? Searching for DFU device https://obrazki.elektroda.pl/3904104400_... Nie mogę...
kombinuję też, że może za późno wywołuję funkcję fpu_enable()? W sumie to przed nią tworzy się obiekt IMU. To mogłoby mieć znaczenie tylko jeśli konstruktor tego obiektu w jakiś sposób robi coś "zmiennoprzecinkowego". Jeśli tylko zeruje zmienne w pamięci, to raczej bez znaczenia. Jednak gdy robię to tak: W pliku .cpp ta funkcja musi być zdefiniowana...
Biblioteki to jeden ze sposobów na pisanie kodu. Z tego co widziałem na forum to właśnie jest to sposób na szybki start, a krytyka jest związana raczej z nieumiejętnym korzystaniem z biblioteki w tym również w przykładach. Za przykład podam tutaj przykład GPIO - IO Toggle (stm32f4_dsp_stdperiph_lib). Definicja zmiennej GPIO_InitTypeDef GPIO_InitStructure;...
No jeszcze zapomniałeś o przełączaniu tablicy wektorów - każda aplikacja musi mieć swoje, więc przed skokiem warto też przestawić ten adres. No i po co te zmienne są globalne? Dlaczego tak? Zakładam, że nie chodzi Ci po głowie pomysł aktualizacji tylko CZĘŚCI programu, no nie? To byłoby praktycznie nierealne, bo zmiana kompilatora (na nowszy, starszy,...
Dzięki DXFM za odpowiedź :) Tzn. wiem i potrafię zadeklarować tablicę na sztywno w pamięci FLASH - z tym jest wszystko ok. Ale mnie chodzi o coś takiego: mam pewną funkcję, która w swoim argumencie ma zmienną - może ona być modyfikowana przez użytkownika (coś w stylu sin(a*x), gdzie a jest tą zmienną od usera). Teraz... wyliczam np. 512 wartości funkcji...
Pierwsza opcja to oczywiście zdefiniowanie NAPRAWDĘ DUŻEGO stosu, ale to średnie rozwiązanie jak wiadomo [; Do rozbudowanej aplikacji na ARMa myślę że należy liczyć minimum 1kB, jeśli używa się jakichś potwornych funkcji standardowych (printf!) i to głęboko to lepiej zaopatrzyć się w 2kB (o apetycie tych funkcji na pamięć pisałem ostatnio http://www.elektroda.pl/rtvforum/topic13...
Zmienne globalne zajmują...... Pewnie ram dla led jest rezerwowany w chwili uruchomienia biblioteki przez memalloc. Gdybyś sam pisał obsługę led to użyłbyś tablicy o określonym rozmiarze dzięki czemu wiedziałbyś ile ram zajmuje program. Poszukaj jak wyświetlić ilość wolnej pamięci ram w czasie działania programu. Jakiś freemem jest. Trochę oszuka ale...
Miałem na myśli to że w twoim przypadku analogowa obróbka sygnału nie ma sensu, wartość RMS trzeba sobie policzyć na uC. Niby są scalaki konwerterów RMS, ale w cenie takiej że kilka wydajnych mikrokontrolerów byś za to kupił. Drugie rozwiązanie to bezpośrednio mierzyć napięcie zmienne przez STMa odpowiednio szybko próbkując aby uzyskać przebieg sygnału...
Witam, Stanąłem przed koniecznością użycia w moim projekcie pamięci zewnętrznej AT45DB321D. W pamięci tej przechowywane mają być wyniki odczytu z przetwornika AD czyli zmienne 12 bitowe. Razem około 8 tysięcy odczytów. (?) Z pomocą przykładów znalezionych w sieci uruchomiłem obsługę w/w pamięci przez sprzętowy SPI. Mogę odczytać status pamięci, zapisać...
Ok, zrobiłem to. Ale teraz pytanie jak zamienić zawartość pamięci na tablice liczb taką jak pokazana jest na rysunku ?? Bo na razie to wygląda tak http://obrazki.elektroda.pl/8715226000_1... a chciałbym żeby to była tablica licz od -32768 do 32768 tak jak w buforze.
Witam! Tworzę projekt, który polegać ma na bezprzewodowym połączeniu STM32F303 Discovery i HC-05 z ELM327 (wersja bluetooth). Jestem bardzo początkujący, jeśli chodzi o programowanie a zależy mi na tym projekcie, dlatego postanowiłem zwrócić się o pomoc. Korzystam z STM32CubeMX oraz Eclipse z wbudowanym rozszerzeniem „System Workbench for STM32”....
(at)grko - właśnie do mnie dotarły blue pill :) 128KB flash (tzn. oficjalnie 64, ale akurat mają w rzeczywistości 128KB) i 20KB RAM. Teraz z ciekawości wgrałem ST-Linkiem prosty blink ;) Szkic używa 13028 bajtów (19%) pamięci programu. Maksimum to 65536 bajtów. Zmienne globalne używają 2816 bajtów (13%) pamięci dynamicznej, pozostawiając 17664 bajtów...
A ja zadam "głupie" pytanie: próbowałeś po prostu wpisać zmienną do View->Watch1 (oczywiście w trybie debugowania)? Jakoś nigdy nie miałem kłopotu (z poziomu Watch table ) z odczytem wskaźnika jak również z zapisem i odczytem komórki pamięci na jaki wskazuje.
Doświadczenie uczy mnie, że dyskusja o wyższości 8bit nad 32bit (czy odwrotnie) będzie trwała tak długo, jak długo obydwa rodzaje procesorów będą dostępne. mam wiaderko AVR-ów i podobne wiaderko ARM-ów, głównie STM32 choć też LPC. Znajdą się też malinki czy wcześniejsze dwurdzeniowe A20. Jak pewnie większość (przynajmniej tych starszych) zaczynałem...
Poza stosem w SRAMie masz jeszcze przynajmniej: - stertę - dynamiczna alokacja (malloc, new) - sekcję data - wszelkie globalne i statyczne zmienne inicjowane jakąś wartością - sekcję bss - jw. ale zerowane przy starcie programu poza tym możesz sobie tworzyć własne sekcje, latać wskaźnikiem po pamięci i cokolwiek Ci przyjdzie do głowy. Alokowanie dużej...
Witam wszystkich. Korzystając z okazji życzę wszystkim szczęśliwego nowego roku. Przechodząc do problemu, z którym nie potrafię sobie poradzić to posiadam zestaw HY-Mini STM32 i potrzebuję napisać obsługę kart sd przez sdio, a konkretnie chcę zapisywać plik txt (jeśli jest to możliwe lub inny możliwy do odczytania na komputerze) na kartę pamięci. W...
Bit band ? Stwórz sobie plik bitband.h [syntax=c]#ifndef BITBAND_H_ #define BITBAND_H_ #define bitband_t *(volatile unsigned int *) #define BITBAND_SRAM_REF 0x20000000 #define BITBAND_SRAM_BASE 0x22000000 #define BITBAND_SRAM(address,bit) ((BITBAND_SRAM_BASE + (((unsigned int)address)-BITBAND_SRAM_REF)*32 + (bit*4))) // Convert SRAM address #define...
I znów seria błędnych sugestii. W praktyce JTAG/SWD w STM32 przy realnym połączeniu programatora z płytką może odmawiać współpracy nawet przy 1 MHz (nawet na płytkach Discovery). Za inicjowanie zmiennych jest odpowiedzialny wiarygodny, zweryfikowany przez tysiące programistów, moduł startowy. Nic nie trzeba pilnować (przynajmniej w Keil, Atollic i paru...
Bezedura.. Keil i może potrafi wykryć takie coś, jednak nie GCC. No faktycznie, po próbach z GCC, przyznaję Ci rację, że nie jest w GCC tak prosto i wygodnie ze zmiennymi absolutnymi, jak mi się wydawało po praktyce w Keil. Ale pewnym prostym wyjściem może być zdefiniowanie buforów w sposób podobny jak tu: [syntax=c]unsigned char __attribute__((section...
Próbuję zaprogramować obie płytki, z tym że F103 była już programowalna, miałem wgrany bootloader od Maple Mini i śmigało to dobrze do momentu aktualizacji menedżera płytek. Teraz na nowych ustawieniach nie chce to współgrać ani ze starym bootloaderm (Maple), ani z nowym z tego wątku: https://github.com/Serasidis/STM32_HID_B... Z kolei...
Nikt Ci tu nie pisał o autonomicznych robotach, a wiele wątków analogicznych do Twojego kończyło się decyzją delikwenta o zakupie taniej płytki z jakimś np. STM32, więc wszystko jest jak najbardziej na temat. Co do prostoty - dla początkującego zapewne "prosty" jest taki mikrokontroler, w którym działający program możesz debugować na ekranie PC, zaglądając...
To może pytanie, czy debugerem moge zastawiać pułapki na dostęp do zmiennych? Nie wiem czy konkretnie do zmiennych, ale na pewno można ustawić pułapkę na przestrzeń pamięci jeśli zostanie zmodyfikowana (nawet zaznaczyć jaka dokładnie będzie to wartość), co jest dość przydatne gdy podejrzewa się że jeździ się po za pamięcią. Teraz mi się przypomniało,...
1. Dynamicznej alokacji pamięci używaj wtedy gdy potrzebujesz dużej ilości pamięci przez określony czas. Jak pamięć nie jest Ci już potrzebna to ją zwalniasz. Jeżeli masz jakieś zmienne, które używasz przez cały czas działania programu to malloc nie ma sensu. Zmienna statyczna zadeklarowana w funkcji ląduje w tym samym obszarze pamięci co zmienne globalne...
Ok, a konkretnie, które z wymagań standardu nie zostanie spełnione, jeśli zmienna lokalna liścia z atrybutem volatile i bez odwołania przez adres zostanie zrealizowana w rejestrze, a nie w pamięci? No ale we fragmencie który zacytowałem nie ma rozróżnienia, czy dotyczy on tylko zmiennych globalnych, czy może tylko lokalnych, więc definitywnie sensownym...
Zawsze pierwszym etapem dociekań powinno być zmniejszenie ilości zmiennych. Zignoruj więc Eclipse, GDB itd, spróbuj po prostu połączyć się z układem za pomocą OpenOCD oraz telnetu, spróbuj go zaprogramować tym sposobem i zobacz czy to działa. Jeśli tak - idź dalej, jeśli nie - coś jest z układem. Czasem pomaga "zdjęcie" zabezpieczeń pamięci przy użyciu...
Witam serdecznie. Mam takie pytanko. Potrzebuję zapisywać pewne wartości z mikrokontrolera stm32 do zewnętrznej pamięci nieulotnej w razie wyłączenia zasilania. Znalazłem na stronie forbota przykład z pamięcią EEPROM (układ 24AA01),gdzie ilość cykli zapisu wynosi 1000000. I teraz pojawia się moje pytanie, czy ten milion zapisów jest na całą pamięć czy...
Nie do końca kotlet, tutaj chodzi o zmapowanie poszczególnych bitów pamięci w jakiś inny jej rejon więc to jest zupełnie inny mechanizm. Poza tym, kto Ci każe odwoływać się do wszystkich ? :D Bierzesz tylko te, które Cię interesują i tyle, poza tym sam przyznasz, że zapis jest bardziej przyjemny (np LED_GREEN = 1 zapala diodę). Na AVR też da się ustawiać...
Hard Fault jest podczas czytania czy podczas zapisu? Jakoś trudno mi uwierzyć w błąd podczas czytania. A próbowałeś rozbić operację na odczyt do zmiennej tymczasowej i zapis do rejestru? Czy jesteś pewien, że zapisywana wartość jest zgodna z parametrami pracy pamięci vs. częstotliwość taktowania rdzenia?
Czy wystarczy utworzyć sekcję w taki sposób, powtarzając ten wpis dla każdej sekcji, czyli d1sramdata, d2sramdata, d3sramdata? Nie. Albo inaczej. Sekcje zostaną utworzone i jeśli przypiszesz do nich jakieś zmienne, to one tam wylądują, ale aby dane zostały zainicjalizowane domyślnymi wartościami (a'la sekcja .data) lub wyzerowane (a'la sekcja .bss),...
Witam, Chciałem przerobić skrypt linkera i startup.s z projektu Freddiego Chopina stm32_blink_led na kopiowanie i uruchamianie aplikacji z pamięci RAM. Dodałem do sekcji .text analogiczne wpisy jak w sekcji .data udostępniające zmienne __text_init_start, __text_start oraz __text_end. .text : { . = ALIGN(4); __text_init_start = LOADADDR...
watchpointa postawilem juz dluzszy czas temu, wnioski są bezużyteczne. Jakaś część RTOSa nadpisuje tamto miejsce. Problem jest raczej dlaczego nadpisuje; i dlaczego tylko w tej funkcji... Dodatkowym zonkiem jest fakt, ze nie da sie podczas pracy RTOSa zatrzymac rdzenia i go ponownie puścić - procek ląduje w hardfaultcie po puszczeniu; nawet jak jest...
Witam :) Chce zapisać zmienną do pamięci EEPROM w procesorze. Testuje peryferia dynamicznie i nie wiem co się z nimi dzieje w trakcie działania. Wysyłają do mnie dane po USARCIE i chciałbym je zapisywać w wewnętrznej pamięci. Znalazłem realizacje zapisu, lecz wszędzie bazuje się na bibliotekach HAL, których nigdy nie używałem i się przekonać nie mogę....
Nie do końca to dobrze zrozumiałeś... Ten cały "adres wirtualny" to jest IDENTYFIKATOR danych. Jeśli masz swoje 10 "zmiennych" w takim "EEPROMie", to mają one dziesięć STAŁYCH identyfikatorów ("wirtualnych adresów"). Jeśli zapisujesz nową wartość danej "zmiennej", to identyfikator ("wirtualny adres") pozostaje bez zmian. Jeśli chcesz odczytać daną "zmienną",...
Kontynuuję temat ponieważ natrafiłem na kolejny problem. W tej chwili kompiluję aplikację i bootloader jednocześnie. W rezultacie po modyfikacjach w programie głównym ulega zmianie także obszar bootloadera w pliku hex. Wydaje mi się że to przez zmianę alokacji zmiennych w pamięci ram lub stałych z dyrektywy #define używanych w funkcjach bootloadera....
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...
Sprawdzona konfiguracja na STM32F407VGT [syntax=c]void adc_init(void) { RCC->APB2ENR |= RCC_APB2ENR_ADC1EN; RCC->AHB1ENR |= RCC_AHB1ENR_DMA2EN; //konfiguracja ADC ADC1->CR2 = ADC_CR2_ADON | //włącz ADC ADC_CR2_EXTEN_0 | /*ADC_CR2_EXTEN_1 |*///wyzwalanie przetwornika zboczem opadającym i narastającym ADC_CR2_EXTSEL_3 | ADC_CR2_EXTSEL_0 |//wyzwalanie...
Hejka, robię właśnie przesiadkę projektu z kompilatora IAR'a do GCC'a i mam problem z przeniesieniem niektórych ustawień, konkretniej chodzi o nie wycinanie przez linker konkretnych, nieużywanych zmiennych globalnych wygenerowanych przez zewnętrzne narzędzie, zawierających informacje np. o dacie buildu, checksumie itp. które są potem w przypadku reklamacji...
Zacznijmy od początku. Czy jest potrzebny sprzętowy JTAG? nie. jest potrzebny programator. Zalety JTAG-a: śledzenie w układzie. Wady JTAG-a w wykonaniu Atmel-a.... : gubi program w trakcie śledzenia. nie potrafi śledzić działania WDT. okłamuje użytkownika - jeśli kompuilator nie włączy kawałka kodu a debuger Atmala z Jtag-iem widzi ten kod i go wykonuje...
W normalnym świecie SPI działa w ten sposób, że wysyłając jeden bajt, odbiera się jeden. Pisząc pewien ogromny program, używałem powyższego założenia implementując obsługę SPI1 z pomocą kanałów DMA (DMA1_Ch2 i DMA1_Ch3). Jeden kanał używany do transferu bloku z pamięci RAM do SPI1->DR, drugi kanał do transferu w drugą stronę. Wszystko działało bez najmniejszego...
Ja w 95% używam typedef do struktur. Do wskaźników nigdy (tu sie zgadzam że jest to 'pure evil'). Dlaczego? - bo nie trzeba pisać struct ;) Czemu typedef? Bo wtedy wiadomo że biblioteka operuje na specjalnych danych. Jak nie pamiętam co to jest za twór, to i tak lepiej nie brać się za pisanie kodu. Dokładnie. A twór łatwo można sobie przypomnieć klikając...
stm32 zmienne stm32 zmienne extern stm32 pamięci
transformator samsung zespół parzenia pomiar prądu pomiar pradu
fabia wspomaganie piaskownica windows
Moduł sterujący deską rozdzielczą i zapłonem w Renault Laguna III 2.0 dCi Naprawa przekaźnika kierunkowskazów w samochodzie