MSP430 Flash Memory Controller

msp430_chipBu yazımızda MSP430 2x serisi modellerde bulunan Flash Memory Controller birimini inceleyeceğiz. Bilindiği gibi çoğu ileri düzey uygulamalarda ihtiyaç duyulan daha yüksek RAM hafıza isteği bazen bize büyük ölçüde sorunlar çıkarabilmektedir. Veya kullandığımız mikrodenetleyicide eğer flash hafızaya yazma özelliği bulunmuyorsa bu ihtiyaçtan dolayı harici bellek(EEPROM,RAM) gibi birimlere de ihtiyaç duyabilmekteyiz. Bu problemlerden dolayı bir üst düzey modele geçmek veya ekstra malzeme kullanmak maliyet ve zaman kaybına yol açabilmektedir. MSP430’larda bulunan Flash Memory Controller sayesine bu sorundan büyük ölçüde kurtulabiliyoruz.

Bu yazıda MSP430 içerisindeki flash hafızaya, program içerisinden nasıl erişebilebileceğini ve uygulamada ne gibi unsurlara dikkat edileceğini anlatmaya çalışacağım.

Öncelikle MSP430 Flash Memory Controller biriminin temel özelliklerinden bahsedelim.

  1. Dahili programlama voltajı üretebilme
  2. Bit,Byte yada Word erişim
  3. Düşük akım harcama
  4. Segment silme ve tüm ana bellek bölgesini silme(Mass Erase)

blokdiyagram_fctl

 

Yukarıdaki blok diyagramdan da görüleceği gibi bu birim, bünyesinde temel olarak saklayıcılar,zamanlama üreteci ve programlama voltajı üretici donanımlarını barındırıyor.

Burada Programming Voltage Generator kısmı için küçük bir not düşmekte fayda var : Flash hafızaya erişim(yazma/silme) işlemleri minimum 2.2V Vcc gerilimi olduğu zaman gerçekleşebilmektedir. Bilindiği gibi MSP430’larda stabil çalışma için gerekli olan Vcc gerilimi 1.8v – 3.6v arasıdır. Fakat eğer program içerisinde flash hafızaya erişim gereksinimi duyuyorsanız Vcc gerilimi minimum 2.2v olmalıdır. Aksi takdirde okuma/silme işlemi başarısız olacaktır.

MSP430 Flash Memory Controller biriminin -önemli olarak sayabileceğimiz- 16 bitlik toplam 3 adet saklayıcısı bulunmaktadır. Bunlar : FCTL1, FCTL2 ve FCTL3 saklayıcılarıdır. Bu saklayıcıların tümünün yüksek değerlikli baytı yani son sekiz biti flash hafızaya erişim için gerekli olan şifre kısmından oluşmaktadır.

Bu 3 saklayıcıdan herhangi birinin içerisine bir değer yazmak veya okumak istiyorsak bu 8 bitlik kısıma 0x96 veya 0xA5 değerleri yazılmalıdır.

Bunun için IAR’da tanımlanan header dosyası içerisindeki şu değerleri görebilirsiniz.

FWRKEY

Temelde bu kadarını bildikten sonra geri kalanı silmek için ERASE bitini set etmemiz ve yazmak için ise WRT bitini set etmemizden ibarettir.

Flash Hafıza Segmentasyonu

MSP430’lar içerisinde flash hafıza birimi farklı segmentlerden oluşmaktadır. Bunları temelde 2 grup altında birleştirebiliriz.

  1. Ana Bellek
  2. Kullanıcı Belleği

Ana Bellek kendi içerisinde 64’e kadar segmentlere ayrılabilmektedir. Kullanıcı Belleği ise temelde 4 segmentten oluşmaktadır(2x serisi için). Kullanıcı Bölgesi ise her biri 64 byte’lık toplam 4 adet segmenti temsil ediyor. Aşağıda flash hafıza segmentasyonunun nasıl olduğunu gösteren bir blok diyagram yer alıyor.

