Как записать данные с плавающей запятой во флэш-память на плате обнаружения STM32F4

Я пытаюсь получить число с плавающей запятой через VCP и записать его во флэш-память платы обнаружения STM32F4, используя Keil IDE. Функции, используемые для записи во флэш-память:

FLASH_Status FLASH_ProgramDoubleWord(uint32_t Address, uint64_t Data);
FLASH_Status FLASH_ProgramWord(uint32_t Address, uint32_t Data);
FLASH_Status FLASH_ProgramHalfWord(uint32_t Address, uint16_t Data);
FLASH_Status FLASH_ProgramByte(uint32_t Address, uint8_t Data);

принять целое число без знака в качестве входных данных, но мне удалось записать целое число со знаком во флэш-памяти, используя этот код:

int dataflash1 = -1000;
int gain;
uint32_t Address= 0x08008000;
.......
FLASH_ProgramWord(Address,dataflash1);
.......
gain=*(int*)Address;

Однако мне до сих пор не удалось записать данные с плавающей запятой. Если я заменю «int» на «float» (они оба должны быть 4-байтовыми данными, как сказано в руководстве по компилятору keil), я получаю числа вроде 1.7345673 e-42.

Может быть, это глупый вопрос, но если вы могли бы дать мне ключ, я был бы очень признателен.


person Blueberry    schedule 10.07.2014    source источник
comment
Вы имеете в виду, что вы изменили gain = *(int*)Address на gain = *(float*)Address? Вы также изменили int gain; на float gain;?   -  person swineone    schedule 11.07.2014


Ответы (2)


Запись данных как float:

float f = 12.34;
FLASH_ProgramWord(Address, *(uint32_t *)&f);

Преобразование прочитанных данных в число с плавающей запятой:

uint32_t u = flash_read(Address);
float f = *(float *)&u;
person Kibernetik    schedule 26.09.2015

Я не понимаю, почему это не должно работать:

float dataflash1 = -1000.0f;
float gain;
uint32_t Address= 0x08008000;
.......
FLASH_ProgramWord(Address,dataflash1);
.......
gain=*(float*)Address;

Обратите внимание, что вам нужно объявить как dataflash1, так и gain как число с плавающей запятой. Представление любого данного числа (например, -1000) в виде целого числа и числа с плавающей запятой, как правило, совершенно различно, поэтому неразумно ожидать, что вы можете записать данные, используя их целочисленное представление, в память, а затем прочитать их обратно. непосредственно к числу с плавающей запятой. Сначала вам нужно изменить представление на уровне битов. Здесь нет ничего конкретного о записи во флэш-память: следующий код, использующий переменные только в ОЗУ, также не будет работать:

int dataflash1 = -1000;
float gain;
gain=*(float*)Address;

Если вы попытаетесь напечатать значение gain, уверяю вас, результат не будет -1000.

person swineone    schedule 11.07.2014