Перейти к содержанию
    

Запись структуры во флэш.

Я работаю с камнем EFM32TG842. У него есть сектор во флэше для записи данных пользователя - страница 512 байт. Я хочу записать туда свою структуру.

struct sFlashParam
{
    uint16_t customerID;
    uint32_t mainCounter;        
    uint32_t CWcounter;
    uint8_t  mode;                
    uint8_t  channel;             
    uint8_t  meter_type;
       …и так далее.
}

и потом пишу.

       
WriteToFlash(0x0FE00000, (uint32_t*)&flashParam1);

функция выглядит так

void WriteToFlash(uint32_t address, uint32_t *data)
{
    uint32_t *addr = (uint32_t *) address;  //(uint32_t *)0x0FE00000;
    MSC_Init();
    MSC_ErasePage(addr);
    MSC_WriteWord(addr, data, sizeof(data));
    MSC_Deinit();
}

вопрос как структура запишется? каждый член структуры в 32-битный регистр?

и как мне считать структуру из флэша?

 

 

 

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


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

Скорее всего как в памяти отображается так и запишется. Со всеми "дырками" от выравнивания.

Считывать из флеша надо будет как точно такую же структуру.

ЗЫ:

Исключение - если функция записит знает, что пишет структуру, знает, какую структуру и будет разбирать ее по полям и записывать каждое поле отдельно. ;) Изврат, но реализуемо. Тогда функция чтения должна заниматься обратным процессом. Считывать отдельные поля и запихивать их в структуру.

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


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

вопрос как структура запишется? каждый член структуры в 32-битный регистр?

Прежде чем брать в руки контроллер, нужно хотя-бы язык си выучить.

Тут уже не раз рекомендовали толковые книги для этого.

 

PS: В сад вобщем...

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


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

а вы запишите, считайте и узнаете:)

 

наверняка есть функция и ReadFromFlash

 

 

функции записи-считывания я немного переделал и сейчас они выглядят так

void WriteToFlash(uint32_t address, uint32_t *data, uint32_t size )
{
    uint32_t *addr = (uint32_t *) address;  
    MSC_Init();
    MSC_ErasePage(addr);
    MSC_WriteWord(addr, data, size);
    MSC_Deinit();

}

void ReadFromFlash(uint32_t offset, uint32_t *data, uint32_t size)
{
    int i;
    uint32_t *addr;
    for (i = 0; i < size; i++ )
    {
      addr = (uint32_t *)(offset  + i*4);
      data[i] = *addr;
    }
}

 

и тестирую (предварительно записав данные в структуру )

 WriteToFlash(0x0FE00000, (uint32_t*)&flashParam1, sizeof (struct sFlashParam1));

ReadFromFlash(0x0FE00000, (uint32_t*)&flashParam1, sizeof (struct sFlashParam1));

 

возвращает нули.

 

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


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

void ReadFromFlash(uint32_t offset, uint32_t *data, uint32_t size)
{
    int i;
    uint32_t *addr;
    for (i = 0; i < size; i++ )
    {
      addr = (uint32_t *)(offset  + i*4);
      data[i] = *addr;
    }
}

Под столом :-) А memcpy чем не угодил?

Вообще-то данные из флеш читаются точно так же, как из ОЗУ. Советую просто сделать указатель на структуру во флеш и читать через него:

struct mystruct* const ptr = (struct mystruct*)0x12345678;

А ещё учите язык Си. Керниган и Ричи - хороший учебник.

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


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

тут прикол в другом

 

 

uint32_t size

а при вызове человек передавал

sizeof(data)

а потом в цикле

i < size

addr = (uint32_t *)(offset + i*4);

 

то есть при передаче 1 32 битного слова, вы считаете 4 инта обратно....

круто!

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


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

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

 

И что, прямо так и записывается, без всяких там разрешений записи во флеш, включения режимов записи, предварительного стирания сектора и т.п.?? Интересный камень, вернее, флешка у него интересная :biggrin:

 

ЗЫ. Если не пишется структура, попробуйте записать просто массив чисел, и посмотреть, записался или нет...

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

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


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

тут прикол в другом

 

 

uint32_t size

а при вызове человек передавал

sizeof(data)

а потом в цикле

i < size

addr = (uint32_t *)(offset + i*4);

 

то есть при передаче 1 32 битного слова, вы считаете 4 инта обратно....

круто!

 

дебагер показывает корректные адреса в цикле. приращение 4 байта.

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


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

И что, прямо так и записывается, без всяких там разрешений записи во флеш, включения режимов записи, предварительного стирания сектора и т.п.??

ну нет же... есть же

MSC_Init();

MSC_ErasePage(addr);

 

MSC_Deinit();

 

 

беспокоит

MSC_WriteWord(addr, data, sizeof(data)); - запись слова, странное имя функции, ну да ладно...

 

 

дебагер показывает корректные адреса в цикле. приращение 4 байта.

ну если дебагер показывает то ладно... тогда можно не беспокоится...

 

пусть вам еще дебагер покажет такие вещи

 

int32_t a;
sizeof(a);
int32_t TotalK = 0;

for(int i=0;i<sizeof(a);i++)
  TotalK = i*4;

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


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

пусть вам еще дебагер покажет такие вещи

 

int32_t a;
sizeof(a);
int32_t TotalK = 0;

for(int i=0;i<sizeof(a);i++)
  TotalK = i*4;

 

я наверное туплю, но я не вижу здесь криминала.

 

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


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

sizeof - выдает длину в байтах.

и для инта_32 будет значение 4

 

и вместо одного слова вы считаете 4,

хотя возможно это не криминал в вашей разработке;)...

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


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

сделал по совету scifi .

    
       memcpy(&flashParam1, 0x0FE00000, sizeof (struct sFlashParam1));

 

вроде как считывает корректные данные. значит и запись работает.

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


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

memcpy(&flashParam1, 0x0FE00000, sizeof (struct sFlashParam1));

Вы будете смеяться, но это то же самое, что и

flashParam1 = *(struct sFlashParam1*)0x0FE00000;

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


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

Вы будете смеяться, но это то же самое, что и

flashParam1 = *(struct sFlashParam1*)0x0FE00000;

да таки буду смеятся, какой я тупой. но я сегодня много чего выучил , благодаря вам добрым людям. :)

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


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

Присоединяйтесь к обсуждению

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

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

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

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

×
×
  • Создать...