cancel
Showing results for 
Search instead for 
Did you mean: 

Saving a Float to BKP Register

lisa2
Associate II
Posted on May 28, 2013 at 12:58

Hi,

I'm fairly new to the world of microcontrollers. I'm using the STM32F103ZG on the MCBSTM32E development board and am saving user-defined inputs to the BKP registers. Most inputs are positvie, small integers. However, I need to save a floating point input.

The BKP write function in the STM library, BKP_WriteBackupRegister, is configured to accept uint16_t and I'm pretty sure it's not as simple as creating a copy of that routine and declaring the Data parameter to be float.

What's the best way to save a float to a BKP register?

Thanks in advance,

Lisa
4 REPLIES 4
Posted on May 28, 2013 at 13:58

float f=45;
uint16_t *x = ((uint16_t *)&f);
printf(''%04X %04
X'',x[0],x[1]);

Tips, buy me a coffee, or three.. PayPal Venmo Up vote any posts that you find helpful, it shows what's working..
lisa2
Associate II
Posted on May 29, 2013 at 17:28

Okay, I want to be sure I understand what I'm doing:

1. float f=123.45;  -->Allocates 4 bytes in memory and stores 123.45 as float at address ''f''.

f ---> 1110 0110

          0110 0110

          0100 0010

          1111 0110

2.  uint16_t *x = ((uint16_t *)&f);   --> I create a pointer to an unsigned 2-byte integer and

                                                             cast the float address as an unsigned 2-byte integer

                                                             pointer so I can assign the address ''f'' to x.

x[0] ----> 1110 0110      

                 0110 0110

x[1] ---->  0100 0010

                 1111 0110

So, theoretically, I need to save x[0] to one BKP  register and x[1] to another BKP register. Then, when I want to retrieve my float, I need to retrieve the ''integer'' data from the two BKP registers, put them back together and read the 4 bytes as a float. Is that right?

Also, if the float value I'm trying to save is restricted to the interval [0,40] and one decimal place of accuracy, would there be any problem in doing this instead, for example:

float userValue = 35.7;

float f = userValue  x 10; --------> 357

uint16_t saveToBKP = (uint16_t) f;

Then when I retrieve it:

float userValue = ((float)saveToBKP)/10;

Thanks,

Lisa

Posted on May 29, 2013 at 22:11

Is that right?

Yes, pretty much.

float f=45;

uint16_t *x = ((uint16_t *)&f);

/* Enable PWR and BKP clock */

RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);

/* Enable write access to Backup domain */

PWR_BackupAccessCmd(ENABLE);

printf(''%04X %04
X'',x[0],x[1]);

BKP_WriteBackupRegister(BKP_DR1, x[0]); // Save

BKP_WriteBackupRegister(BKP_DR2, x[1]);

f = 0.0; // Trash

x[0] = BKP_ReadBackupRegister(BKP_DR1); // Restore

x[1] = BKP_ReadBackupRegister(BKP_DR2);

printf(''%f
'', f);

Also, if the float value I'm trying to save is restricted to the interval [0,40] and one decimal place of accuracy, would there be any problem in doing this instead, for example: No problem, you can do as you wish provided you know the range/precision you wish to store.
Tips, buy me a coffee, or three.. PayPal Venmo Up vote any posts that you find helpful, it shows what's working..
lisa2
Associate II
Posted on May 30, 2013 at 10:31

Thanks Clive - very enlightening for me.