Está en la página 1de 19

Almacenamiento

de datos
Almacenamiento de datos
En muchas aplicaciones es necesario
almacenar datos de forma que estos no se
pierdan si quitamos la alimentación al módulo

Pueden distinguirse dos casos:


 Parámetros de funcionamiento del programa
 Datos obtenidos por el programa

Los módulos disponen de 2 tipos de memorias


para estos propósitos: RAM y Flash
Almacenamiento en RAM
Los módulos disponen de al menos 256K de RAM. Para
que los datos no se pierdan al cortar la alimentación al
módulo debe instalarse una batería de litio de 3 voltios

Cuando se corta la alimentación al módulo, los chips de


RAM siguen alimentados desde la batería. El consumo
es de unos 6uA.
Almacenamiento en Flash
Las memorias Flash pertenecen a la familia de las ROM.
Pese a ello pueden escribirse, ya que incluyen en el chip
la circuitería para ello.

No obstante, la escritura suele hacerse a nivel de bloque


y no a nivel de byte, y requerir varios milisegundos.

Los chips suelen incluir buffers intermedios de RAM, y


comandos para el paso de buffer a Flash y de Flash a
buffer
Almacenamiento en Flash
ATMEL AT45DB041
Almacenamiento en Flash
Típicamente disponemos de 2 bloques de
Flash:
 UserBlock. De 16Kbytes. Se usa para guardar
parámetros de funcionamiento del programa:
tiempos, direcciones ip, etc..
 Flash serie. De 1Mbyte. Se usa para el
almacenamientos masivo de datos
UserBlock
int readUserBlock( void *dest, unsigned addr,
unsigned numbytes );
int writeUserBlock( unsigned addr, void *source,
unsigned numbytes );

Escriben un bloque de bytes. Es


adecuado si todos los datos a guardar
están en una estructura o un array.
UserBlock
int readUserBlockArray( void *dests[ ], unsigned
numbytes[ ],int numdests, unsigned addr );
int writeUserBlockArray( unsigned addr, void*
sources[ ], unsigned numbytes[ ], int numsources );

Escriben un conjunto de datos de


distintos tipos y longitudes en bytes. Las
direcciones de los datos se cargan en un
array[ ] ,y las longitudes en otro.
UserBlock
Ejemplo:
Int i,j;
Char c;
Float f;

void* direcciones[4];
unsigned int longitudes[4]
UserBlock
direcciones[0]=&i;
direcciones[1]=&j;
direcciones[2]=&c;
direcciones[3]=&f;
longitudes[0]=2;
longitudes[1]=sizeof(j);
longitudes[2]=sizeof(c);
longitudes[3]=sizeof(f);
UserBlock
readUserBlockArray(direcciones,
longitudes, 4, 0);

writeUserBlockArray(0,direcciones,
longitudes, 4);
Almacenamiento en Flash
Algunos módulos disponen de 1Mbyte de
Flash serie.
Se utiliza para guardar datos: medidas,
gráficos para el webserver, etc..
Almacenamiento en Flash
ATMEL AT45DB041
Almacenamiento en Flash
#define SFLASH_DEBUG

#define SF_SPI_CSPORT PEDR


#define SF_SPI_CSSHADOW PEDRShadow
#define SF_SPI_CSDD PEDDR
#define SF_SPI_CSDDSHADOW PEDDRShadow
#define SF_SPI_CSPIN 6

#use "sflash.lib"
Almacenamiento en Flash
 INICIAR LA CONEXIÓN CON LA MEMORIA

sfspi_init();
if(sf_init())
{
printf("Flash init failed\n");
exit(-1);
}
Almacenamiento en Flash
 INICIAR LA CONEXIÓN CON LA MEMORIA

sfspi_init();
if(sf_init())
{
printf("Flash init failed\n");
exit(-1);
} else
{
printf("Flash init OK\n");
printf("# of blocks: %d\n", sf_blocks); //******
printf("size of block: %d\n", sf_blocksize);//******
}
Almacenamiento en Flash
 PRINCIPALES FUNCIONES

sf_pageToRAM
sf_RAMToPage

sf_readPage
sf_readRAM

sf_writePage
sf_writeRAM
Almacenamiento en Flash
 EJEMPLO ESCRITURA
for(i = 0;i < sf_blocksize;i++)
{
flash_buf[i] = 0;
}
sf_writeRAM(flash_buf, 0, sf_blocksize);

sf_RAMToPage(pagenum);
Almacenamiento en Flash
 EJEMPLO LECTURA

sf_pageToRAM(pagenum);
sf_readRAM(flash_buf, 0, sf_blocksize);

También podría gustarte