EEPROM neden koymamışlar ?

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

muhittin_kaplan

Herşey var fazlasıyla, EEPROM neden yok bu STM lerde ? Lazım Oldu Ne yapacağım.
(Batarya ile besleyip RAM de mi tutayım ?)

Mucit23

Hocam bu işi bende çözemedim. En dandik picte bile sırf bu iş için ayrılmış bölümler var.

Geçen benim diğer konuda bahsettim. Sağolsun gerbay bana bir ipucu vermişti ama fazla bakamadım

İki yöntem var sanırım.

1. Si Program hafızasından bu iş için bir bölüm ayırıp orayı kullanmak
2. Bir yöntem ise işlemcinin Vbat girişine pil bağlayıp belirli bölgedeki değişkenlerin kaybolmasını önlemek.

1. Yönteme biraz baktım ama açıkçası nasıl yapılacağı konusunda zerre birşey anlamadım. Birisi anlatsa çok güzel olacak



fahri-

batarya koyuncaya kadar 24c32 gibi küçük bir eeprom kullanmak daha kolay olmaz mı? Birçok arm devresinde bu şekilde çözümler var.

ULAGA

Application note - EEPROM emulation in STM32F10x microcontrollers

Konunun Tümü:
http://www.linkedin.com/groups/Flash-erase-write-on-stm32f103-4240067.S.108244546

Alıntı YapHello Saurabh and Alexey,
Actually, STM32F do not have internal EEPROM(beside STM32L series), ST website had use Internal Flash emulate the EEPROM function. It need consider the Flash start address and end address.
1. The start address do not cover your program code section. Otherwise, it will overwrite your program and your STM32 will hanging. You need the start address outside our total complied code size. ( e.g. your total flash size=64K, the start address >64K address)
2. Flash memory need erase the whole flash page (1Kbyte) data when you want to rewrite the same address. So, It will also erase other data in same page. It need read and backup the data in RAM first before erase the flash page.
3. The end address do you excess the physic memory of STM32 (e.g STM32F103RBT6 is max 128Kflash memory)
It is my example code for write EEPROM
/******EEPROM .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;

}




Alıntı YapIt is my example code for Read/erase EEPROM
///////////////////////////////////////////////////////////////////////////////
/***************************
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;




}

muhittin_kaplan

Hocam Burada Program belleğini mi kullanıyor.

ULAGA


cengz

içlerinde flash belek var hocam eeprom lara gerek kalmadı

muhittin_kaplan

flash bellek ten kastımız programımı yüklediğim flash mı yoksa "kullanmam için ayrılmış" başka bir bölüm mü,
eğer program belleği ise o pic te de var ve üstüne eprom koymuş adam.
(Konu Lütfen PIC STM e gitmesin)

ilhan_mkp

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

X-Fi

#9
STM32L15x serisinde 12K eeprom mevcut. Kullanımı flasha veri yazmak ile aynı tek fark flashda yazmadan önce silmeniz gerekiyor, eeprom da direk üzerine yazabiliyorsunuz. çözümü kolay 256 bytelık bir sektörü tanımlayıp doluncaya kadar yazarak kullanırsınız dolunca formatlar başdan yazmaya devam edersiniz.

Eeprom her çipe girmesi gereklimi tartışılır hocam üretimi yüksek maliyetli diye düşünüyorum flash da aynı işi görebiliyor maliyet sözkonusu olduğunda tercih edilmiyecek bu yüzden üretmiyorlarsa hak veriyorum.
http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

ilhan_mkp

Alıntı yapılan: X-Fi - 24 Ocak 2013, 21:57:16
STM32L15x serisinde 12K eeprom mevcut. Kullanımı flasha veri yazmak ile aynı tek fark flashda yazmadan önce silmeniz gerekiyor, eeprom da direk üzerine yazabiliyorsunuz. çözümü kolay 256 bytelık bir sektörü tanımlayıp doluncaya kadar yazarak kullanırsınız dolunca formatlar başdan yazmaya devam edersiniz.

Eeprom her çipe girmesi gereklimi tartışılır hocam üretimi yüksek maliyetli diye düşünüyorum flash da aynı işi görebiliyor maliyet sözkonusu olduğunda tercih edilmiyecek bu yüzden üretmiyorlarsa hak veriyorum.

hocam bu flash hafızanın kullanımını biraz açarmısınız acaba c ve arm kullananlar anladığım kadarıyla iyibir library arşiviyle çalışıyor şimdi çoğumuz stm32f4 discovery kitini aldık forumda bir library arşivi oluştursak fena olmayacak gibi.
ben konunun cahiliyim ama ben bu şekilde algılıyorum.

ULAGA

@X-Fi'nin de dediği gibi o modelde var ve tamamen mali kaygıdan dolayı koymuyorlar.

camby

Yazma/okuma oranları nasıldı flash ve eeprom'un ? yanlış hatırlamıyorsam eeprom 1M , flash 100k idi.

Sonuçta bu alanlar ram gibi kullanılmıyor , o yüzden Flash tercih edilebilir. Kullanım zorluğu var biraz tabi , sektör sektör yaz , yazmadan önce sil gibi..

Çok çeşit stm32f var , her türlü modülü 3er 5er koymuşlar maliyet düşündüklerini sanmıyorum , en azından bazılarına koyarlardı L serisi olmayanlara. Flash'dan devam gibi.

X-Fi

Rom işlemleri için özel bir kütüpaneye ihtiyaç yok standart peripherallar hazırlanmış aradığınız tüm fonksiyonlar stm32x_flash.c dosyasında mevcut.

Hız problem değil örneğin okumayı long=*(__IO uint32_t*)Addr; şeklinde yapıyorsunuz. Eger flash erişiminiz clock frekansından fazlaysa FLASHStatus bayrağını kontrol ederek yüklüyorsunuz.
http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

camby