Página 1 de 1

Flash não apaga

MensagemEnviado: 12 Jan 2011 10:11
por denis neves
Estou com o livro do Fábio Pereira (MSP430F149 teoria e prática) desenvolvendo um projeto que utiliza a memória FLASH para salvar alguns parâmetros de configuração.

Estou utilizando as rotinas para manuseio da FLASH que se encontram no livro, mas a rotina para apagar a memória não está funcionando.

void apaga_MI(void)
{
char *Flash_ptr;
Flash_ptr = (char*) 0x1000;
FCTL2 = FWKEY + FSSEL_0 + FN3;
FCTL1 = FWKEY + ERASE;
FCTL3 = FWKEY;
__disable_interrupt();
*Flash_ptr = 0;
__enable_interrupt();
FCTL1 = FWKEY;
FCTL3 = FWKEY + LOCK;
}

fiz o seguinte exemplo para testá-la:

escreve_MI(0,15);
apaga_MI();
set_1 = le_MI(0);

mas o valor de set_1 continua sendo 15, mesmo após a memória ser apagada !!!

Este tópico é, em especial, ao Fábio Pereira, mas se alguem puder me ajudar ficarei grato.

Att

Denis

MensagemEnviado: 12 Jan 2011 11:04
por chrdcv
Sugiro que entre no site da TI e baixe alguma nota de aplicação ou algum dos vários packs contendo código fonte com exemplos de manipulação de periféricos.

chrdcv

Re: Flash não apaga

MensagemEnviado: 12 Jan 2011 13:41
por andre_luis
Denis,

Faz 8 anos que não mexo com esse microcontrolador, e por acaso tenho em casa, impresso, um programa que funciona normalmente. Espero não esquecer de verificar isso e te responder.

Entretanto, me recordo vagamente que havia a necessidade de monitorar algum flag, ou dar um delay após a operação na Flash, e entretanto não estou vando isso no trecho do código que voce apresentou.

+++

MensagemEnviado: 12 Jan 2011 14:54
por denis neves
andre_teprom,

Ficaria muito grato se vc postasse seu fonte para eu dar uma olhada....então, estava lendo a teoria sobre a memória flash desse cara e realmente tem um flag sim, mas nesse trecho de código que retirei do livro do Fábio Pereira não possui delay ou flag. Porém as funções de escrita e leitura (que tbm retirei do mesmo livro) funcionam (também sem delay ou flag) !!!....mas estão meio estranhas pois não entendo alguns parâmetros setados pelo autor das funções !!!

Muito obrigado pela força.
Vou continuar lendo a respeito....qualquer novidade eu posto !!!

chrdcv,

ja dei uma pesquisada no site da texas e tbm estou dando uma olhada nas funções deles !!!

Valeu,

Denis

MensagemEnviado: 13 Jan 2011 15:19
por denis neves
Pessoal resolvi o problema,

era o clock que estava sendo usado pelas funções de FLASH, ao invés de usar o ACLK dividido por 4 usei o SMCLK dividido por 4. Creio que o ACLK dividido por 4 estava sendo muito "rápido" para as funções de FLASH.

Ai estão as funções para quem quiser usá-las :

void apaga_MI(void)
{
char *Flash_ptr;
Flash_ptr = (char*) 0x1000;
FCTL2 = FWKEY + FSSEL_2 + FN3; //Usar FSSEL_2 ao invés de FSSEL_0
FCTL1 = FWKEY + ERASE;
FCTL3 = FWKEY;
__disable_interrupt();
*Flash_ptr = 0;
__enable_interrupt();
FCTL1 = FWKEY;
FCTL3 = FWKEY + LOCK;
}

unsigned int le_MI(unsigned char endereco)
{
int *Flash_ptr;
Flash_ptr = (int*) 0x1000 + endereco;
return (*Flash_ptr);
}

unsigned int escreve_MI(unsigned char endereco, unsigned int valor)
{
int *Flash_ptr;
__disable_interrupt();
FCTL2 = FWKEY + FSSEL_2 + FN3; //Usar FSSEL_2 ao invés de FSSEL_0
FCTL3 = FWKEY;
FCTL1 = FWKEY + WRT;
Flash_ptr = (int*) 0x1000 + endereco;
*Flash_ptr = valor;
FCTL1 = FWKEY;
FCTL3 = FWKEY + LOCK;
__enable_interrupt();
}

Muito obrigado a todos,

Denis.

MensagemEnviado: 13 Jan 2011 18:06
por andre_luis
Denis,

Fico duplamente contente por voce ter conseguido, pois caso contrário, eu teria de transcrever na mão o código que só tenho impresso. abçs.

+++

MensagemEnviado: 13 Jan 2011 20:06
por denis neves
Olá andre_teprom,

legal....não te dei trabalho !!!

Muito obrigado por ter respondido.

Abraço,

Denis.