Да, вы можете вручную записать данные по умолчанию в EEPROM в исходном коде. Во-первых, ознакомьтесь с этим удивительным руководством по EEPROM с AVR: учебное пособие по AVR EEPROM Дина. Кроме того, я должен добавить, что лучше создать файл .eep, содержащий данные EEPROM, используя make-файл, который будет запрограммирован на устройстве вместе с исходным кодом. Однако, если вы не знакомы с различными операциями make-файла и компоновщика, это все равно можно сделать из файла исходного кода - это произойдет, как только цепь запитается, что остановит начальную операцию программы.
В начале программы (перед любым видом основного цикла) вы можете сделать что-то вроде этого:
#include <avr/eeprom.h>
#define ADDRESS_1 46 // This could be anything from 0 to the highest EEPROM address
#define ADDRESS_2 52 // This could be anything from 0 to the highest EEPROM address
#define ADDRESS_3 68 // This could be anything from 0 to the highest EEPROM address
uint8_t dataByte1 = 0x7F; // Data for address 1
uint8_t dataByte2 = 0x33; // Data for address 2
uint8_t dataByte3 = 0xCE; // Data for address 3
eeprom_update_byte((uint8_t*)ADDRESS_1, dataByte1);
eeprom_update_byte((uint8_t*)ADDRESS_2, dataByte2);
eeprom_update_byte((uint8_t*)ADDRESS_3, dataByte3);
Функция «update» сначала проверяет, существует ли это значение, чтобы сэкономить на ненужных записях, сохраняя срок службы EEPROM. Тем не менее, выполнение этого для очень многих мест может занять довольно много времени. Может быть, лучше проверить одно место. Если это желаемое значение, то остальные обновления можно полностью пропустить. Например:
if(eeprom_read_byte((uint8_t*)SOME_LOCATION) != DESIRED_VALUE){
eeprom_write_byte((uint8_t*)SOME_LOCATION, DESIRED_VALUE);
eeprom_update_byte((uint8_t*)ADDRESS_1, dataByte1);
eeprom_update_byte((uint8_t*)ADDRESS_2, dataByte2);
eeprom_update_byte((uint8_t*)ADDRESS_3, dataByte3);
}
Если вы хотите обновить большие объемы данных, попробуйте использовать другие функции, такие как eeprom_update_block(...)
. И обязательно прочитайте этот урок; это хорошо написано.
Вы можете поместить все операторы обновления EEPROM в один условный оператор препроцессора. Это очень просто сделать:
#if defined _UPDATE_EEPROM_
#define ADDRESS_1 46 // This could be anything from 0 to the highest EEPROM address
uint8_t dataByte = 0x7F; // Data for address 1
eeprom_update_byte((uint8_t*)ADDRESS_1, dataByte1);
#endif // _UPDATE_EEPROM_
Этот фрагмент кода даже не будет скомпилирован, если вы не выполните следующее:
#define _UPDATE_EEPROM_
Вы можете оставить это как комментарий, а затем раскомментировать, если вам нужно изменить значения EEPROM по умолчанию. Для получения дополнительной информации о препроцессоре C, ознакомьтесь с этим онлайн-руководством . Я думаю, что вы можете быть наиболее заинтересованы в разделах о макросах и условных выражениях.