Chia sẻ STM32_Study: #04-EEPROM EMULATOR by FLASH

#1
Để giảm giá thành và giảm size linh kiện, các nhà SX thường loại bỏ eeprom-on-chip và thay thế bằng flash (gọi là eeprom emulator by flash). Tất nhiên khi muốn sử dụng vùng flash này thì ta phải biết (hoặc đoán) dung lương flash của chương trình ta sẽ nạp code, và sau đó cấu hình vùng 'eeprom emulator by flash' này lớn hơn vùng flash được sử dụng cho code.
EEPROM Emulator là module dùng khi ta muốn lưu data vào Flash và xem Flash như là một eeprom (data không bị mất khi mất nguồn). Ứng dụng khi ta muốn lưu các thông số cài đặt, lưu các step trong quá trình họa động, lưu thông số, data logger ...
1. Xác định vùng FLASH được sử dụng làm EEPROM:
Sử dụng “Flash Loader Demostrator” để xác định phần Flash lưu data:
Giả sử ở đây ta dùng phần Flash từ Page 16 đến Page 23, tổng cộng 8 Pages = 16K = 2048 bytes
eeprom_01.png

Như vậy ta đã có khai báo như sau:
Mã:
#define FLASH_START_ADDRESS  ((uint32_t)0x8008000)
#define FLASH_END_ADDRESS  ((uint32_t)0x800C000)
2. Sử dụng Module "EEpromEmulator":
Module 'EEpromEmulator' gồm 2 file: EEpromEmulator.c và EEpromEmulator.h
2.1 Khai báo sử dụng module:
Mã:
int main()
{
  ...
  EEpromEmulator_Configuration(); //using EEpromEmulator
  ...
}
2.2 Ghi data vào FLASH:
Để ghi được 1 byte data FLASH, ta phải xóa - erase toàn bộ 1 page, sau đó ghi lại data vào page vừa xóa.
Với module 'EEpromEmulator', ta sử dụng hàm 'EEpromEmulator_WriteBytes()' để ghi data vào FLASH:
Mã:
/**
  * @brief  The function used to write n bytes from flash
  * @param  memory_position: buffer memory position to be written (0 <= memory_position <= 2047)
  * @param  dataWrite: pointer contains data to be written
  * @param  len: bytes to be read; 0 <= len < 2048;
  * @retval status of FLASH processing.
  */
FLASH_Status EEpromEmulator_WriteBytes(uint16_t memory_position, uint8_t* dataWrite, uint16_t len);
Ví dụ ghi 8 bytes data vào EEPROM EMULATOR memory tại địa chỉ số 6:
Mã:
uint8_t data[10];
  data[0]=0x4;
  data[1]=0x5;
  data[2]=0x6;
  data[3]=0x10;
  data[4]=0x1;
  data[5]=0x2;
  data[6]=0x3;
  data[7]=0x4;
/**
  FLASHStatus = EEpromEmulator_WriteBytes(6,&data[0],8);
  if(FLASH_COMPLETE == FLASHStatus)
  {
  /* write done */
  }
  else
  {
  /* write Error */
  }
2.3 Read data từ FLASH: sử dụng hàm 'EEpromEmulator_ReadBytes()' để đọc data từ FLASH
Mã:
/**
  * @brief  The function used to read n bytes from Flash
  * @param  memory_position: buffer memory position to be read (0 <= memory_position <= 2047)
  * @param  data_out: pointer to save data
  * @param  len: bytes to be read; 0 <= len < 2048;
  * @retval number byte which is read.
  */
uint16_t EEpromEmulator_ReadBytes(uint16_t memory_position, u8* data_out, uint16_t len);
Ví dụ đọc ngược lại data vừa ghi ở trên:
Mã:
uint16_t qty = 0;
qty  = EEpromEmulator_ReadBytes(6, dataRead, 8);
Tới đây mình xin kết thúc cách dùng FLASH làm EPPROM, hy vọng các bạn có thêm cách để lưu dữ liệu một cách hiệu quả.
Hai file source mình cũng attach lên đây, các bạn có thể thay đổi size, vùng FLASH_START_ADDRESS, FLASH_END_ADDRESS tùy ý (xem #1)
 

Đính kèm

#5
a oi cho em hoi may dia chi trong nay la nhu the nao a
Là bộ nhớ Flash đang còn trống, chưa có data nên nó hiển thị FF. Nếu bạn muốn dùng Flash làm bộ nhớ lưu data nên chọn vùng nào xa xa, vì còn chưa chỗ cho bộ nhớ chương trình khi biên dịch nữa
 

phucdt3

Học sinh phổ thông
#7
Hello mọi người. e đọc dữ liệu từ flash ra nhưng không đúng như giá trị e ghi vào là bị sao vậy ?
 

Tran luong

Trần Đình Lượng, Đt: 0989285187-HCM
#9
Hi all.
Hiện tại mình ghi đọc được flash rồi nhưng việc ghi dữ liệu có vẻ như ảnh hưởng đến các chương trình khác.
Em thực hiện quét led 7 đoạn thì lúc thêm đoạn code lưu 1 byte vào flash led bị nhấp nháy. Các bác có cách nào khắc phục hiện tượng này không ah? Help!!!
 

tdm

Kỹ sư
#10
Hi all.
Hiện tại mình ghi đọc được flash rồi nhưng việc ghi dữ liệu có vẻ như ảnh hưởng đến các chương trình khác.
Em thực hiện quét led 7 đoạn thì lúc thêm đoạn code lưu 1 byte vào flash led bị nhấp nháy. Các bác có cách nào khắc phục hiện tượng này không ah? Help!!!
led 7 đoạn bạn dùng ngắt timer quét led hay quét led bình thường?
 

Quảng cáo Google