STM32F103 Simple Read & Write Data String To EEPROM Virtual
/ 08:29
Introducing
Dalam
membuat sebuah proyek berbasis MCU terkadang diperlukan sebuah penyimpanan data
atau konfigurasi dari user yang akan disimpan di memori EEPROM, dan ini dapat
di baca dan di tulis ketika user ingin membutuhkan.
Contoh saja ketika membuat
aplikasi yang membutuhkan password, ketika pengguna ingin mengubah password
dari yang lama ke yang baru tentu saja harus ada proses penyimpanan yang
bersifat non volatile, yang artinya ketika pengguna telah mengganti password
lama dengan yang baru, password ini harus tersimpan kedalam sebuah memori MCU
yang tidak hilang walau sistem di reset atau kehilangan tegangan utama (VCC).
Metode penyimpanan non volatile ini tentu saja membutuhkan EEPROM, Sekarang
bagaimana dengan MCU STM32F103 yang dari data sheetnya tidak ada penyimpanan
EEPROM secara khusus? Tapi dalam hal ini saya telah menemukan Arduino STM32 Core by
STMicroelectronic yang telah mengikutsertakan paket liblarynya dengan EEPROM
yang di adopsi dari Arduino. Tentunya sangat membantu sekali untuk pengerjaan
ini.
Tapi
saya masih berpikir kenapa bisa menyimpan data non volatile ke dalam papan blue
pill yang jelas pada chip STM32F103 tidak terdapat EEPROM khusus? Setelah mencari tahu ternyata penyimpanan non volatile ini di alamatkan kepada memori
flash yang ada pada chip STM32F103, mungkin bisa di bilang virtual EEPROM.
Dalam
proyek ini saya menggunakan liblary EEPROM.H yang sudah di ikut sertakan dalam
paket STM32Core, dan 1 buah switch untuk pengaturan penulisan dan pembacaan
EEPROM
Bill Of Material
·
Board STM32F103C Blue Pill
·
Bread Board 400 dot point
·
Push Button (Tactile Switch)
·
Dan beberapa kabel Jumper Female
to Male, dan Male to Male
Pada pemograman EEPROM ini saya telah mengembangkan program dasar dari sketsa liblary EEPROM.H, data yang saya ingin simpan berupa data STRING dengan alamat tujuan penyimpanan yang dapat anda tentukan sendiri dan penjelasan fungsinya sebagai berikut:
Pertama kalinya anda diminta untuk menetukan alamat yang ingin digunakan pada sebuah EEPROM, biasanya kalau EEPROM berukuran 1Kb berarti memiliki alamat mulai dari 0x0H sampai 0x400H atau alamat 0 - 1024 dalam desimal. Pada sketsa ini saya menggunakan alamat terendah 0 dan tertinggi 4095
const int EEPROM_MIN_ADDR = 0;
const int EEPROM_MAX_ADDR = 4095;
Yang selanjutnya adalah menggunakan fungsi penulisan data ke EEPROM, terdapat dua parameter disini yang pertama adalah parameter StartAddr tipe data integer yaitu anda dapat menetukan mulai dari alamat berapa data yang akan di tulis kedalam EEPROM. Yang kedua parameter DataString tipe data String yaitu anda dapat menuliskan data berupa string kedalam EEPROM.
void EEPROMwrite(int StartAddr, String
DataString)
Berikutnya adalah fungsi untuk membaca data yang telah tersimpan kedalam EEPROM, pada fungsi ini terdapat dua parameter, yang pertama adalah StartAddr tipe data integer, yaitu anda dapat menentukan mulai dari alamat berapa data yang ingin di baca dalam memori EEPROM, kedua StringLength yaitu anda dapat membaca berapa panjang data string yang ingin dibaca dari EEPROM.
String EEPROMread(int StartAddr, int
StringLength)
Sketsa lengkap dari proyek ini dapat anda copy paste kedalam lembar kerja arduino IDE anda sebagai berikut.
#include <EEPROM.h>
// Absolute min and max eeprom addresses.
Actual values are hardware-dependent.
const int EEPROM_MIN_ADDR = 0;
const int EEPROM_MAX_ADDR = 4095;
boolean eeprom_is_addr_ok(int addr) {
return ((addr >= EEPROM_MIN_ADDR)
&& (addr <= EEPROM_MAX_ADDR));
}
boolean eeprom_write_bytes(int startAddr,
const byte* array, int numBytes)
{
int i;
if (!eeprom_is_addr_ok(startAddr) ||
!eeprom_is_addr_ok(startAddr + numBytes)) {
return false;
}
for (i = 0; i < numBytes; i++) {
EEPROM.write(startAddr + i, array[i]);}
return true;
}
boolean eeprom_write_string(int addr, const
char* string) {
int numBytes; // actual number of bytes to be
written
//write the string contents plus the string
terminator byte (0x00)
numBytes = strlen(string) + 1;
return eeprom_write_bytes(addr, (const
byte*)string, numBytes);
}
boolean eeprom_read_string(int addr, char*
buffer, int bufSize) {
byte ch; // byte read from eeprom
int bytesRead; // number of bytes read so far
if (!eeprom_is_addr_ok(addr)) { // check
start address
return false;
}
if (bufSize == 0) { // how can we store bytes
in an empty buffer ?
return false;
}
// is there is room for the string terminator
only, no reason to go further
if (bufSize == 1) {
buffer[0] = 0;
return true;
}
bytesRead = 0; // initialize byte counter
ch = EEPROM.read(addr + bytesRead); // read
next byte from eeprom
buffer[bytesRead] = ch; // store it into the
user buffer
bytesRead++; // increment byte counter
while ( (ch != 0x00) && (bytesRead
< bufSize) && ((addr + bytesRead) <= EEPROM_MAX_ADDR) ) {
// if no stop condition is met, read the next
byte from eeprom
ch = EEPROM.read(addr + bytesRead);
buffer[bytesRead] = ch; // store it into the
user buffer
bytesRead++; // increment byte counter
}
// make sure the user buffer has a string
terminator, (0x00) as its last byte
if ((ch != 0x00) && (bytesRead >=
1)) {
buffer[bytesRead - 1] = 0;
}
return true;
}
void setup()
{
Serial.begin(9600);
Serial.println("Saving string to address 0");
pinMode(PA4,INPUT_PULLUP);
}
void loop()
{
int
address = 0;
if(digitalRead(PA4)==HIGH){
Serial.println("Write data to EEPROM");
EEPROMwrite(address,"Hello World");
delay(1000);
}
Serial.println("Read data From EEPROM");
Serial.println(EEPROMread(address,11));
delay(1000);
}
String EEPROMread(int StartAddr, int
StringLength){
char
buf[StringLength + 1];
eeprom_read_string(StartAddr, buf, StringLength + 1);
String dataStr = buf;
return dataStr;
}
void EEPROMwrite(int StartAddr, String
DataString){
int
val = DataString.length()+ 1;
char
StringChar[val];
char
buff[val];
//convert string to char array
DataString.toCharArray(StringChar, val);
strcpy(buff, StringChar);
eeprom_write_string(StartAddr, buff);
}
Test & Result
Uji coba yang pertama setelah program di upload jangan menekan pada switch dalam bentuk apapun biarkan program berjalan apa adanya, dalam kondisi switch tidak ditekan program akan menjalankan prosedur menulis data dan membaca data. String yang ditulis kedalam EEPROM adalah kata “Hello World” dan kembali dibaca seperti yang diperlihatkan pada garis kotak merah di bawah ini.
Uji coba yang kedua yaitu lepaskan tegangan utama (VCC) dari catu daya, kemudian tekan Sakelar terus menerus jangan dilepas, dan hubungkan kembali tegangan catu daya utama (VCC). Ketika sakelar di tekan maka prosedur program yang akan di jalankan hanya membaca data dari EEPROM, hal ini untuk memastikan ketika catu daya di putus dan tidak ada prosedur penulisan yang dijalankan apakah data masih tersimpan??
Jawabannya seperti pada gambar yang di kotak garis merah, ternyata hasilnya data masih tersimpan walau sistem di reset dan di putus catu dayanya. Tapi anda jangan puas dulu, ketika kita melakukan upload ulang program, maka secara otomatis data yang telah tersimpan kedalam EEPROM akan terhapus. Jadi harap berhati hati jika anda menggunakannya. Lain dengan chip yang memang telah tertanam EEPROM secara khusus, contoh saja ATMEGA 324 yang dikemas dalam board ARDUINO UNO, memiliki EEPROM khusus sebanyak 1KB, jadi walaupun kita telah melakukan upload ulang program kedalam board maka data yang telah tersimpan kedalam EEPROM tidak akan terhapus.
Comment 1
Ikut belajar min, mudah mudahan berkah ilmunya
ReplyEmoticonEmoticon