How To: EEPROM
EEPROM is a special kind of memory. It is small (6 KB on Core Module chip) memory with a limited number of write/erase cycles. It is non-volatile memory - which means that it does not require power to retain stored information. This means that bytes written/stored inside the EEPROM will stay there until erased/rewritten (even without the power)
Don’t be afraid of limited W/E cycles. In standard conditions, the chip guarantees 100 000 cycles. Remember that those cycles are Write/Erase.
Reading from the EEPROM does not count, so it is completely safe to read from it as much as you wish.
- EEPROM SDK Module
- GitHub Repository Example
TOWER Core Module has 6 KB EEPROM included. In case you need to find this value out inside your code, there is a function for this inside the SDK:
In this example, we will write the float value and string to EEPROM immediately after the Core Module boots. With every press of a button, the data will be retrieved from EEPROM and sent to the computer. To test that the memory is persistent you can try to comment both
twr_eeprom_write lines out (after running the original example once).
It should still work and the debug should write the same string.
Please note that some of our modules (currently
twr_radio_* module only) use a few last dozens of bytes in EEPROM. If you use those modules, remember to use the memory addresses from 0 up to 6000.
This makes sure that no data will be overwritten.
Expected output of the example below.
EEPROM size: 6144
EEPROM Test Code Example
void button_event_handler(twr_button_t *self, twr_button_event_t event, void *event_param)
if (event == TWR_BUTTON_EVENT_PRESS)
size_t eeprom = twr_eeprom_get_size();
twr_eeprom_read(0, &readFloat, 4);
twr_eeprom_read(4, readEeprom, 12);
readEeprom = '\0';
twr_log_debug("EEPROM size: %d\r\nData:\r\n%f\r\n%s", eeprom, readFloat, readEeprom);
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);