Delau

Запись отрицательного float во flash

7 сообщений в этой теме

Delau    0

Всем привет!

Пытаюсь записать во flash числа float. Пишутся только положительные. Отрицательные записываются просто как четыре байта нулей.

Применяю SPLовскую ф-цию  FLASH_ProgramWord(uint32_t Address, uint32_t Data).

Я прекрасно понимаю что аргумент передаваемый этой функции есть uint32_t, а я пытаюсь туда передать float. Поэтому и пишется ноль.

Отсюда вопрос, как привести float к uint32? Или может ещё какой вариант записи есть?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
mail_robot    1 418

попробуй использовать union из поля float и uint32_t. Или явное приведение типов, но я честно говоря не помню как оно будет работать с float, потому как ооочень редко пользуюсь этим типом. Практически всегда удается избавиться от него простым приведением всех аргументов к одному десятичному основанию и этого вполне хватает. Вообще в embedded системах и МК прямое использование нецелых типов признак неопытного кодера (в основном)

Изменено пользователем mail_robot

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Delau    0

Применил вот такой вариант:

float x;
uint8_t *p_x = (uint8_t *) &x;
uint8_t a, b, c, d;
uint32_t abcd;

    a = *p_x;
    b = *(p_x+1);
    c = *(p_x+2);
    d = *(p_x+3);
    abcd = (a)|(b<<8)|(c<<16)|(d<<24);

и обратно

    a = (uint8_t)    abcd;
    b = ((abcd & 0xFF00)>>8);
    c = ((abcd & 0xFF0000)>>16);
    d = ((abcd & 0xFF000000)>>24);
    
    *p_x = a;
    *(p_x+1) = b;
    *(p_x+2) = c;
    *(p_x+3) = d;

В первой части программы объявлен указатель на переменную х. Затем переменным a, b, c, d присваиваются значения по указателю (адрес инкрементируется), потом, в abcd складываются все байты. Обратное преобразование аналогично.

Проверил. Всё работает.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Alex    547

Кошмар :)

Была же подсказка :

Цитата

попробуй использовать union

 



 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
UTSource

Найдите миллионы труднодоступных

электронных компонентов

Yurkin2015    311
2 часа назад, Delau сказал:

Применил вот такой вариант:

Ну, правильно всё начали делать! Только почему взяли указатель на uint8? Надо бы сразу брать uint32 и компилятор всё остальное сделал бы сам.

float x;

FLASH_ProgramWord(address, *(uint32_t *)&x);

и всего делов-то.

Изменено пользователем Yurkin2015

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ваша публикация должна быть проверена модератором

Гость
Вы не авторизованы. Если у вас есть аккаунт, пожалуйста, войдите.
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Восстановить форматирование

  Разрешено не более 75 смайлов.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

Загрузка...