segmentasyon_fctl

Segment A

Burada Segment A kısmı diğer segmentlerden farklı bir yapıya sahip. Bu segment FCTL3 saklayıcısında bulunan LOCKA biti ile yazma/silmeye açılıp kapatılabiliyor. Eğer LOCKA = 1 ise bu segment kilitli duruma geçiyor ve programlama esnasında herhangi bir erişim yapılamıyor. Hatta Mass Erase(tüm hafıazyı silme) işleminde bile bu bölge koruma altında tutuluyor.

Eğer LOCKA = 0 ise bu bölgeye aynı diğer segmentler gibi erişim yapılabiliyor.

 

Flash Hafıza için Pals(Zamanlama) Üreten Birim

Bu birim flash hafızaya erişim için en önemli kısım olarak nitelendirilebilir. Çünkü tüm okuma ve yazma işlemleri için gerekli olan uygun frekanstaki palsler, bu birim tarafından üretilmektedir.

Aşağıda bu birimin blok diyagramı görülmektedir.

zamanlama_ureteci

 

Yukarıdaki diyagramdan da anlaşılacağı gibi standart olarak 3 işaret kaynağımızı da bu birim için kullanabiliyoruz. Ve hemen arkasından gelen frekans bölücü(divider) kısmıyla fFTG frekansını uygun düzeyde ayarlayabiliyoruz. Bu frekans bölücü kısmı en az 1 ile en fazla 64 olabiliyor ve çıkış frekansımızın ayarlanması açısından büyük önem taşıyor.

Burada çıkış frekansının uygun olması durumu tamamen mikrodenetleyiciye özgü bir parametre aslında. Bizim kullandığımız MSP430G2452 mikrodenetleyicisinin datasheetinde bu parametre aşağıdaki gibidir.

fFTG

 

Burada maksimum  fFTG frekansı 476kHz olarak belirtilmiş. 1MHz’lik(gerçekte ~952kHz) bir SMCLK frekansını 2’ye bölersek flash hafıazaya yazma ve okuma işlemleri için uygun olan  fFTG frekansını elde etmiş oluruz. Bunun için divider parametresinin ilk bitin set etmemiz yeterli(bu parametrenin en az 1 değerini aldığını hatırlayın). Divider parametresine yazacağımız her değer üzerine donanımsal olarak 1 değeri eklendiğinden dolayı bizim bu parametre değerini 1 yapmamız yani sadece ilk bitini set etmemiz sonucu frekans bölücü değerimiz 2 olacaktır. Bu da bizim için gereken uygun  fFTG frekansının üretilmesini sağlayacaktır.

Flash Hafızayı Silme

Flash hafızayı silme işlemi FCTL1 saklayıcısı içerisindeki ERASE ve MERAS bitlerinden yapılmaktadır. Bu bitlerden ilki(ERASE) sadece ilgili segmenti silmekte ikincisi(MERAS) ise LOCKA bitine göre ya tüm hafızayı silmekte veya Segment A haricindeki tüm hafızayı silmektedir.

silme_fctl

Flash hafızaya erişim yani yazma/silme şu şekilde çalışmaktadır. Yazının başında bahsettiğimiz Programming Voltage Generator birimi ilk önce yazma/silme işlemi için gerekli olan gerilimi üretmektedir ve hemen arkasından yazma/silme işlemi başlamaktadır. Tam bu anda BUSY biti 1 olmaktadır. Bu işlem tamamlandığında programlama voltajı üreten birim artık gerilim üretme işini sonlandırmaktadır ve BUSY biti tekrar 0 olmaktadır.

silmezamanlama_fctl

 

