Flash Mem. Leer escribir

-1

Uso de la comunicación SerialPort entre PC y MSP430F5438A. Es C # en el lado de la PC y Code Composer Studio (CCS) en el lado de la MSP430. Estoy enviando "¡Hola mundo!" a MCU. Puse el puntero de flash en la dirección 0x20000:

unsigned long *Flash_ptr= 0x20000;               // Initialize Flash pointer

luego escribo en flash (este procedimiento se repite como el número de caracteres en la cadena o el archivo de texto):

void write_SegC(char data)
{
 //__disable_interrupt();                  // 5xx Workaround: Disable global
                                        // interrupt while erasing. Re-Enable
                                        // GIE if needed
 FCTL3 = FWKEY;                            // Clear Lock bit
 FCTL1 = FWKEY+ERASE;                      // Set Erase bit
 *(unsigned int *)Flash_ptr = 0;           // Dummy write to erase Flash seg
 FCTL1 = FWKEY+WRT;                        // Set WRT bit for write operation
 while(!(WAIT & FCTL3));
 *Flash_ptr++ = data;                   // Write value to flash


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

Y luego enviarlo de vuelta a la PC:

void read_SegC(void)
{
  unsigned long i;
  Flash_ptr=0x20000;
  for(i = 0; i < 8; i++)
  {
      while(!(WAIT & FCTL3));
      while(!(UCA1IFG & UCTXIFG));
      UCA1TXBUF=*Flash_ptr++;                 // Write long int to Flash
  }
}

lo que obtengo en PC: 2d! Wo

en lugar de: ¡Hola mundo! lo que significa que acabo de obtener algunos caracteres de la cadena! el resto son basura. ¿Qué hice mal?

    
pregunta Renya Karasuma

1 respuesta

2

Debe agregar un cheque ocupado antes de continuar y escribir en la siguiente ubicación. Algo en estas líneas debe aparecer después de escribir en cada ubicación.

while(FCTL3 & BUSY){};

Donde ocupado se define como 0x01: estamos comprobando si FCTL3 Bit 0 está establecido.

Aquí está mi método de escritura flash en su totalidad:

/*!
* \brief Writes an array of 8 bit unsigned integers to the flash.
* \param[in]     p_data  pointer to the data to write
* \param[in,out] p_flash starting address to write to
* \param[in]     count   size of the array to write
*
* \warning This function cannot be used to write to INFO A
*/
void flash_write(const uint8_t * p_data, uint8_t * p_flash, uint16_t count)
{

    FCTL3 = FWKEY;                  // Clear Lock bit and set the
                                    // Flash write password of FCTL3
    FCTL1 = FWKEY + WRT;            // Enable byte/word write mode and set the
                                    // Flash write password of FCTL1
    while (count > 0u){
        while (FCTL3 & BUSY)        // Wait if the flash is busy
        {}
        *p_flash = *p_data; // Write to Flash
        p_flash++;
        p_data++;
        count--;
    }
    FCTL1 = FWKEY;                  // Clear write bit
    FCTL3 = FWKEY + LOCK;           // Set LOCK bit
}
    
respondido por el Nick

Lea otras preguntas en las etiquetas