EEPROM neden koymamışlar ?

Başlatan muhittin_kaplan, 24 Ocak 2013, 17:37:18

X-Fi

Hiç ölçmedim hocam bildiğim kadarıyla Vcore voltajına göre süre değişiyor 1.2V en uzun sürede yazıyor 1.5V 1.8V daha hızlı yazabiliyor. Hızlı olmasının sizce bir avantajı varmı? hız istiyorsanız ram e yüklersiniz DMA yardımıyla veya bir flag kesmesiyle geniş zamanda flash a aktarmaya devam edersiniz.
http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

SpeedyX

EEPROM da neymiş? Biz tüm devrelerdeki eepromları atıp, flash yaptık, üstünden yıllar geçti. PIC de program hafızası 2K olduğundan 250 byte eeprom koymuşlar. ARM da 512K esnek hafıza, ister eeprom ister kod tutmak için kullan :)

OG

EEPROM'un tek avantajı silmeden direk ilgili hücreye tek adres olarak yazıyoruz.

Flash bellekde önce siliyoruz (PIC için genelde 64 adres birden siliniyor) sonra 8 li veya katları olarak hücreyi doldurarak yazıyoruz.
Yani silme bloğu 64 adres, yazma bloğu 8 adres (elemana göre değişebilir) okuma bloğu tek adres.
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

camby

#18
kullanım alışkanlıklarını değiştirmek lazım biraz o zaman..

@X-Fi , şu haliyle de iş görüyordu zaten de tabi de , hızın da zararı yok. EEPROM'da 3ms byte yazma süresi vardı. 1k yazarken 3 saniye süre alıyordu.

Flash karakteristiğine baktım biraz : (F4)

tprog Word programming time -  16(typ) 100μs(max)
16KB Sector (16 KB) erase time - 400 800ms
Vprog Programming voltage
32-bit program operation 2.7 - 3.6 V
16-bit program operation 2.1 - 3.6 V
8-bit program operation 1.8 - 3.6 V

Endurance : 10 kcycles
Data retention : 10-20-30 yıl diye gidiyor..


mesaj birleştirme:: 25 Ocak 2013, 00:50:53

EEPROM'un da fiziksel avantajları olabiliyor :

25lc512 :

High Reliability:
- Endurance: 1 Million erase/write cycles
- Data Retention: >200 years

OG

Alıntı YapEEPROM'un tek avantajı
Tabi "tek" değil diğer ömür yazma vs işleri dikkate almamıştım.
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

haydarpasamikro

İşlemcinin değişmesi durumuna karşı salt data, konfig., ayar vs.. bilgiler de gider. Ayrıca geniş veri depolama için kullanışlı değil. TV ler de bile kullanıcı dataları harici i2c veya spi eepromlar da tutulur.
Mikro Dünyası.Haydarpaşa Teknik ve Endüstri Meslek Lisesi Mikrodenetleyici Atl. Şefi

Klein

Alıntı yapılan: ilhan_mkp - 24 Ocak 2013, 21:44:37
en önemlisi kalıcı değer yazmak için bu kadar kodmu gerekiyor başka yolu yokmu
zaten bu library olayına bi alışamadım bir ks0108 ile resmen boğuşuyorum yazsam ikinci aşama menü için kalıcı değerler duman oldum
hobi için öğreniyom bide  ;D

Bu kadar kod Flash'a yazma için değil. 
Flash'ın ömrünü uzatmak ,  flash'a yazarken enerji gitmesi durumunda, son kaydedilen en iyi veriyi tekrar yükleyebilmek için gerekli.


Koda ilk baktığınızda çok anlamsız işler yapılmış diye düşünüyorsunuz. Ancak kodun tamamını biraz dikkatli incelediğinizde çok sağlam bir mantık üzerine kurulmuş, güzel bir algoritma olduğunu anlıyorsunuz.


SpeedyX

FRAM çıktı endurance problemi çözüldü...

LukeSkywalker

#include <built_in.h>

unsigned long buff[32];
unsigned long i, tmp;
unsigned long Address = 0x08008000;
unsigned long Address2 = 0x08009000;
unsigned long* ptr;

