Página 1 de 1
Escrever na ROM msp430g2231

Enviado:
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?

Enviado:
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?

Enviado:
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 ).
+++

Enviado:
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_*/