Elektroda.pl
Elektroda.pl
X
Computer ControlsComputer Controls
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

STM32F4[C] keil - Wydzielenie Pamięci FLASH do zapisu / odczytu danych ?

09 Sty 2013 10:15 3921 13
  • Poziom 10  
    Witam

    Zastanawiam się czy jest możliwe wydzielenie wbudowanej pamięci FLASH w STM32F4 do zapisu i odczytu np. ustawień ?? Często zmieniam ustawienia systemu i po resecie procesora wszystkie dane zostają skasowane..

    Pozdrawiam
    Marcin
  • Computer ControlsComputer Controls
  • Użytkownik usunął konto  
  • Specjalista - Mikrokontrolery
    Oczywiście że się da (;

    ST ma notę aplikacyjną o emulacji EEPROMu, ale ten ich pomysł nie jest do końca idealny...

    4\/3!!
  • Computer ControlsComputer Controls
  • Specjalista - Mikrokontrolery
    W definicji obrazu pamięci zmniejszasz rozmiar pamięci dostępnej dla konsolidatora i masz Flash na dane. żeby byłoc elegancko możesz zdefiniować własną sekcję i zadeklarować strukturę bądź tablicę danych w tej sekcji, zamiast używać ordynarnych stałych jako wskaźników - to będzie Twój data Flash.

    Przy okazji - czy ktoś może mi podpowiedzieć, gdzie są skrypty linkera w CooCox i co trzeba zrobić, by edytując je nie popaść w konflikt ze środowiskiem?
  • Poziom 10  
    Dzięki za pomoc, znalazłem już sporo informacji na ten temat, ale nigdzie nie mogę znaleźć plików bibliotecznych eeprom.c i eeprom.h opisanych w nocie AN3969 . Może ktoś zna miejsce skąd mogę je pobrać ??
  • Użytkownik usunął konto  
  • Poziom 12  
    Freddie Chopin napisał:

    ST ma notę aplikacyjną o emulacji EEPROMu, ale ten ich pomysł nie jest do końca idealny...

    Możesz rozwinąć myśl?
  • Specjalista - Mikrokontrolery
    np nie ma tam możliwości zapisania zmiennej o innym rozmiarze niż 2 bajty, co jest dosyć sporym ograniczeniem... Pozatym cała idea jest OK, tylko można ją poprawić [;

    4\/3!!
  • Poziom 10  
    Korzystam z funkcji dostarczonych od ST do zapisu i odczytu z pamięci flash, miałem ustawione cztery adresy 0x5555,0x6666,0x7777,0x8888, wszystko działało zgodnie z moimi oczekiwaniami. Dziś kod wynikowy przekroczył 32kB i procesor od razu po uruchomieniu ląduje w hard fault, zmieniałem adresy komórek pamięci mi.in na 0xAAAA i większe i problem nadal występuje.

    wg noty DM00037051 adresy pamięci FLASH to 0x08000000 - 0x080FFFFF, a alias do flash'a 0x00000000 - 0x000FFFFF

    Może ktoś spotkał się z podobnym problemem?

    dodam, że bez funkcji zapisu i odczytu wszystko działa.
  • Pomocny post
    Specjalista - Mikrokontrolery
    Jeden sektor pamięci ma 16 KiB. Jeśli kod przekroczył 32 KiB, to nie możesz używać adresów poniżej 0xC000, bo przy zapisie kasowałbyś zakres 0x8000..0xBFFF, czyli kawałek swojego kodu.
  • Poziom 10  
    Ustawiłem adresy powyżej 0xC000 i niestety procek nadal ląduje w hardfault, a co ciekawe przechodzi funkcję odczytu z flash'a i jeszcze kilka funkcji i później hardfault...
  • Specjalista - Mikrokontrolery
    I my tu bez kodu i bez mapy mamy zgadnąć, co zrobiłeś źle? Nie myślałeś o zatrudnieniu wróżki?
  • Poziom 10  
    Witam

    Wracam do problemu hardfault'a po wywołaniu funkcji emulujących flash. korzystam z przykładu od ST. Zapisuje i odczytuje tylko 4 liczby. Wykorzystywane adresy:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Poniżej 50kB kodu zapis i odczyt działał bez problemu. w pliku eeprom.h ustawiłem, wielkość strony:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    i adres startowy

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Po przekroczeniu 50kB na powyższych ustawieniach - hardfault po przejściu kilku funkcji. Co ciekawe odczyt z flash działa prawidłowo. Przestawiłem adres startowy na kolejny sektor (sektor 5) i wielkość strony na 128kB

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Niestety nie pomogło, testowo ustawiałem i sprawdzałem kolejne sektory - aż do 11, niestety bez rezultatu.

    mapa pamięci w pliku DM00023388

    Czy ten problem może być związany z niewystarczającą ilością zadeklarowanych stron?

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Może ktoś ma jakiś pomysł ?
  • Poziom 35  
    pomyslales o uzyciu scatter file? ;] W tam: target->options->linker odkliknij opcje "use memory layout from target dialog". Klik w przycisk "edit" z prawej strony.

    Code:

    LR_IROM1 0x08000000 0x3C000  {    ; load region size_region, zalozmy ze flash ma 256KiB
      ER_IROM1 0x08000000 0x3C000  {  ; load address = execution address
       *.o (RESET, +First)
       *(InRoot$$Sections)
       .ANY (+RO)
      }
    USER_DATA_PAGE +0 0x4000 { ; 16KiB miejsca zarezerwowanego 'na koniec'

    }

    }


    Linker wypluje warning ;] i to jest tylko przykład. Ja nie definiuje sekcji pustych, tylko raczej mowie linkerowi ktore miejsca ma zapełniać. Poczytaj...
    Zdefiniuj przestrzenie pamieci, w ktorych ma prawo znalezc sie kod. Pozostalych przestrzeni linker nie ruszy (ani programator, jesli ustawisz odpowiednia opcje). Pamietaj, ze warto wyrównywać te przestrzenie do wielkości strony flasha...