是的,您可以在源代码中手动将默认数据写入EEPROM。首先,在带AVR的EEPROM上查看以下很棒的指南:Dean的AVR EEPROM教程。另外,我还要补充一点,最好使用makefile创建一个包含EEPROM数据的.eep文件,该文件将与源代码一起编程到设备中。但是,如果您不熟悉各种makefile和链接器操作,则仍可以从源代码文件中完成操作-它只会在电路加电后立即发生,从而使初始程序操作停滞不前。
在程序开始时(在任何类型的主循环之前),您可以执行以下操作:
#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);
“更新”功能首先检查该值是否已经存在,以节省不必要的写操作,从而保持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预处理器的更多信息,请查阅此在线手册。我认为您可能对宏和条件语句的部分最感兴趣。