STM32 READ / ERASE / WRİTE FLASH

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

cagri_dinc

/**********************************************************************************************************************
READ / ERASE / WRİTE FLASH PROGRAM
Project:Çağrı Dinç February 2014 İstanbul
Debugger:IAR Embedded Workbench IDE 6.5
Microcontroller:STM32F100RBT6
Referance:Programming Manual Flash Programming Datasheet
************************************************************************************************************************/
#include "stm32f10x.h"
///////////////////// DEĞİŞKEN TANIMLAMALARI ////////////////
uint16_t Read_Data;     
/////////////////////////////////////////////////////////////
void SystemInit(void)
{
}
/////////////// İSTENİLEN ADRESTEKİ BİLGİYİ FLASHTAN OKUMA ALT PROGRAMI /////////////////
uint16_t Read_Flash(uint32_t  adr)
{
  uint16_t * Pntr = (uint16_t *)adr;
  return(*Pntr); 
}
///////////////// FLASH KİLİDİ AÇMA ALT PROGRAMI /////////////////////   
void Unlock_Flash (void)
{
  FLASH->KEYR=0x45670123;  //Flash kilidini açmak için FLASH->KEYR registerine KEY1 ve KEY2 sırayla yazılmalıdır
  FLASH->KEYR=0xCDEF89AB;
}
///////////////// FLASH KİLİTLEME ALT PROGRAMI /////////////////////
void Lock_Flash (void)
{
  FLASH->CR=0x00000080;  //FLASH_CR registeri resetlendiğinde FLASH kiltlenmiş olur
}
//////////////// İSTENİLEN ADRESTEKİ VERİYİ FLASHTAN SİLME ALT PROGRAMI //////
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!)
}
///////////////// İSTENİLEN ADRESE VERİ YAZMA ALT PROGRAMI /////////////////////
void Write_Flash (uint32_t adr, uint16_t data)
{
  FLASH->CR|=0x00000001;           //PG enable
  *(__IO uint16_t*)adr = data;     //istenen adrese istenen data yazılıyor
  while((FLASH->SR&0x00000001));   //İşlem bitene kadar bekle(BUSY kontrol ediliyor)
}
//////////////////////////////////////////////////////
int main(void)
{
Unlock_Flash();
Erase_Flash(0x0801FB00);   
Write_Flash(0x0801FB00,'c');
Lock_Flash();
Read_Data=Read_Flash(0x0801FB00);
for( ;; )
{   
}
}




MT

Sağolasın kardeşim heralde herkes biliyor böyle zor bulunan bir uygulamayı. Emeğine sağlık.

tekosis

elinize sağlık. hemen favorilere ekliyorum.
İlim ilim bilmektir, ilim kendin bilmektir, sen kendin bilmezsin, bu nice okumaktır.

cagri_dinc

Rica ederim arkadaşlar inşallah faydası olmuştur.

z

Daha önce bu konuyla hiç ilgilenmedim dokümanlara da bakmadım.

Flash roma page page yazılmıyormu? Örnekte 16 bit veri yazılmış. Bu garibime gitti.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Klein

Hayır hocam. Byte/word  olarak yazılabiliyor. Hatta yazılan bir hücrenin  1 lan bitleri tekrar 0 da yapılabiliyor.
Ancak 0 olmuş bir biti tekrar 1 yapamıyorsunuz. Bunun için de komple Page silmek gerekiyor.

yamak

Hocam bu konuda bizi biraz aydınlatabilir misiniz?Stm32f407'de flash'a veri yazmak istiyorum.Ama anlamadığım bazı yerler.Kaba taslak izleyeceğim adımları anlatabilir misiniz?

Klein

 ST'nin Flasha veri kaydetmek için yayınladığı "eeprom emulator" kodları var.  Sanırım stm32F1 içindi.  F4'ün flash donanımını incelemedim hiç. Ama ufak tefek değişikliklerle F4 için uygulanabileceğini düşünüyorum.
Flash'ı oldukça efektif kullanmamızı sağlayan bir mantığı var.  Yanılmıyorsam "Örnekler" kategorisinin altında "Neden eeprom koymamışlar" başlıklı bir konuydu.  Orada bu mesele hakkında konuşulmuştu.

Ben olsam oradan başlardım.

yamak

Hocam o sayfayı az çok okudum sayılır.Benim hıza pek ihtiyacım yok.Yani gerekli yeri silip tekrar yazabilirim.Çok sık aralıklarla da yazmayacam.O yüzden eeprom emülasyonu yapmadan direkt yazsam olur mu?Bir de mesela bana 128 kb yetiyo.Son 128 kb lık sektor de bu yazma işlemlerini yapsam sorun çıkar mı?

cagri_dinc

Z hocam half word(16bit) şeklinde yazılmak zorunda. Programming Manual Flash Programming Datasheet 13.sayfadaki algoritmaya da bakabilirsiniz.Bir de flasha yazacağımız başlangıç adresi doğru seçilmeli.Örneğin sayfa sonundaki son byte a veri yazılmaya kalkışılırsa işlemci düzgün çalışmıyor.Başlangıçta dalgınlıkla böyle bir adres seçmiştim, uyanana kadar uğraştırdı.ST nin forumlarında da benzer sıkıntıları çekenler vardı.
Klein da söylediği gibi F4 için Flasha yazma kısmı  F1 e benzer, bir kaç değişiklik yaparak  halledilebilir.Başka bir arkadaş ST nin kodları ile F4 kitindeki flashı kullandı oradan biliyorum.

tekosis

hocam mikroc de flashwrite, flasherase gibi komutlar var sanırım bu komutlar dediğiniz işlemleri yapıyor ancak ben hangi hafıza alanının boş olduğunu, hangisini eeprom gibi kullanabileceğimi nasıl belirlerim. yani demek istediğim yanlışlıkla programa zarar verirmiyim? yöntem nedir?
İlim ilim bilmektir, ilim kendin bilmektir, sen kendin bilmezsin, bu nice okumaktır.

muhittin_kaplan


Klein

@yamak Hız sorunun yoksa, flash ömrünü kısaltacak kadar sık yazma okuma da yapmıyorsan eeprom emülasyonu kullanmayabilirsin.  Gerekli yerleri silip yazabilirim demişsin. Komple sayfayı silmen gerektiğini unutma.  işlemciye göre 1K ile 16K arasında olabilir.  belki daha da fazla. 

@tekosis  Her szman son sayfaları kullanırsan sıkıntı yaşayacağını zannetmem.

yamak

Hocam veri tabanı kaydetmeyi planlıyorum ve sık sık güncellemede yapılacağını zannetmiyorum.stm32f407vgt6 kullanıyorum ve bu işlem için son sektörü kullanmayı planlıyorum son sektörün boyutu da 128 kb.
Peki hocam programı yazdıktan sonra flash'ta boş kalan yerleri okuduğumda nasıl bir değer okumuş olurum.0xFFFFFFFF mi?

muhittin_kaplan