por HC908 » 15 Mai 2009 12:19
//***************************************
//* Programa para trabalhar com a Flash *
//* *
//* Projeto TIX *
//***************************************
//Rotina para apagar a Flash
void erase_flash(void)
{
uint8 *Flash_ptr; //Aloca ponteiro para Flash
WDTCTL = WDTPW + WDTHOLD; //Pára Watch Dog Timer
_disable_interrupts(); //Desbilita interrupções
Flash_ptr = (uint8 *)0xFA00; //Ponteiro para Flash
FCTL2 = FWKEY + FSSEL0 + 20; //Define senha, fonte de CLK, Fator div CLK
FCTL1= FWKEY + ERASE; //Apagamento apenas do segmento específico
FCTL3 = FWKEY + LOCKA; //Senha, Desabilita proteção
*Flash_ptr=0; //Limpa ponteiro
FCTL1 = FWKEY; //Senha
FCTL3 = FWKEY + LOCKA + LOCK; //
Flash_ptr = (uint8 *)0xFC00; //Aponta outro segmento
FCTL2 = FWKEY + FSSEL0 + 20; //Define senha, fonte de CLK, Fator div CLK
FCTL1= FWKEY + ERASE; //Apagamento apenas do segmento específico
FCTL3 = FWKEY; //Senha
*Flash_ptr=0; //Limpa ponteiro
FCTL1 = FWKEY; //Senha
FCTL3 = FWKEY + LOCKA + LOCK; //
_enable_interrupts(); //Habilita interrupções
}
//Rotina para gravar na Flash
void write_flash(uint16 endereco, uint8 value)
{
uint8 *Flash_ptr; //Aloca ponteiro
_disable_interrupts(); //Desabilita interrupções
FCTL2 = FWKEY + FSSEL0 + 20; //Senha, Fonte de CLK, Fator div CLK
FCTL3 = FWKEY + LOCKA;
FCTL1= FWKEY + WRT;
Flash_ptr=(uint8 *)0xFA00 + endereco; //Aponta para end. no segmento A
*Flash_ptr=value; //Coloca valor no end
FCTL1= FWKEY; //Senha
FCTL3 = FWKEY + LOCKA + LOCK; //
_enable_interrupts(); //Habilita interrupções
}
//Rotina para ler conteúdo da Flash
uint8 read_flash(uint16 endereco)
{
uint8 *Flash_ptr; //Aloca ponteiro
Flash_ptr=(uint8 *)0xFA00 + endereco; //Aponta para valor
return(*Flash_ptr); //Retorna valor apontado
}