Página 1 de 1

Escrever na ROM msp430g2231

MensagemEnviado: 14 Mar 2011 16:31
por lbeumesmo
Preciso escrever na rom do g2231, declaro uma constante e modifico o valor da mesma (valor no endereço).

Como faço?

MensagemEnviado: 15 Mar 2011 16:48
por lbeumesmo
#include <msp430g2231.h>

void apaga_Flash(int endereco)
{
int *Flash_ptr;
Flash_ptr = (int*) endereco;
FCTL2 = FWKEY + FSSEL_2 + FN3; //Usar FSSEL_2 com prescaler
FCTL1 = FWKEY + ERASE;
FCTL3 = FWKEY;
*Flash_ptr = (int)0;
FCTL1 = FWKEY;
FCTL3 = FWKEY + LOCK;
}
void escreve_flash(int endereco, char valor)
{
char *Flash_ptr; // Flash pointer

Flash_ptr = (char *)endereco; // Initialize Flash pointer
FCTL3 = FWKEY; // Clear Lock bit
FCTL1 = FWKEY + WRT; // Set WRT bit for write operation

*Flash_ptr =(char) valor; // Write value to flash

FCTL1 = FWKEY; // Clear WRT bit
FCTL3 = FWKEY + LOCK; // Set LOCK bit
}

//************************************************************************
// Main
//************************************************************************
void main(void)
{
// Config Clock CPU 1Mhz
BCSCTL1 = CALBC1_1MHZ; // Set range
DCOCTL = CALDCO_1MHZ; // Set DCO step + modulation

WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
P1DIR |= 0x01; // Set P1.0 to output direction

//Escrever e apagar a flash
escreve_flash(0xF922,0x1A);
apaga_Flash(0xF922);

for (;;)
{
P1OUT ^= 0x01; // Toggle P1.0
}

}



Até consigo escrever no endereço 0xF922 mas na hora de apagar o programa fica doido, escreve 3FFF em toda memoria ai depois escreve FFFF e sai da rotina apaga flash com um Program counter todo loco apontando la para onde judas perdeu as botas.

Alguma idéia do que possa ser?

MensagemEnviado: 24 Mar 2011 07:40
por andre_luis
Quando mexi com o MSP430F149, me lembro de ter de monitorar algum bit para saber quando a gravação foi concluída, mas não vi isso implementado no seu código. ( tipo, while (status) espera )

Dá uma buscada nesse mesmo fórum aqui - no tópico da Texas, pois o assunto já foi tratado antes ( não me lembro do resultado ).

+++

MensagemEnviado: 24 Mar 2011 08:15
por lbeumesmo
Obrigado pela resposta, eu entendi o que tava acontecendo.

Esse cara não pode escrever duas vezes no mesmo endereço de memoria sem um comando de erase entre as duas escritas, e o mesmo so apaga por segmento de memoria.

Ai usar a memoria de programa não era viável pois ia apagar coisa que não deve mesmo nos ultimos enderços(vetor de interrupção e vetor de restart). Decidi usar a memória de informação, não sei muito bem o que o uC grava lá mas esta funcionando bem em meus testes.

Conpartilhando minha rotina de escrita na flash no endereço 0x1000.


#include <msp430g2231.h>
#include "Flash.h"

int le_Flash(void)
{
int *Flash_ptr;
Flash_ptr = (int*)ADDRESS_FLASH;
return (*Flash_ptr);
}

void escreve_flash(int valor)
{
int *Flash_ptr; // Flash pointer

//apaga o Segmento de memória
Flash_ptr = (int*) ADDRESS_FLASH;
while(FCTL3 & BUSY);
FCTL2 = FWKEY + FSSEL_2 + FN0 + FN1; //Usar FSSEL_2 ao invés de FSSEL_0
FCTL1 = FWKEY + ERASE;
FCTL3 = FWKEY;
*Flash_ptr = (int)0;
while(FCTL3 & BUSY);
FCTL1 = FWKEY;
FCTL3 = FWKEY + LOCK;

//escreve no endereço de memoria
Flash_ptr = (int *)ADDRESS_FLASH; // Initialize Flash pointer
while(FCTL3 & BUSY);
FCTL3 = FWKEY; // Clear Lock bit
FCTL1 = FWKEY + WRT + BLKWRT; // Set WRT bit for write operation

*Flash_ptr =(int) valor; // Write value to flash
while(FCTL3 & BUSY);
FCTL1 = FWKEY; // Clear WRT bit
FCTL3 = FWKEY + LOCK; // Set LOCK bit
}

/////////////////////////////////////// Flash.h//////////////////////////////////

#ifndef FLASH_H_
#define FLASH_H_

#define ADDRESS_FLASH 0x1000

int le_Flash(void);
void escreve_flash(int valor);

#endif /*FLASH_H_*/