Escrever na ROM msp430g2231

Software e Hardware para uC Texas

Moderadores: andre_luis, 51

Escrever na ROM msp430g2231

Mensagempor lbeumesmo » 14 Mar 2011 16:31

Preciso escrever na rom do g2231, declaro uma constante e modifico o valor da mesma (valor no endereço).

Como faço?
----------------------------------
LB 1/4 Bit
----------------------------------
Avatar do usuário
lbeumesmo
Bit
 
Mensagens: 37
Registrado em: 06 Abr 2010 18:27
Localização: Oktoberlandia

Mensagempor lbeumesmo » 15 Mar 2011 16:48

#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?
Avatar do usuário
lbeumesmo
Bit
 
Mensagens: 37
Registrado em: 06 Abr 2010 18:27
Localização: Oktoberlandia

Mensagempor andre_luis » 24 Mar 2011 07:40

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 ).

+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor lbeumesmo » 24 Mar 2011 08:15

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_*/
Avatar do usuário
lbeumesmo
Bit
 
Mensagens: 37
Registrado em: 06 Abr 2010 18:27
Localização: Oktoberlandia


Voltar para Texas

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

cron

x