How To: EEPROM
EEPROM je speciální druh paměti. Jde o malou (6 KB na čipu Core Module) paměť s omezeným počtem zápisových/mazacích cyklů. Je to nevolatilní paměť – to znamená, že k uchování uložených informací nepotřebuje napájení. Bajty zapsané/uložené v EEPROM tedy zůstanou na svém místě, dokud nejsou vymazány/přepsány (i bez napájení)
Nebojte se omezeného počtu cyklů W/E. Za standardních podmínek čip garantuje 100 000 cyklů. Pamatujte, že tyto cykly jsou zápisové/mazací.
Čtení z EEPROM se nepočítá, takže je zcela bezpečné číst z ní, kolikrát chcete.
Odkazy
- EEPROM SDK Module
- Příklad v GitHub repozitáři
Velikost EEPROM
TOWER Core Module obsahuje 6 KB EEPROM. Pokud potřebujete tuto hodnotu zjistit ve svém kódu, je v SDK k dispozici funkce: size_t twr_eeprom_get_size(void)
Příklad čtení/zápisu
V tomto příkladu zapíšeme do EEPROM hodnotu typu float a řetězec hned po startu modulu Core Module. Při každém stisku tlačítka budou data z EEPROM přečtena a odeslána do počítače. Chcete-li vyzkoušet, že je paměť persistentní, můžete zkusit zakomentovat oba řádky twr_eeprom_write (poté, co původní příklad jednou spustíte).
Mělo by to stále fungovat a debug by měl vypsat stejný řetězec.
Vezměte prosím na vědomí, že některé naše moduly (aktuálně pouze modul twr_radio_*) používají posledních několik desítek bajtů v EEPROM. Pokud tyto moduly používáte, nezapomeňte využívat adresy paměti od 0 do 6000.
Tím zajistíte, že žádná data nebudou přepsána.
Očekávaný výstup níže uvedeného příkladu.
EEPROM size: 6144
Data:
3.141590
hello world!
Příklad testovacího kódu pro EEPROM
#include <application.h>
twr_button_t button;
void button_event_handler(twr_button_t *self, twr_button_event_t event, void *event_param)
{
(void) self;
(void) event_param;
if (event == TWR_BUTTON_EVENT_PRESS)
{
size_t eeprom = twr_eeprom_get_size();
char readEeprom[13];
float readFloat;
twr_eeprom_read(0, &readFloat, 4);
twr_eeprom_read(4, readEeprom, 12);
readEeprom[12] = '\0';
twr_log_debug("EEPROM size: %d\r\nData:\r\n%f\r\n%s", eeprom, readFloat, readEeprom);
}
}
void application_init(void)
{
twr_log_init(TWR_LOG_LEVEL_DEBUG, TWR_LOG_TIMESTAMP_ABS);
float toWriteFloat = 3.14159;
char toWrite[] = "hello world!";
twr_eeprom_write(0, &toWriteFloat, sizeof(toWriteFloat));
twr_eeprom_write(sizeof(toWriteFloat), toWrite, sizeof(toWrite));
// Initialize button
twr_button_init(&button, TWR_GPIO_BUTTON, TWR_GPIO_PULL_DOWN, false);
twr_button_set_event_handler(&button, button_event_handler, NULL);
}