EmbeddedRelated.com
Forums

Using flash memory instead of eeprom?

Started by gewitter2000 January 31, 2005

> AFAIK FRAM does not have unlimited life. It was around 10^6 cycles
> when I forst looked at it many years back and I believe it is now
> around 10^12 cycles, compared to around 10^5 cycles for EEPROM and
> flash.

For the FM23CL64 Ramtron claims Unlimited Read/Write cycles ! --
42Bastian Schick



An Engineer's Guide to the LPC2100 Series


Hi Owen,

Yes, this helps a lot.
Thank you!

Martin

--- In , Owen Mooney <ojm@s...> wrote:
> Yes I have. Its easy, but you have to use up a whole page (unless
you read - modify - write) I had lots of spare flash and was typically
saving a configuration just a few times so these limitations didn't
matter.
>
> Code using IAP instructions below.
>
> Accessing the stored structure is just a direct memory access.
>
> The write cycle limitations have been well documented by those
willing to offer an opinion but not answer your question !!!
>
> Owen Mooney
>
> #define IAP_LOCATION 0x7ffffff1
>
> void savesetup(struct SETUP *setup){
> typedef void (*IAP)(unsigned int [],unsigned int[]);
> unsigned int command[5];
> unsigned int result[2];
> IAP iap_entry;
> __ARMLIB_disableIRQ();
> iap_entry=(IAP) IAP_LOCATION;
> // get part ID
> command[0]T;
> result[0]=0;
> iap_entry(command, result);
> // result in result[1]
> // prepare to erase
> command[0]P;
> command[1];
> command[2];
> iap_entry(command, result);
> if (result[0] != 0) goto error;
> // erase
> command[0]R;
> command[1];
> command[2];
> command[3]745;
> iap_entry(command, result);
> if (result[0] != 0) goto error;
> // prepare to program
> iap_entry=(IAP) IAP_LOCATION;
> command[0]P;
> command[1];
> command[2];
> iap_entry(command, result);
> if (result[0] != 0) goto error;
> // program
> command[0]Q;
> command[1]=0x1C000;
> command[2]=(int)setup;
> command[3]Q2;
> command[4]745;
> iap_entry(command, result);
> if (result[0] != 0) goto error;
> __ARMLIB_enableIRQ();
> return;
> error:
> __ARMLIB_enableIRQ();
> printf("bum");
> } > Hi!
>
> Has someone used the flash memory of the lpc21xx for eeprom purposes?
> Or is it more usefull to take an additive eeprom to the design? I only
> want to store some parameters.
>
> Thank you for feedback!
> Martin > ____________



Hi Owen / Martin,

Maybe it's also worth to point out that you can emulate EEPROM closer
by "spreading" the data in Flash, and leaving markers - although I'm not
sure with the sector sizes involved, it would have to be large amounts to
make it worth.
If you have plenty spare Flash, you can get closer to EEPROM by typically
using 4-8 times the amount of Flash, and emulate EEPROM like that.
(ie. for 4 K EEPROM you'd need at least 16K Flash)
If you need further info, send me a direct Email.

Cheers,
Kris > --- In , Owen Mooney <ojm@s...> wrote:
> > Yes I have. Its easy, but you have to use up a whole page (unless
> you read - modify - write) I had lots of spare flash and was typically
> saving a configuration just a few times so these limitations didn't
> matter.
> >
> > Code using IAP instructions below.
> >
> > Accessing the stored structure is just a direct memory access.
> >
> > The write cycle limitations have been well documented by those
> willing to offer an opinion but not answer your question !!!
> >
> > Owen Mooney
> >
> > #define IAP_LOCATION 0x7ffffff1
> >
> > void savesetup(struct SETUP *setup){
> > typedef void (*IAP)(unsigned int [],unsigned int[]);
> > unsigned int command[5];
> > unsigned int result[2];
> > IAP iap_entry;
> > __ARMLIB_disableIRQ();
> > iap_entry=(IAP) IAP_LOCATION;
> > // get part ID
> > command[0]T;
> > result[0]=0;
> > iap_entry(command, result);
> > // result in result[1]
> > // prepare to erase
> > command[0]P;
> > command[1];
> > command[2];
> > iap_entry(command, result);
> > if (result[0] != 0) goto error;
> > // erase
> > command[0]R;
> > command[1];
> > command[2];
> > command[3]745;
> > iap_entry(command, result);
> > if (result[0] != 0) goto error;
> > // prepare to program
> > iap_entry=(IAP) IAP_LOCATION;
> > command[0]P;
> > command[1];
> > command[2];
> > iap_entry(command, result);
> > if (result[0] != 0) goto error;
> > // program
> > command[0]Q;
> > command[1]=0x1C000;
> > command[2]=(int)setup;
> > command[3]Q2;
> > command[4]745;
> > iap_entry(command, result);
> > if (result[0] != 0) goto error;
> > __ARMLIB_enableIRQ();
> > return;
> > error:
> > __ARMLIB_enableIRQ();
> > printf("bum");
> > }
> >
> >
> > Hi!
> >
> > Has someone used the flash memory of the lpc21xx for eeprom purposes?
> > Or is it more usefull to take an additive eeprom to the design? I only
> > want to store some parameters.
> >
> > Thank you for feedback!
> > Martin
> >
> >
> >
> >
> >
> > ____________ > --
------
> Yahoo! Groups Links
>
> a.. To





Hi Martin,

there has been a thread a while ago with the title "Partial Flash
Programming" which you can use to do a search in the archive. In
particular there was a posting from Philips_apps message # 2681 which
give all the information necessary and some background why the flash
can only be used in chunks of 16 bytes for EEPROM simulation and so on.

hth, Bob --- In , "gewitter2000" <martin@c...> wrote:
>
> Hi!
>
> Has someone used the flash memory of the lpc21xx for eeprom purposes?
> Or is it more usefull to take an additive eeprom to the design? I only
> want to store some parameters.
>
> Thank you for feedback!
> Martin




--- In , "gewitter2000" <martin@c...> wrote:
>
> Hi!
>
> Has someone used the flash memory of the lpc21xx for eeprom
purposes?
> Or is it more usefull to take an additive eeprom to the design? I
only
> want to store some parameters.
>
> Thank you for feedback!
> Martin

Ho,

I've implemented an eeprom emulation for a LPC2106 in my "T-Clock"-
project. In the application it's just used to store two bytes for
brightness (backlight LED PWM) and contrast (contrast voltage PWM
AD-converter) values of the GLCD. You may find useful information in
the files iap*.* and the linker-scripts in the archive available from
http://www.siwawi.arubi.uni-kl.de/avr_projects/arm_projects/glcd_dcf77
One 8kByte memory-sector is reserved for "persistent storage" but the
emulation is a "512Byte EEPROM" to minimize sector-erase. Basic
approach: IAP and read-modify-write.

HTH
Martin Thomas