STM32 READ / ERASE / WRİTE FLASH

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

MrDarK

Yaparsın hocam;

Harici yazılımış bootloader yazılımları buna örnek olabilir. Ana programın dışında birde bootloaderın çalışması için kod yazıp hangisini çalıştırmak istiyorsan onun start vektorüne göndermen yetiyor. Eminim daha doyurucu bilgiler vardır üstadların fakat ben stm8'de dediğim gibi yaptım. STM32'dede section açma şekilde yapılıyor olsa gerek.
Picproje Eğitim Gönüllüleri ~ MrDarK

justice_for_all

#if defined(BOOT_FROM_BANK1)
  /* Set the vector table to the Bank1 start address */
  NVIC_SetVectorTable(NVIC_VectTab_FLASH, BANK1_START_ADDRESS);
#elif defined(BOOT_FROM_BANK2)
  /* Set the vector table to the Bank1 start address */
  NVIC_SetVectorTable(NVIC_VectTab_FLASH, BANK2_START_ADDRESS);
#endif /* BOOT_FROM_BANK1 */


bir ornekte şu şekilde göstermiş ama ön işlemci komutlarıyla bunu program çalışırken nasıl yapabiliriz ki?
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

MrDarK

Kodda yanlış anlamadıysam vektör tablosunu kaydırmak bahsediyor. Yazılımların ayrı olması lazım sizin örneğinizde. Bu verdiğiniz kodlarda ön işlemci kodları ile kaydırma yapmış sadece diye görüyorum. Ayrı ayrı 2 software olması gerekiyor bence.
Picproje Eğitim Gönüllüleri ~ MrDarK

justice_for_all

#48
ben biraz araştırayım hocam eğer sizde örneğe anlatıma filan denk gelirseniz burda paylaşırsanız sevinirim.

mesaj birleştirme:: 21 Mayıs 2015, 15:14:50

bişeler buldum

http://www.st.com/web/en/catalog/tools/FM147/CL1794/SC961/SS1743/LN1734/PF257844
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

burak1000

#49
Merhabalar; belki konuyu hortlatmış olacağım ama lazım olan birisi okursa işine yarayabilir. hem o
cagri_dinc ' e paylaşmış olduğu kod için teşekkür ederim öncelikle.

Flash hafızaya yazacağız ama ya yazdığımız yerde program kodları varsa. evet kesinlikle bu mümkün bu yüzden önlem almalısınız. bunun için benim kullandığım ve önerdiğim yöntem şudur.

const uint8_t My_Page[1024] @ 0x0800F000; 

öncelikle yukarıda olduğu gibi bir değişken tanımlaması yaparsanız derleyici My_Page adında 1kbyte'lık bir bölümü sizin için ayırır ve buraya kod yazmaz. eğer kullandığınız derleyicinin flash sayfaları 2Kb is o zaman 2048byte uzunluğunda bir değişken tanımlayın. 

bu değişkeni ekledikten sonra derleyicilerin %90'nı bu değişken yokmuş gibi davranır (optimizasyon) bunun önüne geçmek için program içinde
"0x0800F000" kullanmak yerine doğrudan "My_Page" ismini kullanın böylece derleyici sizin bu değişken alanını gerçekten kullandığınızı anlar ve bu kısmı boş bırakır.

*Düzeltme:
eğer;
const uint8_t My_Page[1024] @ 0x0800F000 ="ali-veli";
şeklinde bir atama yaparsanız bu sefer derleyici yine 9 byte'lık bir alan ayıracaktır. 1024 byte yalan olur yani.  bu şekilde yapmayın.

tabi unutmamalı ki değer yazma ve okuma işlemlerini  program içindeyken My_Page[n] şeklinde değil. flash okuma ve yazma fonksiyonları üzerinden yapmalıyız.

STM32 serisinde medium-density   yada high-density gibi ürün grupları var her ürün grubunun sayfa büyüklüğü değişken. bunu işlemcinizin manualında bulabilirsiniz. cagri arkadaşımızın dediği gibi en son page'e veri yazmamak lazım. en sondan 1 önceki page'dan geriye doğru istediğiniz kadar page adresleyebilirsiniz yukarıda olduğu gibi.
seçtiğimiz adres mutlaka bir page'nin başlangıcı olmalı. :)


Benim kullandığım işlemci 64kb hafızaya sahip 1kb lık sayfaları olduğundan ben 60.kb'dan itibaren 1kb yer ayırıp kullandım.



enrique_iglesias

#50



EDİT : Aşağıdaki kod ile bir adrese veri yazıyorum, kalıcı olarak duruyor, ama daha sonra while döngüsü içinde buton ile 2 byte fazlası adrese veri yazmak istediğimde önceki yazdığım veri siliniyor, veritabanı gibi kullanmak istiyorum, nasıl düzeltebilirim?

int main()
{
  uint32_t add=0x0801F002;  //Bir adres seçtim
  HAL_FLASH_Unlock();  //Flash kilidimi açıyorum
  Erase_Flash(add); //Adres dolu olsada olmasada sil
  HAL_FLASH_Program(TYPEPROGRAM_HALFWORD,add,1);  //belirttiğim adrese 1 yazıyorum
  HAL_FLASH_Lock(); //Flash kilidimi kapatıyorum

  while(1)
  {
    if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==1)
		{
			HAL_Delay(250);
			HAL_FLASH_Unlock();
			Erase_Flash(add+2);
			HAL_FLASH_Program(TYPEPROGRAM_HALFWORD,add+2,1);
			HAL_FLASH_Lock();
		}
  }

}

