stm32 nin flash eeprom okuma

Başlatan görkem, 25 Ağustos 2017, 19:06:19

görkem

Merhaba arkadaşlar keil  ile hal kütüphanesini kullanarak stm32f4 ün flash ına yazma yapıyorum fakat okuma ile ilgili bir fonksiyon bulamadım yazma kodum aşağıda


uint32_t adres=0x08040000;

HAL_FLASH_Unlock();
 
for(i=0;i<255;i++)
{
adres++;
HAL_FLASH_Program(FLASH_TYPEPROGRAM_BYTE,adres,dat);
}

HAL_FLASH_Lock();



baran123

Bunları kullanabilirsin.
#define FLASH_READ_BYTE(ADDR)				*(uint8_t *)ADDR;
#define FLASH_READ_HALFWORD(ADDR)		        *(uint16_t*)ADDR;
#define FLASH_READ_WORD(ADDR)				*(uint32_t*)ADDR;

görkem

@baran123 hocam define tanımlamalarıyla nasıl okuyacağız fonksiyon yok anlayamadım mantığını

baran123

Kullanımı oldukça basit.
uint8_t data = FLASH_READ_BYTE(0x8000010);

Mucit23

@baran123 HAL library de benimde 64 byte kadar veriyi hafızaya kaydedip gerektiğinde okumam lazım. Std libraryde bu iş baya karmaşıktı. Bir eeprom kütüphanesi kullanmak gerekiyordu. HAL kütüphanede sadece makrolarla işi halletmek mümkünmüdür? Kullanımına dair bir örnek verebilirmisin?

Klein

Olayı karışık hale getiren ST_Lib değil. Flash belleğin eeprom gibi kullanılmak istenmesi.  eğer Flash bloğununun kaç baytlık kısmını kullanırsanız kullanın, her seferinde tüm bloğu ( ya da silinebilen en küçük sektörü) silip tekrar yazmak sizin için sorun değilse, ST_Lib'de de aynı basitlikte yaparsınız. EEprom emülatör yazılımı kullanmaktaki amaç flash bloğunun ömrünü uzatmak.  Hal ya da ST_Lib farketmez.

baran123

@Mucit23 klein hocam açıklamış.
Şimdi bütün bölümünü tekrar silip yazman gerektiğini biliyoruz ama bu ömrü kısaltacak o yüzden eeprom emulator bir takım algoritma ile iyileştirmeler yaparak ömrü uzatıyor Klein hocamın dediği gibi.


Benim makroda verdiğim örnek sadece okuma için.
Okuma kısmında problem yok o yüzden rahat bir şekilde makro ile yapabilirsin.
Ama yazma için emülatör veya bir takım algoritmalar kullanmak lazım.
Aslında verileri RAM de tutup bir VBAT ile LP modda ramin silinmesini engellemek de düşünülebilir ama ne kadar güvenilir olur tartışılır.


EEPROM Emülasyon : https://my.st.com/content/my_st_com/en/products/embedded-software/mcus-embedded-software/stm32-embedded-software/stm32-standard-peripheral-libraries-expansions/stsw-stm32010.license%3d1503774313320.html


görkem

Flash a yazma yaptığımızda eeprom gibi çalışmıyormu yukardaki kullandığım kodda enerji yokken veri saklıyordu

baran123

@görkem eeprom gibi çalışır fakat veri yazabilmeniz için ilgili noktanın bitleri 1 olmalıdır.
Yani siz bu bitleri 1 den 0 a geçirebilirsiniz ama 0 dan 1 e pat diye geçiremiyorsunuz.
Bunun için Page(Sector) alanının komple silip verileri yeniden yazmanı gerekiyor.

Bu yüzden bütün bölgeler default olarak 0xFFFFFFFF ile doldurulmuş olsa gerek.

görkem

@baran o zaman direk eeprom kullanmak daha mantıklı değilmi ? bayabi zaman kaybettirmezmi tekrar hepsini 0xFFFFFFFF yapıp tekrar sektöre veri yazmak

baran123

@görkem Ona sen karar vereceksin :)
Ne kadar ve nasıl veri saklayacağına bağlı.


görkem

#11
@baran123 rfid bilgilerini tutucak yaklaşık 1 kb lık veri kayıt edicek  :)

edit: HAL_EEPROMX_PROGRAM diye fonksiyon var hiç uğraşmadan eeprom olarakmı kullanıyor flash ı ?

baran123

O zaman flash'ı kullan gitsin.
HAL çok bilmiyorum büyük bir ihtimal eeprom gibi çalışmasını sağlıyordur o fonksiyon.
Örnekleri dökümanları incele

görkem

@baran123  flasha veri yazdıktan sonra tekrar  veri yazmak için sektörü 0xFFFFFFFF yapmak gerekiyor fakat yapmıyor bir flag mı resetlenmesi gerekiyor bilginiz varmı

Klein

0xFFFFFFFF yapmaktan kasıt silmek.  Flash bellek alanları tek tek silinmez. Blok olarak silinir. Blok silme fonksiyonu var "Flash kütüphanesinde"