Wykorzystanie zaawansowanych możliwosci pamięci EEPROM w mikrokontrolerach Kinetis

Partycjonowanie FlexMemory


By skorzystać z opcji EEE, pamięć musi być podzielona na partycje. Proces partycjonowania informuje automat o tym, ile pamięci EEE zostanie użyte i ile pamięci FlexNVM zostanie wykorzystane do buforowania EEE.


Pamięć dysponuje specjalnym rozkazem program partition używanym do konfiguracji EEE. Rozkaz programowania partycji jest używany do ustawienia trzech parametrów konfiguracyjnych EEE – są to rozmiar EEE, podział EEE i partycja FlexNVM. Te trzy parametry konfigurują specjalny rejestr wewnątrz bloku pamięci. Ponieważ jest to obszar pamięci nieulotnej, partycjonowanie trzeba przeprowadzić tylko raz w ciągu życia urządzenia. Przed użyciem rozkazu pamięć FlexNVM i D-Flash IFR muszą zostać wyczyszczone. Zaleca się partycjonowanie nowego urządzenia na początku procesu programowania.


 





Uwaga
Partycjonowanie należy przeprowadzić tylko raz. Gdy pamięć zostanie partycjonowana powtórnie w innej konfiguracji, zapisane dane zostaną utracone i nie ma gwarancji utrzymania oczekiwanej żywotności.

 





Uwaga
Informacje o partycjach, dane EEE i informacja o lokalizacji EEE są tracone w przypadku masowego kasowania. Wykorzystanie dodatkowej furtki jest silnie zalecane podczas zabezpieczenia dostępu do urządzenia, w którym używane jest EEE. Furtka umożliwia czasowe usunięcie zabezpieczeń bez potrzeby przeprowadzenia masowego kasowania. Jeśli masowe kasowanie jest stosowane, nie można zagwarantować trwałości pamięci EEE.

Uruchomienie EEE


Po resecie ustawienia konfiguracyjne EEE zapisane podczas procesu partycjonowania są automatycznie ładowane. Gdy EEE jest aktywne, automat ładuje do pamięci FlexRAM dane EEE znajdujące się w E-Flash podczas uruchamiania. Ilość czasu potrzebna na skopiowanie danych z E-Flash do FlexRAM może się zmieniać w zależności od skonfigurowanego rozmiaru EEE i wielkości bufora E-Flash, który musi zostać odczytany. Flaga FTFL_FCNFG[EEERDY] jest zerowana aż do zakończenia wczytywania danych EEE, zatem oprogramowanie musi odczekać, aż flaga EEERDY zostanie ustawiona przed próbą uzyskania dostępu do danych EEE w pamięci FlexRAM. Jeśli zamiast odpytywania programowego EEERDY potrzebna jest sygnalizacja za pomocą przerwania, może zostać wykorzystane przerwanie CCIF.


 





Uwaga
Więcej informacji o uruchamianiu EEE wraz z kodem inicjalizacji można znaleźć w rozdziale 8 Kinetis Quick Reference User Guide „Using the FlexMemory”.

Odczyt i zapis EEE


Dane EEE są odczytywane i zapisywane poprzez odwołanie do przestrzeni adresowej FlexRAM. Przestrzeń EEE jest alokowana, zaczynając od początku FlexRAM. Adresowalna przestrzeń zaczyna się od adresu bazowego FlexRAM (0x1400_0000) i kończy w zależności od zaprogramowanego rozmiaru EEE. Nie należy odwoływać się do obszaru FlexRAM, który nie jest wykorzystany jako EEE, gdy ta funkcja jest włączona. Na przykład, gdy rozmiar EEE ustawiono na 32 bajty, dozwolony jest odczyt i zapis dowolnego adresu z zakresu 0x1400_0000 do 0x1400_0000,  ale 0x1400_0020 do 0x17FF_FFFF powoduje zgłoszenie błędu szyny.


Ponieważ dane EEE dostępne są poprzez RAM, mogą zostać zapisane i odczytane w dowolnym rozmiarze – bajtu, słowa lub długiego słowa. Choć dozwolone są dowolne długości, rekordy buforujące EEE używają komórek danych o pojedynczej długości słowa. Oznacza to, że zapisy bajtowe są możliwe, ale nie wykorzystują efektywnie pamięci E-Flash. Dlatego właśnie we wzorze na żywotność wykorzystano dwa różne współczynniki przy dostępie 8-bitowym oraz 16- i 32-bitowym.


