Escribiendo en FLASH en MSP430F5529

1

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?

    
pregunta DerStrom8

1 respuesta

2

Para borrar y escribir en la memoria de información, debe borrar el bit LOCKINFO en el registro FCTL4. Este bit por lo general se borra cuando se reinicia, pero no se pierde nada con la verificación.

Pero la memoria de información A es diferente (y 0x1980 está en ese rango). Tiene otro bit de bloqueo LOCKA en FCTL3. Esto se configura al restablecer e impide que se borren y escriban en la memoria de información A.

Para borrar ese bit, debes escribirle un 1 (contador intuitivo).

Le sugeriría que use una ubicación de memoria de información diferente, ya que la memoria de información A contiene algunos valores de calibración de TI que probablemente no desee borrar (si mi memoria me funciona bien, han pasado algunos años).

    
respondido por el Arsenal

Lea otras preguntas en las etiquetas