void Erase_Flash (uint32_t adr)
{
  FLASH->CR|=0x00000002;            
  FLASH->AR=adr;                    
  FLASH->CR|=0x00000040;            
  while((FLASH->SR&0x00000001));    //Islem bitene kadar bekle
  FLASH->CR &= ~0x00000042;         

}

Tatala

Merhabalar,
Hocam,"Erase_Flash(add+2);" dediğin zaman page komple siliniyor, bu yüzden eski yazdığın gidiyor. Bende bu durum ile cebelleşiyorum şuan. Sayfanın tamamını silmeden kayıtlı veriyi özgürce değiştirmenin bir yolu yordamı yok mu?

skara1214

Herkes ölür ama herkes gerçekten yaşamaz

deneme_1234

stm32 de hafızaya yazma okuma yaparken interrupt durma gibi bir durumla karşılaşıyor musunuz? kullandığım işlemci stm32f103

quarko

Alıntı yapılan: deneme_1234 - 01 Mart 2017, 16:34:21
stm32 de hafızaya yazma okuma yaparken interrupt durma gibi bir durumla karşılaşıyor musunuz? kullandığım işlemci stm32f103

Ben karşılaşıyorum, evet. Örneğin 4x3 7segment display tararken flash a yazma yaptığımda önce tüm page i silmek zorunda olduğum için bir süre kesinti oluyor. Bu esnada ne oluyor tam bilmiyorum. Bu yüzden direk yazma yerine St nin EEPROM Emulation örneğindeki driverlerı kullanıyorum. Orada iki page i yedekli olarak kullanıyor. Ve her yazdığınız veriyi sanal bir adres ile birlikte yazdığınız için her seferinde tüm page i silmek zorunda kalmıyorsunuz. Page dolduğunuda diğer page e geçip önceki siliniyor. Silinmeden önce de eski page teki son veriler yeni page in başına kopyalanıyor. Güzel bir algoritması var. Tavsiye ederim.Kesintiyi engellemiyor ama sadece page geçişlerinde olduğu için hissedilmiyor.
"Aslanlar kendi hikayelerini yazmadıkça, avcıların kahramanlık hikayelerini dinlemek zorundayız."

deneme_1234

Peki eeprom yazma bölümünü RAM ya da ROM'a taşımak fark yaratıyor mu?

yldzelektronik

Selamlar.Bir sorum var.


St'nin yayınladığı emulator kullanarak dahili flash alanını kullansam, 32 bit bazı değişkenleri nasıl saklarım?İkiye bölmeden yapabilir miyim?


Emulatorde 32 bit bir alanın 16bit data 16bit Virtual address olarak kullanılıyor. Ancak ben elimdeki 32bit datayı bölmeden saklayamaz mıyım?
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

serkan

32 biti 2 adet 16 bite çevirip öyle yazıyoruz.dahili hafıza blokları 16 bit. okurken 16 bitleri birleştiriyoruz.

SAMAH

hello mr enr
Alıntı yapılan: enrique_iglesias - 11 Şubat 2017, 21:44:19



EDİT : Aşağıdaki kod ile bir adrese veri yazıyorum, kalıcı olarak duruyor, ama daha sonra while döngüsü içinde buton ile 2 byte fazlası adrese veri yazmak istediğimde önceki yazdığım veri siliniyor, veritabanı gibi kullanmak istiyorum, nasıl düzeltebilirim?

int main()
{
  uint32_t add=0x0801F002;  //Bir adres seçtim
  HAL_FLASH_Unlock();  //Flash kilidimi açıyorum
  Erase_Flash(add); //Adres dolu olsada olmasada sil
  HAL_FLASH_Program(TYPEPROGRAM_HALFWORD,add,1);  //belirttiğim adrese 1 yazıyorum
  HAL_FLASH_Lock(); //Flash kilidimi kapatıyorum

  while(1)
  {
    if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==1)
      {
         HAL_Delay(250);
         HAL_FLASH_Unlock();
         Erase_Flash(add+2);
         HAL_FLASH_Program(TYPEPROGRAM_HALFWORD,add+2,1);
         HAL_FLASH_Lock();
      }
  }

}

void Erase_Flash (uint32_t adr)
{
  FLASH->CR|=0x00000002;            
  FLASH->AR=adr;                    
  FLASH->CR|=0x00000040;            
  while((FLASH->SR&0x00000001));    //Islem bitene kadar bekle
  FLASH->CR &= ~0x00000042;         

}





mr enrike did yu find solution for flash writing using HAL functions ???plz can you share with us thanks

görkem

Arkadaşlar Merhaba,
Yeni konu açmak istemedim flash ile ilgili bir problem yaşıyorum  kullandığım işlemci stm32f103 flashı silebiliyorum fakat veri yazamıyorum kullandığım yazılım konunun başındakiyle aynı adrese kadar aynı kullanıyorum veri yazamıyorum başka bir ayrıntı varmı yapmamız gereken mesela hex i cip e atarken ?