Picproje Elektronik Sitesi

DERLEYİCİLER => Diğer Derleyiciler => KEIL => Konuyu başlatan: görkem - 25 Ağustos 2017, 19:06:19

Başlık: stm32 nin flash eeprom okuma
Gönderen: görkem - 25 Ağustos 2017, 19:06:19
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();


Başlık: Ynt: stm32 nin flash eeprom okuma
Gönderen: baran123 - 25 Ağustos 2017, 20:07:05
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;
Başlık: Ynt: stm32 nin flash eeprom okuma
Gönderen: görkem - 26 Ağustos 2017, 00:52:30
@baran123 hocam define tanımlamalarıyla nasıl okuyacağız fonksiyon yok anlayamadım mantığını
Başlık: Ynt: stm32 nin flash eeprom okuma
Gönderen: baran123 - 26 Ağustos 2017, 01:34:24
Kullanımı oldukça basit.
uint8_t data = FLASH_READ_BYTE(0x8000010);
Başlık: Ynt: stm32 nin flash eeprom okuma
Gönderen: Mucit23 - 26 Ağustos 2017, 18:51:26
@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?
Başlık: Ynt: stm32 nin flash eeprom okuma
Gönderen: Klein - 26 Ağustos 2017, 19:59:12
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.
Başlık: Ynt: stm32 nin flash eeprom okuma
Gönderen: baran123 - 26 Ağustos 2017, 22:08:30
@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

Başlık: Ynt: stm32 nin flash eeprom okuma
Gönderen: görkem - 27 Ağustos 2017, 00:30:20
Flash a yazma yaptığımızda eeprom gibi çalışmıyormu yukardaki kullandığım kodda enerji yokken veri saklıyordu
Başlık: Ynt: stm32 nin flash eeprom okuma
Gönderen: baran123 - 27 Ağustos 2017, 01:00:55
@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.
Başlık: Ynt: stm32 nin flash eeprom okuma
Gönderen: görkem - 27 Ağustos 2017, 16:30:34
@baran o zaman direk eeprom kullanmak daha mantıklı değilmi ? bayabi zaman kaybettirmezmi tekrar hepsini 0xFFFFFFFF yapıp tekrar sektöre veri yazmak
Başlık: Ynt: stm32 nin flash eeprom okuma
Gönderen: baran123 - 27 Ağustos 2017, 16:33:45
@görkem Ona sen karar vereceksin :)
Ne kadar ve nasıl veri saklayacağına bağlı.

Başlık: Ynt: stm32 nin flash eeprom okuma
Gönderen: 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 ı ?
Başlık: Ynt: stm32 nin flash eeprom okuma
Gönderen: baran123 - 27 Ağustos 2017, 17:09:23
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
Başlık: Ynt: stm32 nin flash eeprom okuma
Gönderen: görkem - 27 Ağustos 2017, 17:46:10
@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ı
Başlık: Ynt: stm32 nin flash eeprom okuma
Gönderen: Klein - 27 Ağustos 2017, 17:57:53
0xFFFFFFFF yapmaktan kasıt silmek.  Flash bellek alanları tek tek silinmez. Blok olarak silinir. Blok silme fonksiyonu var "Flash kütüphanesinde"
Başlık: Ynt: stm32 nin flash eeprom okuma
Gönderen: Klein - 27 Ağustos 2017, 17:59:25
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.
Başlık: Ynt: stm32 nin flash eeprom okuma
Gönderen: görkem - 27 Ağustos 2017, 18:09:46
flash kütüphanesinde silmekle ilgili bir fonksiyon bulamadım dökümanada baktım flash_erase diye bir fonksiyon veya makro göremedim
Başlık: Ynt: stm32 nin flash eeprom okuma
Gönderen: baran123 - 27 Ağustos 2017, 18:19:15
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();
Başlık: Ynt: stm32 nin flash eeprom okuma
Gönderen: görkem - 27 Ağustos 2017, 21:39:45
 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 ?
Başlık: Ynt: stm32 nin flash eeprom okuma
Gönderen: Klein - 27 Ağustos 2017, 22:05:06
"HCLK"  frekansına ve  "Flash Latency" değerine bağlı.
Başlık: Ynt: stm32 nin flash eeprom okuma
Gönderen: görkem - 27 Ağustos 2017, 22:14:48

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)

Başlık: Ynt: stm32 nin flash eeprom okuma
Gönderen: Klein - 27 Ağustos 2017, 22:26:17
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.
Başlık: Ynt: stm32 nin flash eeprom okuma
Gönderen: görkem - 27 Ağustos 2017, 23:30:19
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 ?
Başlık: Ynt: stm32 nin flash eeprom okuma
Gönderen: Klein - 27 Ağustos 2017, 23:53:47
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.
Başlık: Ynt: stm32 nin flash eeprom okuma
Gönderen: baran123 - 28 Ağustos 2017, 06:37:53
@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.
Başlık: Ynt: stm32 nin flash eeprom okuma
Gönderen: görkem - 28 Ağustos 2017, 10:44:30
anladım hocam
Başlık: Ynt: stm32 nin flash eeprom okuma
Gönderen: bymrz - 28 Ağustos 2017, 13:44:26
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?
Başlık: Ynt: stm32 nin flash eeprom okuma
Gönderen: baran123 - 28 Ağustos 2017, 14:14:59
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.

Başlık: Ynt: stm32 nin flash eeprom okuma
Gönderen: x-nomek - 11 Mayıs 2019, 17:19:57
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;