stm32 nin flash eeprom okuma

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

Klein

Alıntı yapılan: görkem - 27 Ağustos 2017, 16:56:53
@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 ı ?
Sanmam.
L serisi gibi EEPROM alanı bulunan işlemcilerde kullanılıyordur muhtemelen.

görkem

flash kütüphanesinde silmekle ilgili bir fonksiyon bulamadım dökümanada baktım flash_erase diye bir fonksiyon veya makro göremedim

baran123

SPL kütüphanesinde şu şekilde siliyorum.
FLASH_Unlock();
	
FLASH_ClearFlag(FLASH_FLAG_EOP    | FLASH_FLAG_OPERR  | FLASH_FLAG_WRPERR);
FLASH_ClearFlag(FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR);
	
FLASH_EraseSector(FLASH_Sector_0, VoltageRange_3);

FLASH_Lock();

görkem

#18
 VoltageRange  1 den başlayıp 4 e kadar gidiyor voltaj aralıkları neyi belirliyor silerken ? byte büyüklüğüne göremi voltaj uygulanıyor ?

Klein

"HCLK"  frekansına ve  "Flash Latency" değerine bağlı.

görkem


sektörü silmeyi başardım

hal_flash_ex.h kütüphanesinde fonksiyonu buldum

FLASH_Erase_Sector(FLASH_SECTOR_6,FLASH_VOLTAGE_RANGE_3);



Fonksiyonun açıklamasında  bit büyüklüğüne göre voltajı arttırmış gibi bir ifade çıkıyor hocam

@arg FLASH_VOLTAGE_RANGE_1: when the device voltage range is 1.8V to 2.1V,
  *                                  the operation will be done by byte (8-bit)
  *            @arg FLASH_VOLTAGE_RANGE_2: when the device voltage range is 2.1V to 2.7V,
  *                                  the operation will be done by half word (16-bit)
  *            @arg FLASH_VOLTAGE_RANGE_3: when the device voltage range is 2.7V to 3.6V,
  *                                  the operation will be done by word (32-bit)
  *            @arg FLASH_VOLTAGE_RANGE_4: when the device voltage range is 2.7V to 3.6V + External Vpp,
  *                                  the operation will be done by double word (64-bit)


Klein

Hayır.
Fonksiyon voltaja müdahale etmiyor.
Siz besleme voltajınızı Flash fonksiyonuna (dolayısıyla CPU ya) bildiriyorsunuz.

Besleme voltajınıza bağlı olarak yazma işlemlerinde paralel işlem yapabiliyor. Böylece tek saferde 2, 4, 8 byte yazma yapabiliyorsunuz.
Eğer voltajınız 2.7V-3.6V aralığında değilse  32bit yazma yapamıyorsunuz.

Okuma işleminde ise  Aynı şekilde besleme geriliminize  ve HCLK frekansınıza bağlı olarak flash bekleme süresini (Flash Latency timi) doğru seçmeniz gerekiyor.

Detaylı bakmadım ama muhtemelen "Latency time"  değerinin Yazma işleri için de doğru ayarlanmış olması gerekli olabilir.

görkem

#22
Hocam flash latency time değerini nerden ayarlıyoruz okurken
#define FLASH_READ_BYTE(ADDR)

tanımlamasını kullanarak okuyorum    

Edit: HCLK latency time mı olmuş oluyor ?

Klein

Flash'ı okurken ayarlamıyorsunuz. Sistemin ilk ayarlarını (  frekans ayarları) yaparken bir kez ayarlıyorsunuz öyle kalıyor. Genelde derleyicilerin oluşturduğu Sys_Init() rutinlerinde ayarlanır.

baran123

@görkem
system_stm32f4xx.c dosyası içerisinde ayarlanıyor.
SetSysClock fonksiyonunda şu satıra dikkat edin.

FLASH->ACR = FLASH_ACR_PRFTEN | FLASH_ACR_ICEN |FLASH_ACR_DCEN |FLASH_ACR_LATENCY_5WS;


Burada "FLASH_ACR_LATENCY_5WS"'yi değiştireceksin sanırım.

görkem


bymrz

Arada bir de ben bir soru sıkıştırayım,
Bu mikrodenetleyicilerde flash bloklarının uzunluğu nedir peki? Yani ne kadarlık bir alanı kullanmamamız gerekecek. Hatta bildiğim kadarıyla 1bytelık bir veri için bile 2 adet flash bloğunu kullanım dışı bırakmamız gerekecek.


Çünkü daha önce kullandığım uc larda son flash bloğu ve ondan bir önceki blok kullanım dışı kalıyordu. Yani son flash bloğuna Page(n) ve sondan bir öncekine Page(n-1) dersek;


Verilerimiz Page(n-1) de saklanıyordu. Page(n-1) de veri değiştirmek istediğimizde önce Page(n-1) sayfası Page(n) sayfasına yedekleniyordu. Ardından Page(n-1) sayfası tamamen siliniyordu. Yazılmak istenen veri ile yedeğe alınan Page(n) sayfasındaki veriler birleştirilerek Page(n-1) sayfasına aktarılıyordu.


Burada da süreç bu şekilde mi işliyor?

baran123

Evet mantık o ama siz 2 tane page kullanmışsınız aslında şöylede yapılabilir.

Verilerin hepsini RAM'e aktar.
Değişikliği RAM'de yap.
Page'i sil
RAM'i tekrar Page'e aktar.

Fakat burada page büyükse sizinde büyük bir RAM'e ihtiyacınız var.
Örneğin CM4 bir çipte 128k lık pageler mevcut.
Bu örneği yaptığınız düşünürsek bayağı problem olur.
Aslında dediğiniz yöntem iyi fakat bu sefer bir tane fazladan page kullanım dışı kalıyor ve bunu küçük page'i olan çiplerde yapmak mantıklı olur.
Page boyutları standart bir değer değil gibi.
Ben CM4 çipte çalışıyorum bazı pageler 16k bazıları 128k
Küçük hafızalı çiplerde bu 1k bile olabilir.
Onu öğrenmek için Reference manuel'den "Memory Organization" bölümüne bakmanız gerekiyor.
Benim bu konudaki tavsiye veri saklamak için bir SD kart ekleyin.
Bu tarz çözümler zaman kaybettiriyor ve düzgün bir yapı kullanılmadığında Flash'ın ömrü kısalıyor.


x-nomek

Bende stm32f030f4p6 kullanıyorum stm ile ugraşmaya yeni başladim
  HAL_FLASH_Unlock();
  HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD,0x08001480,15);
  HAL_FLASH_Lock();

Bu kodla yazmayı başardım St link Utility ,0x08001480 adresinde bu kısımda 15 sayısını gördum

Fakat sizin verdiginiz yukarıda read ve erase işlemi yapan kodları atollic de bulamadım
onun yerine HAL_FLASHEx_Erase(&erase_pages, &error); bir kodla işlem yaptım. Flash'a Yazdığım 15 sayısını silip yerine başka bir sayı yazıp bunu okumaktı  ;D şimdi stm32 baglanamiyorum

  HAL_FLASHEx_Erase(&erase_pages, &error);
  erase_pages.PageAddress=0x08001480;
  erase_pages.NbPages=1;
  uint32_t error;