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

STM32F072[C] - Programowa realizacja EEPROM - brak zapisu dl FLASH

26 Mar 2015 13:31 1116 8
  • Poziom 23  
    Korzystam z CooCox 1.7.7, używam Discovery z STM72RBt6 (128k FLASH)

    Realizuję wg ST programową implementację EEPROMa. Ustawiłem start adres w bibliotece:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    i zmniejszyłem dostępną pamięć dla linkiera o te 800 bajtów:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    W main mam:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    No i po wykonaniu tego wszystko wydaje się ok, ale faktycznie brak jest inicjalizacji EEPROMa. Z tego co znalazłem to funkcja ta dokonuje kasowania strony od adresu 0x0801F800, ale nie działa funkcja zapisu do FLASHa (FLASH_ProgramHalfWord z STL) nie zapisuje pod tym adresem, mimo że zwraca sukces.

    To, że sie kasuje sprawdzałem w ten sposób, że za pomocą ST_Link Utility wpisywałem coś pod 0x0801F800, następnie wywoływałem funkcję EE_Init, w której wywołane zostaje kasowanie strony, zatrzymywałem program i za pomocą ST Linka sprawdzałem, że dana się wykasowała (0xFF). Następnie znowu puszczałem program i nie następowało już wpisanie danej w to miejsce pamięci.

    Próbowałem też ręcznie (za pomocą FLASH_ProgramHalfWord()) wpisywać inne komórki w FLASH i się udaje, jednak z 0x0801F800 jest problem, mimo, że ST Link ja zapisuje.

    Dlaczego nie nstępuje zapis pod tym adresem?
  • Specjalista - Mikrokontrolery
    Dlatego, że w kodzie, którego nie pokazałeś, jest błąd.
  • Poziom 23  
    Kod to tak jak pisałem standardowe biblioteki do procesora STM32F072, czyli:

    http://www.st.com/web/en/catalog/tools/PF257884
    i
    http://www.st.com/web/en/catalog/tools/PF258153

    Nie mam jak teraz wrzucić tych funkcji, ale są one "standardowe" dla bibliotek, dlategoich nie wklejałem.

    Wieczorem będę miał możliwość wrzucenia prosto z projektu. Co mam pokazać? Ciałą Flash_Unlock, EE_Init() i "FlashWrite"?

    Dzięki.
  • Specjalista - Mikrokontrolery
    Przecież w kodzie powyżej nie ma żadnego zapisu do Flash...
  • Poziom 13  
    Witam,

    pokaż, w jaki sposób wywołujesz zapis do "EEPROM-u". Jeśli korzystasz z tego softu w linku, to przede wszystkim musisz zmienić PAGE_SIZE, bo STM32072 ma 2 razy większą stronę, niż np STM32051. W tej chwili nie mam dostępu do kompa, na którym mam swój projekt, ale jeśli nie dasz rady to napisz, to wieczorem wrzucę tu to co tam musiałem zmienić, bo w tej chwili już nie pamiętam.

    Pozdrawiam, QuadMan.
  • Poziom 23  
    BlueDraco napisał:
    Przecież w kodzie powyżej nie ma żadnego zapisu do Flash...


    Jest w EE_Init(). Może źle się wypowiedziałem. EE_Init sprawdza czy wymagany na EEPROM obszar pamięci jest "sformatowany" jak nie to go "formatuje", czyli zapisuje na początku dwóch bloków ich jakby identyfikatory. I właśnie ich nie można zapisać.

    Wygląda to tak:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Przy pierwszym przebiegu wywoływane jest kasowanie sekcji EEPROM:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Kod: c
    Zaloguj się, aby zobaczyć kod


    po tym zapis pierwszych 2 bajtów, jako "markera" formatu
    Kod: c
    Zaloguj się, aby zobaczyć kod


    a ciało tej funkcji wygląda tak:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    No i po tym status = FLASH_COMPLETE a w komórce 0x801F800 nic się nie zapisuje, tzn jest 0xFF w całej stronie pamięci.

    Cytat:
    pokaż, w jaki sposób wywołujesz zapis do "EEPROM-u". Jeśli korzystasz z tego softu w linku, to przede wszystkim musisz zmienić PAGE_SIZE, bo STM32072 ma 2 razy większą stronę, niż np STM32051. W tej chwili nie mam dostępu do kompa, na którym mam swój projekt, ale jeśli nie dasz rady to napisz, to wieczorem wrzucę tu to co tam musiałem zmienić, bo w tej chwili już nie pamiętam.


    Zapis do EEPROMu jest chyba bez znaczenia, bo i tak nie ma ważnej strony, ponieważ nie nastąpiło "sformatowanie" tej przestrzeni. Ja mam problem już na etapie jej "inicjalizacji". PAGE_SIZE w eeprom.h mam na 0x400:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Dalej nie wiem co może być nie tak.

    Dzięki
  • Poziom 13  
    Myrek1 napisał:
    PAGE_SIZE w eeprom.h mam na 0x400:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Dalej nie wiem co może być nie tak.

    Dzięki


    No przecież piszę, że PAGE_SIZE jest złe:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Jedna strona FLASH-a w STM32F07x ma 2k (0x800), dlatego nie możesz mieć ustawionej mniejszej strony ( RM0091 - "Reference manual STM32F0...." str.49 ). Wniosek z tego taki, że nie możesz ustawić EEPROM_START_ADDRESS na 0x0801F800 bo ten soft wymaga 2 fizycznych stron pamięci do poprawnego działania ( jeśli się jedna zapełni, ważne dane są przepisywane do tej drugiej, ta pierwsza jest kasowana itd. ) To tyle, niczego więcej nie musisz zmieniać.

    Pozdrawiam, QuadMan.
  • Poziom 23  
    Ok, ta było źle, ale ten problem pokazałby się później. Ja obecnie mam problem z zapisem do FLASHa już przy "formatowaniu EEPROMu"

    Wykonuje taki kod:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    i po tym powinna sformatować się ostatnia strona pamięci FLASH, tak jak piszesz od 0x0801F000
    Jednak u mnie po wykonaniu tego zabiegu, odczyt pamięci w tym miejscu to dalej same 0xFF, czyli brak tego "formatu".
    Na zdjęciu jest miejsce gdzie następuje zapisanie do Flasha, jest adres, dana (0x0000) i sukces, jednak po wykonaniu tego i odczycie nie jest zapisane 0x0000, tylko dalej jest0xFFFF.

    STM32F072[C] - Programowa realizacja EEPROM - brak zapisu dl FLASH

    eeprom.h:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Dlaczego ta dana nie zostaje zapisana?
    STM32F072[C] - Programowa realizacja EEPROM - brak zapisu dl FLASH

    I tak jest do końca strony.

    Dzięki
  • Poziom 13  
    Witam,

    wcześniej napisałem tu głupoty, usunę.
    Faktycznie, u mnie po pierwszym wywołaniu EE_Init jest 0x0000 pod adresem początku pierwszej strony, tj. 0x0801000. Rozumiem, że PAGE0_BASE_ADDRESS, PAGE0_END_ADDRESS itd pozmieniałeś na takie jak u mnie ( uwzględniając wielkość strony )?

    Pozdrawiam, QuadMan.

    DOPISANE: Jedyne, co mi przychodzi do głowy to to, że masz ustawione Write Protect dla stron 62 i 63, a z tego co widzę, FLASH_Unlock() nie jest w stanie zdjąć tej blokady. Sprawdź może w ST-Link-u ( Option Bytes).