Zapis do przestrzeni EEE uruchamia operację EEE służącą do przechowania danych w pamięci E-Flash. Ponieważ jest to operacja programowa, przed zapisaniem do obszaru EEE oprogramowanie musi przeprowadzić test bitu CCIF, by ustalić, czy żadna z operacji na pamięci nie jest aktualnie w toku. Ponieważ nie są dozwolonych wiele współbieżnych zapisów i operacji odczyt-podczas-zapisu w jednym bloku Flash, nie jest możliwy dostęp do EEE lub przestrzeni D-Flash, do czasu aż zapis EEE zostanie zakończony.


 





Uwaga
Pamięć P-Flash jest całkowicie oddzielnym blokiem logicznym, zatem odczyt P-Flash może się odbywać normalnie podczas gdy EEE przeprowadza zapis.

 


Gdy pamięć EEE jest odczytywana, dane są dostarczone z FlexRAM, a zatem żadne operacje Flash nie są uruchamiane. Jednakże odczyt EEE nie jest dozwolony podczas zapisu EEE. Program musi sprawdzić bit EEERDY przed operacja odczytu lub zaczekać, aż EEERDY pojawi się po zakończonym zapisie, zanim będzie mógł kontynuować wykonanie. W wielu przypadkach najbardziej efektywne jest testowanie EEERDY lub CCIF zarówno przed, jak i po zapisach i blokowanie innych operacji EEE aż do ustawienia flagi EEERDY po zapisie. Zatem do zapisu EEE potrzebna jest specjalna funkcja, ale odczyt EEE nie wymaga złożonych zabiegów programistycznych. Dodatkową zaletą tego podejścia jest to, że nie potrzeba żadnego dodatkowego opóźnienia czy flagi kontrolnej przy wielokrotnym odczycie EEE bez cykli zapisu występujących w międzyczasie.


Specjalnym przypadkiem wartym osobnego rozważenia jest pierwszy dostęp do EEE po resecie. Dla pierwszego odczytu EEE po resecie, bit EEERDY może wymagać sprawdzenia w celu upewnienia się, że automat zakończył początkowe wczytywanie danych z E-Flash do FlexRAM. Jeśli czas rozruchu systemu jest długi, rozwiązanie to gwarantuje, że wczytywanie danych będzie miało szansę zakończyć się przed pierwszym odczytem EEE, wówczas test flagi EEERDY przed pierwszym odczytem może nie być konieczny. Jednak bezpieczniej jest jawnie sprawdzić bit EEERDY przed pierwszą próbą odczytu z EEE.


Wydajność EEE


Poza elastyczną strukturą i dużą trwałością zapewnioną przez implementację EEE w FlexMemory, układ ten jest szybszy od typowego EEPROM. Tradycyjny zewnętrzny EEPROM wymaga około 5 ms maksymalnego czasu programowania. Dla porównania, EEE może zostać wyzerowana i zapisana w ciągu 1,5 ms w najgorszym przypadku.


Pamięć EEE może zostać wstępnie wyzerowana (pre-erased) poprzez zapis 0xFF do komórek danych EEE. Wstępne zerowanie zmniejsza czas programowania, ponieważ gwarantuje, że cykl zerowania nie będzie potrzebny. Typowy czas programowania wstępnie wyzerowanych obszarów danych wynosi ok. 100 us. Ta możliwość pozwala na szybkie zapisywanie danych w sytuacjach krytycznych czasowo.


Typowym zastosowaniem jest wykorzystanie w systemie, gdzie informacja o błędach lub pracy układu musi być przechowana, gdy wykryty zostanie nadchodzący spadek zasilania. Ilość danych koniecznych do zapisania określa, jak wiele pamięci można przeznaczyć, by podtrzymać działanie systemu przy minimalnym napięciu zasilania. Znaczne skrócenie czasu programowania EEE uzyskiwane dzięki wstępnemu zerowaniu obszarów danych oznacza, że w tej sytuacji potrzebne jest  mniejsze rozdzielenie i można zapisać więcej danych przed utratą zasilania.


Literatura
[1] Nota aplikacyjna AN4282: Using the Kinetis Family Enhanced EEPROM Functionality

O autorze