Yukarıdaki resimde görüldüğü gibi silme işlemi için iki farklı zaman değeri yer almakta. Mass Erase için gerekli olan süre Segment Erase için gerekli olan sürenin neredeyse iki katı. Eğer 1MHz’lik bir SMCLK kaynağında silme işlemini gerçekleştiriyorsak;

  • Mass Erase için : fFTG = SMCLK/2 = 1MHz/2 = ~500kHz,   tmass erase = 10593/fFTG = ~21.186mS
  • Segment Erase için : fFTG = SMCLK/2=1MHz/2=~500kHz, tsegment erase = 4819/fFTG = ~9.638mS

Bu zaman değerleri, silme işleminden ziyade yazma işlemi işlemi için büyük önem taşıyor.

Flash Hafızaya Veri Yazma

Flash hafızaya veri yazma işlemleri de yine aynı şekilde FCTL1 saklayıcısı üzerinden yapılmaktadır. Bu saklayıcı içerisinde veri yazmak için kullanılan toplam 2 bit bulunmaktadır. Bu bitler byte/word yazmak için WRT, blok halinde veri yazmak için(64 byte lık bir adet segmente karşıkık gelir) BLKWRT bitlerini kullanıyoruz. Aşağıdaki tabloda kullanacağımız moda göre set etmemiz gereken bitler yer alıyor.

yazma_modlari

 

Byte/Word Yazma

Bu modda flash hafızaya her seferin de 1 byte ya da word(2 byte) veri yazılabilmektedir. Yazma işlemi sırasında aşağıdaki zamanlama diyagramında görüldüğü gibi programlama voltajı başlangıçta aktif olmakta ve yazma işlem bitince tekrar deaktif olmaktadır. Her bir yazım işlemi ortalama 27 ila 30 fFTG darbesinde yapılmaktadır. Yazma işleminin sonlanıp sonlanmadığı BUSY biti kontrol edilerek öğrenilebilir. Bu işlem FCTL1 saklayıcısndaki WRT biti set edilerek başlatılmaktadır.

yazmazamanlama_fctl

 

Eğer 1MHz’lik(Gerçekte 952kHz) bir SMCLK kayağı kullanıyorsak uygun yazma süresi için bunu 2’ye böldüğümüzde;

  • SMCLK / 2 = 952 / 2 = 476kHz, fword write = 30 / fFTG = 30 / 476000 = ~63uS
    Yukarıdaki hesaptan da anlaşılabileceği gibi her bir word yazım işlemi yaklaşık olarak 63uS’de tamamlanıyor. Yazımın sonunda bunu ispatlayan bir görüntü paylaşacağım.

Segment Halinde Yazma(64 Byte)

Bu mod genelde büyük hafıza bölgelerinin yazımı için kullanılır(Örn: diziler gibi). Yazma işlemi tüm segment üzerine yapıldığından dolayısiyle yazma için için harcanan zaman da byte/word yazmaya göre daha fazla olacaktır. Her bir segment ortalama 4mS de tamamen tekrar programlanabilmektedir. Bu işlem FCTL1 saklayıcısndaki WRT ve BLKWRT bitleri set edilerek başlatılmaktadır.

Bu modun byte/word yazmaya göre en büyük avantajı : tüm segment yazımı boyunca programlama voltajını hiç sonlanıdırmamasıdır. Bu da eğer yazacağınız alan tamamen 64 byte olmasa da bunun segment halinde yazılmasının byte/wrod halinde yazılmasından daha avantajlı olacağı anlamına gelmektedir. Çünkü aşağıdaki diyagramda da görüldüğü her voltaj aktif/deaktif etme süresi 6/fFTG süresinde tamamlanıyor. Dolayısiyle de uzun byte/word işlemlerinde bu kayıptan dolayı segment halinde yazmak daha avantajlı oluyor.

 

yazmazamanlamablok_fctl

 

Yazma/Silme İşleminin Harcanan Akıma Etkisi

Bu yazma/silme işlemleri sırasında normalden bir miktar daha fazla akım çekilmektedir. Bunun sebebi ise Programming Voltage Generator biriminin yazma/silme işlemi için ekstra gerilim üretmesidir. Bu işlemlerin gerçekleşmesi esnasında ne kadar akım çekildiği mikrodenetleyiciye özgü datasheet’de yaklaşık değer olarak verilmiştir. MSP430G2452 için bu değerler aşağıdaki gibidir.