void main() {
  GPIO_Digital_Output(&GPIOD_BASE, _GPIO_PINMASK_ALL);    // digital output PORTD
  GPIO_Digital_Output(&GPIOE_BASE, _GPIO_PINMASK_ALL);    // digital output PORTE

  for(i=0; i<32; i++)
    buff[i]=i+(i<<16);

  FLASH_ErasePage(Address);            // erase block (Address must be 2048 byte aligned)
  for(i=0; i<32; i++)
    FLASH_Write_Word(Address + i*4, buff[i]);     // write buffer with 32 long words

  ptr = (unsigned long*)Address;
  for(i=0; i<32; i++) {
    tmp = *ptr;
    GPIOD_ODR = HiWord(tmp);
    GPIOE_ODR = LoWord(tmp) << 8;
    ptr++;
    Delay_ms(50);
  }

  Delay_ms(1000);
  FLASH_ErasePage(Address2);            // erase block (Address must be 2048 byte aligned)
  FLASH_Write_HalfWord(Address2, 0xAAAA); // write one word
  GPIOD_ODR = 0;
  ptr = (unsigned long*)Address2;
  i = *ptr;
  GPIOE_ODR = (LoWord(i)) << 8;
  
}


MikroC'de baya bi basitleştirmişler bunu..

muhendisbey

Zulmü alkışlayamam, zalimi asla sevemem; Gelenin keyfi için geçmişe kalkıp sövemem.

Mucit23

