Có, bạn có thể tự ghi dữ liệu mặc định vào EEPROM trong mã nguồn. Trước tiên, hãy xem hướng dẫn tuyệt vời này trên EEPROM với AVR: Hướng dẫn về EEPROM của Dean. Ngoài ra, tôi nên thêm rằng nên tạo một tệp .eep chứa dữ liệu EEPROM bằng cách sử dụng tệp tạo tệp sẽ được lập trình cho thiết bị cùng với mã nguồn. Tuy nhiên, nếu bạn không quen với các hoạt động makefile và linker khác nhau, nó vẫn có thể được thực hiện từ trong tệp mã nguồn của bạn - nó sẽ xảy ra ngay khi mạch được cấp nguồn, làm trì hoãn hoạt động của chương trình ban đầu.
Khi bắt đầu chương trình (trước bất kỳ loại vòng lặp chính nào), bạn có thể làm một cái gì đó như thế này:
#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);
Chức năng "cập nhật" trước tiên sẽ kiểm tra xem giá trị đó đã có chưa, để tiết kiệm cho việc ghi không cần thiết, duy trì tuổi thọ EEPROM. Tuy nhiên, làm điều này cho rất nhiều vị trí có thể mất khá nhiều thời gian. Có thể tốt hơn để kiểm tra một vị trí duy nhất. Nếu đó là giá trị mong muốn, thì phần còn lại của các bản cập nhật có thể được bỏ qua hoàn toàn. Ví dụ:
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);
}
Nếu bạn đang tìm cách cập nhật lượng lớn dữ liệu, hãy thử sử dụng các chức năng khác như eeprom_update_block(...)
. Và chắc chắn đọc hướng dẫn đó; nó được viết tốt
Bạn có thể đặt tất cả các câu lệnh cập nhật EEPROM trong một câu lệnh điều kiện tiền xử lý. Điều này rất đơn giản để làm:
#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_
Bit mã này thậm chí sẽ không được biên dịch trừ khi bạn làm như sau:
#define _UPDATE_EEPROM_
Bạn có thể để nó ở đây dưới dạng một nhận xét, sau đó bỏ ghi chú nếu bạn cần thay đổi các giá trị EEPROM mặc định. Để biết thêm thông tin về bộ tiền xử lý C, hãy xem hướng dẫn trực tuyến này . Tôi nghĩ rằng bạn có thể quan tâm nhất trong các phần về macro và báo cáo điều kiện.