Tengo problemas para escribir en FLASH en la MSP430F5529. He revisado los ejemplos proporcionados por TI y he leído las guías del usuario y la hoja de datos de la pieza, pero no he podido encontrar el problema. Mi objetivo es guardar la enumeración de la velocidad en baudios en FLASH y buscarla en el arranque. El código aplicable está debajo:
static const uint32_t baudRegister = 0x1980; // Baud rate register flash location (Info A)
//Change baud rate
void changeBaud(uint8_t baudEnum) {
eraseSegment(baudRegister); // Erase flash segment
writeFlashByte(baudRegister, baudEnum); // Write baud enumeration to FLASH
WDTCTL = 0; // Force uC reset
}
//Erase flash segment
void eraseSegment(uint32_t address) {
int8_t *flash_ptr = (int8_t *)address;
__bic_SR_register(GIE); // Disable interrupts
FCTL3 = FWKEY; // Unlock FLASH control regs
FCTL1 = FWKEY + ERASE; // Select segment erase
*flash_ptr = 0; // Dummy erase byte
FCTL3 = FWKEY + LOCK; // Lock FLASH control regs
__bits_SR_register(GIE); // Re-enable interrupts
}
//Write byte to FLASH
void writeFlashByte(uint32_t address, uint8_t data) {
uint8_t *ptr = (uint8_t *)address;
__bic_SR_register(GIE); // Disable interrupts
FCTL3 = FWKEY; // Unlock FLASH control regs
FCTL1 = FWKEY + WRT; // Enable writing of segment
*ptr = data;
FCTL1 = FWKEY;
FCTL3 = FWKEY + LOCK; // Lock FLASH control regs
__bis_SR_register(GIE); // Re-enable interrupts
}
se llama a changeBaud () desde main (), y se pasa una enumeración para la velocidad en baudios (ejemplo: 1 = 300bps, 2 = 600bps, ... 6 = 9600bps, 7 = 14400bps, etc.).
Cuando ejecuto eraseSegment () el contenido de FLASH en la dirección 0x1980 permanece como 0xFFFF. Creo que esto se espera (0xFFFF significa borrado). Sin embargo, cuando ejecuto writeFlashByte () cuando llego a la línea *ptr = data;
, parece que no hace nada. Mientras que la depuración, he confirmado que data
tiene el valor de enumeración correcto y ptr
es la dirección correcta, pero por alguna razón, escribir data
en *ptr
no carga la memoria con el valor de data
.
Soy bastante nuevo en escribir datos en flash, así que este me ha dejado perplejo. El código anterior se basa en los ejemplos de TI disponibles en MSPWare.
¿Qué podría causar este problema?