STM32 READ / ERASE / WRİTE FLASH

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

cagri_dinc

Flashta boş kalan yerler FF ile gösterilir.Ayrıca yanlış bir yere veri yazmamak için (örneğin kodunun bulunduğu flash alanı) ilgili işlemcinin datasheet içindeki memory map kısmını kontrol edip sondan başa doğru yazmakta fayda var.

z

Kafamdaki sorular henuz cevaplanmadi.

TI Flash algoritmalarinda;

Ilk once, Clear islemi yapilarak flashdaki tum bitler sifir yapilir.
Ardindan Erase islemi yapilarak flashdaki tum bitler bir yapilir.
Daha sonra programla islemi yapilarak veriler yazilir.

Ilk mesajda verilen ornekte boyle Clear islemi goremedim. Bu durumda Flash bastan temizlenmistir anliyorum yoksa Clear ve Erase islemi STM islemcilerde tek bir islem mi?

Diyelimki 2 bolgeden olusan Flash tika basa dolu.
Ilk bolgede flash programlama algoritmalarim vs var.

Flashin 1. bolgesindeki yazilim sayesinde 2. Bolgedeki programi silip ardindan yeni bir program yuklemek istersem ne yapmaliyim?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

@cagri_dinc

Verdigin programla  X adresini silip 0x0000 yazip ardindan silip 0xFFFF yazip tekrar silip ardindan 0x0000 yazabiliyormuyuz?

Henuz denemedim. Denediysen sonucu merak ediyorum.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Klein

Kodu incelemedim. Eğer hata yoksa  X adresini 0 yapabilirsiniz. ancak FFFF yapamazsınız.  Bunun için komple sayfayı silmeniz gerek. Sayfayı sildikten sonra tekrar X adese istediğiniz veriyi yazarsınız. İster 0 ister ABCD.

tekosis

hocam ben olayı sanırım yanlış anlamışım. bu flash hafıza programın tutulduğu hafıza değil dimi? picte eeprom hafızanın yerine kullanılan bir alan oluyor sanırım. burayı değiştirmek yazılan programa zarar vermez değil mi?
İlim ilim bilmektir, ilim kendin bilmektir, sen kendin bilmezsin, bu nice okumaktır.

Klein

Evet. Flash dediğimiz yer program hafızası. Programın buluduğu alana yazmazsan bir sorun çıkarmaz.
Pic'de eeprom var.  Buraya istediğin gibi yazabilirsin ve okuyabilirsin.

tekosis

hocam kullandığım cihazı bootloader kullanarak programlıyorum. elimde herhangi bir programlama cihazı yok. dolayısı ile programın nereye kadar uzandığını bilemiyorum. eğer hafızanın sonuna atarsam o zamanda bootloadere zarar verme ihtimalim var sanırım ki bir daha hiç programlayamam. bu iş için hafızanın nereye kadar dolu olduğunu nasıl öğrenebilirim acaba? diğer konuları araştırdım ama bir sonuca ulaşamadım.
İlim ilim bilmektir, ilim kendin bilmektir, sen kendin bilmezsin, bu nice okumaktır.

Klein

Bootloader son sayfalarda mı?

Öğrenmenin en basit yolu o sayfada 0xFFFF haricinde bir değer aramak. En son sayfanın en son  hücresinden başlayarak aramaya başlarsın.  Eğer sayfanın herhangi bir yerinde 0xFFFF haricinde  değere rastlarsan o sayfa doludur.

tekosis

hocam bootloaderin yerleştiği adresi bilmiyorum ne yazık ki. ama pic serilerinde bildiğim kadarı ile hafızanın son kısımlarına yükleniyordu bootloader.
İlim ilim bilmektir, ilim kendin bilmektir, sen kendin bilmezsin, bu nice okumaktır.

yamak

Bootloader'ın program hafızasında oluduğunu düşünmüyorum.Sonuçta benim yazdığım programın boyutu tüm hafızayı dolduracak büyüklükteyse yazdığım program da bootloader ı silebilir o zaman

Klein

Alıntı yapılan: tekosis - 10 Mart 2014, 02:41:36
hocam bootloaderin yerleştiği adresi bilmiyorum ne yazık ki. ama pic serilerinde bildiğim kadarı ile hafızanın son kısımlarına yükleniyordu bootloader.
Eğer cipin kendi bootloader'inden bahsediyorsanız, program belleğinde değil. 
Kendiniz bir bootloader yazdıysanız, onun yerini biliyor olmanız gerek.

tekosis

anladım hocam o zaman bi çılgınlık edip son sayfayı silip yazmayı deneyeyim. ya kısmet :)
İlim ilim bilmektir, ilim kendin bilmektir, sen kendin bilmezsin, bu nice okumaktır.

z

Asagidaki kodlardan   *(__IO uint16_t*)adr = data;     satirinda islemci hard fault'a dusuyor.

Flashda 0x80002000 adresinden itibaren sildim ve buraya yazmaya calistim.

Nerede hata yapiyorum?

///////////////// İSTENİLEN ADRESE VERİ YAZMA ALT PROGRAMI /////////////////////

void Write_Flash (uint32_t adr, uint16_t data)
{
  FLASH->CR|=0x00000001;
  *(__IO uint16_t*)adr = data;
  while((FLASH->SR&0x00000001));
}
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

hasankara

ben pic32 de usb üzerinden flash okuma yazma programı yazmıştım. bir fiziksel adresten birde sanal adresten bahsediliyor datasheet te (pic32 için).

fiziksel adresler 1 er 1 er artarken sanal adresler 4 er 4 er artıyor. biz pointer belirleyip istediğimiz adresten okuma yapmak istediğimiz de sanal adresi girmemiz gerekiyor. ve dediğiniz gibi eğer 1-2-3 ün katlarında bir adres değeri yüklediğimizde pointer e hard fault durumu meydana geliyor kod tıkanıyor. o yüzden önce okuma yapmak istenilen adres parametresinin 4 ün katları olduğunu ve istenilen aralıklarda olduğunu kontrol ettirip daha sonra okuma yazma yaptırmıştım. güzel sağlıklı çalıştırabildim.

if(!HIDTxHandleBusy(USBInHandle)){
                    for(i=5;i<65;i++)ToSendDataBuffer[i]=0xff;
                    ToSendDataBuffer[0] = 0x83;

                    j = 0;
                    j +=ReceivedDataBuffer[1];
                    j +=ReceivedDataBuffer[2]<<8;
                    j +=ReceivedDataBuffer[3]<<16;
                    j +=ReceivedDataBuffer[4]<<24;

                    if((
                         0xBFC02FFF>=j && j>=0xBFC00000||
                         0xBF8FFFFF>=j && j>=0xBF800000||
                         0xBD01FFFF>=j && j>=0xBD000000||
                         0xA0007FFF>=j && j>=0xA0000000||
                            
                         0x9FC02FFF>=j && j>=0x9FC00000||   
                         0x9D01FFFF>=j && j>=0x9D000000||   
                         0x80007FFF>=j && j>=0x80000000 )&&
                            j%4==0 )
                    {
                    LCD1=j;
                    k=(unsigned int*)j;
                    LCD2=*k;
                    

                    ToSendDataBuffer[1]= *k;
                    ToSendDataBuffer[2]= (*k>>8);
                    ToSendDataBuffer[3]= (*k>>16);
                    ToSendDataBuffer[4]= (*k>>24);
                    }

                    else
                    {
                    ToSendDataBuffer[1]= 0xff;
                    ToSendDataBuffer[2]= 0xff;
                    ToSendDataBuffer[3]= 0xff;
                    ToSendDataBuffer[4]= 0xff;

                    }
USBInHandle = HIDTxPacket(HID_EP,(BYTE*)&ToSendDataBuffer[0],64);
                }

cagri_dinc

Z hocam yazmaya çalıştığınız adres hatalı.Hangi işlemciyi kullanıyorsunuz?Şayet F1 serisini kullanıyorsanız Flash memory 0x08000000 den itibaren başlıyor.Kullandığınız işlemcinin datasheetindeki Memory Map kısmını kontrol etmenizi öneriyorum.Dikkat etmeniz gereken bir diğer nokta da, şayet flash memory 0x08000000 adresinden başlıyorsa datanızı o adresten itibaren yazmaya başlamayın.Çünkü yazdığınız programın koduyla çakışabilir.F1 serisi için verdiğim örnekteki adresi kullanabilirsiniz.