silme_yazma_akim

Uygulama

Yukarıda anlatılan silme ve yazma işlemleri dikkate alındığında aşağıdaki gibi bir flash_yaz fonksiyonu yazılabilir.

flash_yaz   
void flash_yaz(unsigned int adres, char* buffer, char uzunluk)
{
   int i = 0;
   char *flash_ptr = 0;                      // Flash pointer tanımlanıyor...

   flash_ptr = (char*)adres;

   if (uzunluk >=64)
   {
    // Her segment maksimum 64 byte uzunluğunda olabilir.
    return;
   }

   FCTL3 = FWKEY;                            // LOCK biti temizlendi.
   FCTL2 = FWKEY + FSSEL_2 + FN0;            // fFTG = 257kHz < SMCLK/2 < 960kHz
 
   FCTL1 = FWKEY + ERASE; //+ EEI;           // ERASE = 1 yapıldı.
   *flash_ptr = 0;                          

   FCTL1 = FWKEY + WRT;                      // WRT = 1 yapıldı.
   // Yazma Başladı
   for (i = 0; i < uzunluk; i++)
   {
      *flash_ptr++ = buffer[i];              // Değerler flash hafızaya yazılıyor...
   }
   // Yazma Bitti

   FCTL1 = FWKEY;                            // WRT = 0 yapıldı.
   FCTL3 = FWKEY + LOCK;                     // LOCK biti koruma için tekrar set edildi.
}

 

Yukarıda anlatılan yazma işleminde verilen zamanlamanın ne kadar doğru olduğunu test edildiğinde(byte/word modu için) sonuçlar aşağıdaki gibi çıkıyor.

flash_sure

smclk_freq

Yukarıdaki ilk resimde flasha yazma süresi 1 word için Width değerine bakıldığında 81.0833uS olarak görünüyor. İkinci resimde ise SMCLK frekansı stabil değerde 960kHz olarak görünüyor. Byte/wrod yazma kısmındaki hesaplamalara bakıldığında arada yaklaşık olarak 20uS’lik bir fark var. Aslında hesaplanan değerden biraz fazla uzakta ama bunun mikrodenetleyiciye göre farklılık göstereceğini düşünüyorum. Eğer G sersisi Value Line bir mikrodenetleyici değil de F sersi bir model kullansaydık nisbeten daha iyi sonuçlar alabilirdik.

 

Örnek olarak 0x1000 adresine(Segment D) RAM’de bulunan 18 byte’lık “www.fatihinanc.com” adlı dizi yazıldığında IAR’da debug altında bu bölgeyede değişiklikler aşağıdaki gibi olmaktadır.

Sol tarafta hafızanın programlanmadan önceki hali ve sağ tarafta ise programlandıktan sonraki hali yer alıyor.

hafiza

Saklayıcılar

 

FCTL1_reg

FCTL2_reg

FCTL3_reg

 

Sonuç olarak MSP430 içerisindeki bu birimin kullanımın kolay olması sebebiyle oldukça işe yarayacağını düşünüyorum. Sorularınız olursa Yorumlar kısmından bana ulaşabilirsiniz.

MSP430 Flash Memory Controller” üzerine 2 düşünce

  1. Ahmet

    merhaba hocam flash hafizaya ne kadar veri yazabiliriz. Ben flash hafızasına 1000 BYTE’lık veri yazmak istiyorum bu mümkün mü?

    Cevapla
    1. M.Fatih İNANÇ Yazar

      Merhaba,

      Flash Hafızaya tek seferde 1k veri yazmak mümknün değil. Zaten yazıda da belirttiğim gibi flash hafızanın kullanıcıya ayrılan kısmı 64byte lık segmentlere ayrılmış. Her segmente ancak 64b veri yazabilirsiniz.

      Cevapla

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir