STM32 READ / ERASE / WRİTE FLASH

Başlatan cagri_dinc, 19 Şubat 2014, 09:34:36

z

Adresde sorun yok verdiğim adres sınırlar içerisinde. Zaten çok farklı adresler de denedim.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

cagri_dinc

 0x80002000 geçerli bir adres değil dikkat edin 0x08000000 ile karıştırıyor olabilirsiniz.

z

@cagri_dinc

Aynen dediğiniz gibi, bakar kör olmuşum.

0x08000000 adresi olması gereken ROM alanını  0x80000000 yazmışım ve nerede ise tüm pazar günüm bu sorunla uğraşmakla geçti.

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

cagri_dinc

z hocam ben de aynı interrupt sıkıntısıyla 2gün cebelleştim.Ben gibi diğer arkadaşlar bu sıkıntıyı çekmesinler diye forumda paylaşmaya karar vermiştim. :)

pathetic

STM32f103 için bu şekilde veya emulated eeprom ile veri saklamanın bir sınırı var mıdır (yazma silme açısından) ?
Gün içinde 10larca kez değişecek ve herseferinde kaydedilmesi gereken 1bytelık 5 adet veri için doğru bir yöntem midir?

MT

#35
Boot flash'da yer alıyor diyor datasheet "2.4 Boot configuration sayfa 69". (http://www.st.com/web/en/resource/technical/document/reference_manual/DM00031020.pdf)


Memory will be organised as follows :
0x0800 0000 - 0x0800 2FFF (page 0 to page 5 of STM32F103RD) will be used or bootloader code.
0x0800 3000 - 0x0803 FFFF (page 6 to page 127) can be used for user's application code.
0x0804 0000 - 0x0805 FFFF (page 128 to page 191) will be used to store image recieved from Coordinator

detayları linkte:
http://www.cse.hcmut.edu.vn/~bvhieu/index.php/student-s-projects/computer-engineering-projects-fall-2013/23-home-automation-remote-reprogramming

mesaj birleştirme:: 12 Mayıs 2014, 17:34:38

Alıntı yapılan: pathetic - 06 Mayıs 2014, 15:35:55
STM32f103 için bu şekilde veya emulated eeprom ile veri saklamanın bir sınırı var mıdır (yazma silme açısından) ?
Gün içinde 10larca kez değişecek ve herseferinde kaydedilmesi gereken 1bytelık 5 adet veri için doğru bir yöntem midir?

Bir kaç milyon kez yazılıp silinebilir datasheet'te bununla ilgili detay olması lazım. Ben dediğin yöntemi uzun zamandır kullanıyorum.

Klein

Alıntı yapılan: pathetic - 06 Mayıs 2014, 15:35:55
STM32f103 için bu şekilde veya emulated eeprom ile veri saklamanın bir sınırı var mıdır (yazma silme açısından) ?
Gün içinde 10larca kez değişecek ve herseferinde kaydedilmesi gereken 1bytelık 5 adet veri için doğru bir yöntem midir?
STM32F103 silme-yazma ömrü yanlış hatırlamıyorsam 100000 civarında.
eeprom emülasyon kodları 16 bit çalışıyor.  her word iin bir de sanal adres bilgisi yazılıyor. toplamda 32 bit.
5 adet  veriniz olduğuna göre 20 byte yer işgal edecekler.   her biri 1k ( isterseniz daha da büyütebilirsiniz) olmak üzere  2 sayfa kullanıyoruz.  toplamda 2k.   her rayfaya yaklaşık 50 kez veri aydettiğinizde sayfayı silmeniz gerekiyor. 2 sayfa olduğu için 100 kez veri kaydedebilirsiniz.   Flash ömrünün  100.000 olduğunu varsayarsak, 10M kez 5 byte veri yazabilirsiniz.

Programı biraz düzenleyerek  bu sayıyı 2 katına , hatta biraz da akıllı bir algoritma kurarak  bir kaç katına çıkarabilirsiniz.

pathetic

Alıntı yapılan: singleiron - 12 Mayıs 2014, 17:32:55

mesaj birleştirme:: 13 Mayıs 2014, 07:34:38

Bir kaç milyon kez yazılıp silinebilir datasheet'te bununla ilgili detay olması lazım. Ben dediğin yöntemi uzun zamandır kullanıyorum.

Alıntı yapılan: Klein - 12 Mayıs 2014, 18:31:55
STM32F103 silme-yazma ömrü yanlış hatırlamıyorsam 100000 civarında.
eeprom emülasyon kodları 16 bit çalışıyor.  her word iin bir de sanal adres bilgisi yazılıyor. toplamda 32 bit.
5 adet  veriniz olduğuna göre 20 byte yer işgal edecekler.   her biri 1k ( isterseniz daha da büyütebilirsiniz) olmak üzere  2 sayfa kullanıyoruz.  toplamda 2k.   her rayfaya yaklaşık 50 kez veri aydettiğinizde sayfayı silmeniz gerekiyor. 2 sayfa olduğu için 100 kez veri kaydedebilirsiniz.   Flash ömrünün  100.000 olduğunu varsayarsak, 10M kez 5 byte veri yazabilirsiniz.

Programı biraz düzenleyerek  bu sayıyı 2 katına , hatta biraz da akıllı bir algoritma kurarak  bir kaç katına çıkarabilirsiniz.

