W tym poście chciałbym opisać działanie rejestrów GPREG (ang. General Purpose Retention Registers).
Do dyspozycji są następujące rejestry w bibliotekach:
- __IO uint32_t GPREG0;
- __IO uint32_t GPREG1;
- __IO uint32_t GPREG2;
- __IO uint32_t GPREG3;
- __IO uint32_t GPREG4;
Można ich używać w następujący sposób:
- LPC_RTC->GPREG0 = 0x12345678; //Zapis
- uint32_t x = LPC_RTC->GPREG0; //Odczyt
Są one częścią RTC i służą jako podręczna pamięć podtrzymywana bateryjnie. Domena RTC musi być w tym czasie zasilana. Oznacza to, że jeśli zasilanie jest obecne to zawartość rejestrów GPREG jest zachowana po resecie programowym, watchdogu. Jeśli sekcja RTC jest podtrzymywana np. bateryjnie. To dane w rejestrach nie zostaną utracone nawet po odłączeniu głównego zasilania.
Rejestry mają następujące miejsce w pamięci:
Rejestry GPREG nie działają jak pamięć typu Flash czy EEPROM. Ich zawartość nie wymaga cyklu zapisu/kasowania. Można je nadpisywać jak zwykły rejestr. Oczywiście jak wspomniałem wcześniej, muszą być zasilane. Inaczej dane w rejestrach zostaną utracone.
Warto je stosować np. do zapamiętania przyczyny resetu programu na urządzeniu, zapisu jakichś flag, przechowywania stanu programu. Ogólnie wszystko do czego taka ilość danych może okazać się przydatna w programie. Nie stosował bym jednak na nich zapisu żadnych wrażliwych danych jak np. klucze.
Ogólnie należy je traktować jako małą, podręczną pamięć RAM z podtrzymaniem z domeny RTC. Warto też rozważyć wykorzystanie jednego z tych rejestrów jako wartość kontrolną. Która pozwoli na weryfikację danych przed ich użyciem np. w przypadku utraty zasilania sekcji RTC.