Чтение / запись структуры во флэш-память - PullRequest
0 голосов
/ 11 января 2019

Я хочу записать содержимое структуры во флэш-память в моей программе на C для платы обнаружения STM32F4, используя библиотеки HAL. Это моя структура:

typedef struct
{
    RTC_TimeTypeDef time;
    RTC_DateTypeDef date;
    float Data;
} DataLogTypeDef;

У меня есть возможность записывать байты, полуслово, слова и двойные слова по каждому адресу памяти одновременно, используя библиотечную функцию stm32f4xx_hal_flash.c :

HAL_StatusTypeDef HAL_FLASH_Program(uint32_t TypeProgram, uint32_t Address, uint64_t Data);

Моя структура содержит различные типы данных, но я не уверен, как написать содержимое, используя только команды Byte, Half-Word, Word и Double-Word одновременно?

1 Ответ

0 голосов
/ 12 января 2019

У вас есть функция флэш-записи, которая записывает байт, слово или двойное слово.

Если вы хотите записать свою структуру на флэш-память, самый простой способ - это просмотреть ее как буфер байтов или слов, если вы читаете ее обратно одинаково на той же платформе (и с теми же параметрами компилятора C и параметров компиляции). ). Почему такая же платформа? Потому что разные компьютерные платформы могут иметь разный порядок байтов для многобайтовых значений. Почему одинаковые параметры компилятора и компилятора? Потому что другой компилятор или другие параметры могут по-разному упаковать данные в структуру.

Итак, учитывая это, и учитывая, что вы не предоставили много подробностей о том, как должен называться ваш Flash Writer, ваш код может выглядеть так, чтобы скопировать структуру во флэш:

DataLogTypeDef my_data;

...

int i;
uint8_t *data_p = &my_data;
flash_address = //put first flash address here

for ( i = 0; i < sizeof(DataLogTypeDef); i++, data_p++, flash_address++ )
    HAL_FLASH_Program(type_byte, flash_address, *data_p);

Я не знаю, каковы значения для первых двух аргументов, поэтому я просто поставил type_byte и flash_address. Я также предполагаю, что флэш-адрес является целочисленной формой и является байтовым адресом.

Если вы хотите прочитать структуру обратно, она может выглядеть примерно так:

// Initialize i, data_p, and flash_address first

for ( i = 0; i < sizeof(DataLogTypeDef); i++, data_p++, flash_address++ )
    *data_p = Flash_read(flash_address);
...