Cevaplar için teşekkür ederim.
Peki "FLASH_Unlock();" dedikten sonra kullanım yapıyorum sorunsuz ama tekrar lock gerekli mi? Bu neyi sağlıyor?
Hexi PIC'deki gibi kod korumaya almak için ne yapılmalı? (Programlayıcım st link v2)

Hex oluştuktan sonra memory durum detayını nereden görebilirim? ARM'daki adresleme kısmını çok iyi anlayamadığım için ve birkaç glcd animasyonu koyduğum için adresler çakışsın istemiyorum. Boş sayfalar ve byteları ayarlayabilmek için gerekli olacak.

Not:
Mevcut durumda target ayarlarım IROM 0x8000000 0x10000 IRAM 0x20000000 0x5000
Eeprom değişkenlerim için kullandığım tablom  const  uint16_t VirtAddVarTab[] = { 0x5500, 0x5501, 0x5502, 0x5503, 0x5504, 0x5505, 0x5506, 0x5507}

Gökhan BEKEN

Boş bir adrese veri yazarken sıkıntı yok ama içi boş olmayan yani 0xFFFF olmayan bir adrese veri yazmak için öncelikle erase işlemi yapmak gerekiyor.
FLASH_EraseSector(FLASH_Sector_2, VoltageRange_3);
gibi fonksiyonlarla silmeye çalıştığım zaman o fonksiyondan çıkamıyor(kilitliyor)

Bu fonksiyonda ise
void Erase_Flash (uint32_t adr)
{
  FLASH->CR|=0x00000002;            //PER enable
  FLASH->AR=adr;                    //FLASH->AR registerine silinmek istenen adres yazılır
  FLASH->CR|=0x00000040;            //STRT anable
  while((FLASH->SR&0x00000001));    //İşlem bitene kadar bekle(BUSY kontrol ediliyor)
  FLASH->CR &= ~0x00000042;         //FLASH->CR ilk durumuna alınıyor (kilit hala açık!)
}


FLASH->AR registerini tanımıyor, bu yüzden kullanamıyorum.

İstediğim adresi nasıl silebilirim?
Not: stm32f407  kullanıyorum
Özel mesaj okumuyorum, lütfen göndermeyin.

X-Fi

#39
hocam flash hafızayı sektor olarak silebilirsin eeprom gibi byte olarak silinemiyor. Her sektör 256 byte dan oluşuyor öncelikle bir sektörü gözünüze kesitirip programın flash hafızasından yalıtmanız lazım bu yüzden kitlenmeler olabilir bunun için scatter file üzerinde adresleme gerekir.

Bu sektöre veri silmek yada daha önce kullandığınız bir alana bir word veri yazmak için o sektörü komple ram e yükleyin sonra silin sonra ramde düzeltme yapıp geri yükleyin. En genel kullanımı bu şekilde.

iyi çalışmalar.
http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

Burak B

Şuna da dikkat etmek gerek her MCU için flash sektör büyüklüğü 256 byte olmayabilir. Zira 2K sektöre sahip STM32 lerde mevcut. Bu gibi durumlarda "Flash Programming Guide"  dökümanlarını okumak faydalı olur.
"... a healthy dose of paranoia leads to better systems." Jack Ganssle

Gökhan BEKEN

Sorunu düzelttim. Kilitlenmesinin sebebi, işlem bitmeden devam etmemmiş. Çünkü gözle görülür bir zaman alıyor, yaklaşık 0,5 - 1 saniye while'da bekletiyor.
FLASH_Status sildinmi;
sildinmi = FLASH_EraseSector(FLASH_Sector_2, VoltageRange_3);
while(sildinmi != FLASH_COMPLETE){} //silene kadar bekle

Bu işlem ne kadar sağlıklı bilmiyorum. Silme fonksiyonu yazıp, gönderilen adresin hangi sektöre denk geliyor bunu bulup, dediğiniz gibi  sektörü ram'a alıp, sektörü silip, verileri düzenleyip sektörü tekrar kaydetme işlemi yapacağım.

Bu kadar zaman alması normal mi?
Özel mesaj okumuyorum, lütfen göndermeyin.

X-Fi

#42
Normalde sektör silme işlemi cortex M3 işlemci için yaklaşık 7.5ms sürüyor. Burak hocamın da dediği gibi farklı işlemcide zamanlar ve komutlar değişebilir. M4 hiç kullanmadım.

iyi çalışmalar.

STM32F4 için flash programlama zamanlarını buldum ölçtüğünüz süreler normal gözüküyor.

http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

Klein

Alıntı Yap
Hex oluştuktan sonra memory durum detayını nereden görebilirim? ARM'daki adresleme kısmını çok iyi anlayamadığım için ve birkaç glcd animasyonu koyduğum için adresler çakışsın istemiyorum. Boş sayfalar ve byteları ayarlayabilmek için gerekli olacak.
St Toolset ierisinde ST-Link utiliyt var. onunla yapabilirsiniz.

meftun ben eeprom emulator örneğindeki algoitmayı kullanmanı şiddetle öneririm. Çok özel veri kaydetme işleri olmadığı sürece, parametre kaydetme için bence en uygun yöntem.

justice_for_all

Flashla ilgili aklıma takılan birkaç şey var.Benim bir ana programım var ve ben gelen dataları tektek flasha yazmak ve bu flasha yazdıgım koddan baslamasını istiyorum programımın bunu nasıl yapabilirim. Yada şu şekilde sorayım ben system memorye program saklayabilirmiyim ve bunu işletebilirmiyim.istediğim zamanda main flash memory belleğini kullanabilirmiyim?
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay