¿Cómo puedo guardar un valor de punto flotante en un flash del microcontrolador?

0

Estoy intentando guardar algunos valores flotantes en el flash de datos de mi microcontrolador Nuc220 (ARM-M0 32 bit) usando el procedimiento ISP.

FMC->ISPCMD = FMC_ISPCMD_PROGRAM;   /* Set ISP Command Code */
FMC->ISPADR = 0x10000;              /* Set Target ROM Address. The address must be word alignment. */
FMC->ISPDAT = 22.5;                 /* Set Data to Program */
FMC->ISPTRG = 0x1;                  /* Trigger to start ISP procedure */
__ISB();                            /* To make sure ISP/CPU be Synchronized */
while(FMC->ISPTRG);                 /* Waiting for ISP Done */


FMC->ISPCMD = FMC_ISPCMD_READ; /* Set ISP Command Code */
FMC->ISPADR = 0x10000;         /* Set Target ROM Address. The address must be word alignment. */
FMC->ISPTRG = 0x1;             /* Trigger to start ISP procedure */
__ISB();                       /* To make sure ISP/CPU be Synchronized */
while(FMC->ISPTRG);            /* Waiting for ISP Done */
dataFloat = (float)(FMC->ISPDAT);

Pero el valor leído es 22.0 en lugar de 22.5, también recibo una advertencia de "conversión implícita a entero" mientras se realiza la compilación. ¿Cómo puedo hacer esto sin error?

    
pregunta Arun Joe

1 respuesta

6

Su problema probablemente surge de una conversión de tipo implícita de un flotador a un int en esta línea:

FMC->ISPDAT = 22.5; /* Set Data to Program */

Si fuera yo trabajando en esto, agruparía un flotante y un int en una unión como esta:

union {
   uint32_t intVal;
   float floatVal;
} myUnion;

Y luego simplemente escriba el número en el campo flotante:

myUnion.floatVal = 22.5f;

y luego lea el valor como un int así:

FMC->ISPDAT = myUnion.intVal;

Este ejemplo asume que sizeof(float) == sizeof(uint32_t) en su sistema. Alternativamente, puedes hacer gimnasia de tiempo de compilación para hacer que una matriz de bytes tenga el mismo tamaño que el tamaño de tu flotador, por lo que:

union {
   uint8_t[sizeof(float)] byteArray;
   float floatVal;
} myUnion;

Lo que funciona porque sizeof es un operador de tiempo de compilación. Una nota adicional, notará que agregué una 'f' después del 22.5. Esto informa al compilador para tratar el número literal como un flotador y no como un int, que evidentemente es el tipo que preferiría. Esta es la razón por la que su número se está truncando a 22.0, ya que se está llevando a cabo una conversión int implícita, probablemente porque el miembro ISPDAT de la estructura FMC es un tipo integral de algún tipo.

    
respondido por el Brendan Simpson

Lea otras preguntas en las etiquetas