Arkadaşlar eeprom denemesi yapan oldumu. Ben @ULAGA nın verdiği kod üzerinde çalışıyorum 1 saattir. Bir türlü derleyemedim.  :(
Bana bir örnek lazım

Klein

O örnek çalışıyor. Denendi.

Mucit23

Klein Hocam Kodlar üzerinde çalışıyorum.

eeprom.h ve eeprom.c diye iki adet dosya oluşturdum.

eeprom.h dosyası bu şekilde

[code]/******EEPROM .h*****/ 
#include "stm32f10x_lib.h"


#ifndef FLASH_EEPROM_H 
#define FLASH_EEPROM_H 

#define FL_EERPOM_StartAddr ((u32) 0x08017000) // start from address after 94kbyte flash size 
//#define FL_EERPOM_StartAddr ((u32) 0x08014000) // start from address after 80kbyte flash size 
//#define FL_EEPROM_EndAddr ((u32) 0x08012200) 
#define FL_EEPROM_EndAddr ((u32)	0x08017800) // 2K data size 
#define FL_EEPROM_PageSize ((u16) 0x400) // 1K 

/* Page status definitions */ 
#define ERASED ((uint16_t)0xFFFF) /* PAGE is empty */ 
#define RECEIVE_DATA ((uint16_t)0xEEEE) /* PAGE is marked to receive data */ 
#define VALID_PAGE ((uint16_t)0x0000) /* PAGE containing valid data */ 
typedef enum 
{ 
Data_8Bit =1, 
Data_16Bit, 
Data_32Bit 

} Data_typeDef; 

#endif 

/*****Flash eeprom.c*****/ 
/// user define function 


/**** Function : Write the internal Flash data****/ 
u16 Flash_EEPROM_Write_Data( u32 Start_Address, u16 *data, u16 No_of_Data, u8 Data_format) 
{ 
// u32 Write_Addr_Cnt=Start_Address; 
u32 End_Of_Address=0; 
FLASHStatus=FLASH_COMPLETE; 
FLASH_EEPROM_ProgramStatus= PASSED; 

FLASH_Unlock(); 

/*Start EEPROM*/ 
Flash_EEPROM_Addr= Start_Address; 
End_Of_Address= Start_Address +(No_of_Data * Data_format) ; 
/* Write page data*/ 
while((Flash_EEPROM_Addr<End_Of_Address) ) 
{ 

/* Verify if Address and Address+2 contents are 0xFFFFFFFF */ 
// if ((*( vu32 *)Flash_EEPROM_Addr) == 0xFFFFFFFF) 
//	{ 
switch(Data_format) 
{ 

case Data_8Bit : 

break; 


case Data_16Bit : 

FLASHStatus = FLASH_ProgramHalfWord(Flash_EEPROM_Addr, *data); 
if (FLASHStatus != FLASH_COMPLETE) 
{ 
return FLASHStatus; 
} 
Flash_EEPROM_Addr +=2; // point to next 2byte address 
data++; 
break; 
case Data_32Bit : 
FLASHStatus = FLASH_ProgramWord(Flash_EEPROM_Addr, *data); 
if (FLASHStatus != FLASH_COMPLETE) 
{ 
return FLASHStatus; 
} 
Flash_EEPROM_Addr +=4; // point to next 4byte address 
data++; 
break; 



} 
/* 
}	
else 
{ 
Flash_EEPROM_Addr +=4; // point to next 4byte address 
} 
*/	
} 
FLASH_Lock(); 
return FLASHStatus; 

}
[/code]

Buda eeprom.c dosyası

///////////////////////////////////////////////////////////////////////////////
/***************************
Function : Erase the internal Flash data
Input :- start address
- Number of page
Output: return the FLASH status

***************************/
u16 Flash_EEPROM_ErasePage( u32 Start_Address, u16 No_of_Size)
{
FLASH_Unlock();
FLASHStatus=FLASH_COMPLETE;
FLASH_EEPROM_ProgramStatus= PASSED;

Flash_EEPROM_Nb_Of_Page= No_of_Size; //
/*Clear all the flash */
FLASH_ClearFlag(FLASH_FLAG_BSY | FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR | FLASH_FLAG_OPTERR);

/*erase the page*/
for(EraseCounter=0; EraseCounter<Flash_EEPROM_Nb_Of_Page; EraseCounter++)
{
FLASHStatus = FLASH_ErasePage(Start_Address +(FL_EEPROM_PageSize* EraseCounter));

if (FLASHStatus != FLASH_COMPLETE)
{
return FLASHStatus;
}
}

FLASH_Lock();

return FLASHStatus;

}
****************************************/
u16 Flash_EEPROM_Read_Data( u32 Start_Address, u16 *dest_data, u16 No_of_Data, u8 Data_format)
{
u32 End_Of_Address=0;
/*
u32 *EEPROM_32Bit_p = (u32 *)Start_Address; // pointer point to address after 72kbyte flash size
u16 *EEPROM_16Bit_p = (u32 *)Start_Address;
u8 *EEPROM_8Bit_p = (u32 *)Start_Address;
*/
FLASHStatus=FLASH_COMPLETE;
FLASH_EEPROM_ProgramStatus= PASSED;


// FLASH_Unlock();
/*Start EEPROM*/
Flash_EEPROM_Addr= Start_Address;
End_Of_Address= Start_Address +(No_of_Data * Data_format) ;
while((Flash_EEPROM_Addr<End_Of_Address))
{
switch(Data_format)
{
case Data_8Bit : *dest_data = *(u8 *)Flash_EEPROM_Addr ; //
dest_data++ ;
Flash_EEPROM_Addr+=1;
break;


case Data_16Bit : *dest_data = *(u16 *)Flash_EEPROM_Addr ;
dest_data++;
Flash_EEPROM_Addr+=2;
break;


case Data_32Bit : *dest_data = *(u32 *)Flash_EEPROM_Addr ;
dest_data++;
Flash_EEPROM_Addr+=4;
break;
default: break;

}

}
FLASH_Lock();
return FLASHStatus;

}
/////////////////////////////////////////////////////////////////////////////////
/****************************************
Function : format the internal Flash data
Input :- start address
- Number of page
Output: return FLASHStatus;


****************************************/
u16 Flash_EEPROM_Format( u32 Start_Address, u32 End_Address)
{
FLASH_Unlock();
FLASHStatus=FLASH_COMPLETE;
FLASH_EEPROM_ProgramStatus= PASSED;

Flash_EEPROM_Nb_Of_Page= (End_Address- Start_Address)/FL_EEPROM_PageSize; //
if (Flash_EEPROM_Nb_Of_Page< 1)
{
Flash_EEPROM_Nb_Of_Page=1;
}
/*Clear all the flash */
FLASH_ClearFlag(FLASH_FLAG_BSY | FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR | FLASH_FLAG_OPTERR);

/*erase the page*/
for(EraseCounter=0; EraseCounter<Flash_EEPROM_Nb_Of_Page; EraseCounter++)
{
FLASHStatus = FLASH_ErasePage(Start_Address +(FL_EEPROM_PageSize* EraseCounter));

if (FLASHStatus != FLASH_COMPLETE)
{
return FLASHStatus;
}
}

FLASH_Lock();

return FLASHStatus;

}


Hocam derlerken keil bana eeprom.c ve eeprom.h içerisindeki hiçbirşey tanımlanmamış diyor kısacası.

Yanlış bir işlem sırası yapıyorum muhakkak.

Ben kendi programıma dahil etmem için sırayla neler yapmam gerekir?


Klein

#28
ST'nin verdiği örneği derlemeyi denedin mi?

Alıntı Yap
Yanlış bir işlem sırası yapıyorum muhakkak.
Ben kendi programıma dahil etmem için sırayla neler yapmam gerekir?
Soldaki proje ağacının ekran görüntüsünü yüklersen iyi olur.

Mucit23

Hocam Daha ST nin eeprom kütüphanesini bulamadım
http://www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/APPLICATION_NOTE/CD00165693.pdf
Elimde sadece bu var. Bundada fonksiyonlar tanıtılmış.

Proje ağacım ise aşağıdaki gibi.


image hosting sites