реклама на сайте
подробности

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> Запись структуры во флэш.
Jenya7
сообщение Nov 25 2014, 08:32
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Я работаю с камнем 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-битный регистр?
и как мне считать структуру из флэша?


Go to the top of the page
 
+Quote Post
редактор
сообщение Nov 25 2014, 09:17
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 356
Регистрация: 9-06-07
Пользователь №: 28 315



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


--------------------
Хорошую систему делают из стандартных блоков нестандартно мыслящие инженеры.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Nov 25 2014, 09:18
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



а вы запишите, считайте и узнаетеsm.gif

наверняка есть функция и ReadFromFlash
Go to the top of the page
 
+Quote Post
jcxz
сообщение Nov 25 2014, 09:29
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Jenya7 @ Nov 25 2014, 14:32) *
вопрос как структура запишется? каждый член структуры в 32-битный регистр?

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

PS: В сад вобщем...
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Nov 25 2014, 09:38
Сообщение #5


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(Golikov A. @ Nov 25 2014, 15:18) *
а вы запишите, считайте и узнаетеsm.gif

наверняка есть функция и 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));


возвращает нули.
Go to the top of the page
 
+Quote Post
scifi
сообщение Nov 25 2014, 09:54
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(Jenya7 @ Nov 25 2014, 12:38) *
Код
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;

А ещё учите язык Си. Керниган и Ричи - хороший учебник.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Nov 25 2014, 10:00
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



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


uint32_t size
а при вызове человек передавал
sizeof(data)
а потом в цикле
i < size
addr = (uint32_t *)(offset + i*4);

то есть при передаче 1 32 битного слова, вы считаете 4 инта обратно....
круто!
Go to the top of the page
 
+Quote Post
mantech
сообщение Nov 25 2014, 10:06
Сообщение #8


Гуру
******

Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143



Цитата(Jenya7 @ Nov 25 2014, 11:32) *
У него есть сектор во флэше для записи данных пользователя - страница 512 байт.


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

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

Сообщение отредактировал mantech - Nov 25 2014, 10:07
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Nov 25 2014, 10:12
Сообщение #9


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(Golikov A. @ Nov 25 2014, 16:00) *
тут прикол в другом


uint32_t size
а при вызове человек передавал
sizeof(data)
а потом в цикле
i < size
addr = (uint32_t *)(offset + i*4);

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


дебагер показывает корректные адреса в цикле. приращение 4 байта.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Nov 25 2014, 10:16
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



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

ну нет же... есть же
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;
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Nov 25 2014, 11:02
Сообщение #11


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(Golikov A. @ Nov 25 2014, 16:16) *
пусть вам еще дебагер покажет такие вещи

Код
int32_t a;
sizeof(a);
int32_t TotalK = 0;

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


я наверное туплю, но я не вижу здесь криминала.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Nov 25 2014, 11:07
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



sizeof - выдает длину в байтах.
и для инта_32 будет значение 4

и вместо одного слова вы считаете 4,
хотя возможно это не криминал в вашей разработкеwink.gif...
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Nov 25 2014, 11:22
Сообщение #13


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



сделал по совету scifi .
Код
    
       memcpy(&flashParam1, 0x0FE00000, sizeof (struct sFlashParam1));


вроде как считывает корректные данные. значит и запись работает.
Go to the top of the page
 
+Quote Post
scifi
сообщение Nov 25 2014, 12:00
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(Jenya7 @ Nov 25 2014, 14:22) *
Код
memcpy(&flashParam1, 0x0FE00000, sizeof (struct sFlashParam1));

Вы будете смеяться, но это то же самое, что и
Код
flashParam1 = *(struct sFlashParam1*)0x0FE00000;
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Nov 25 2014, 12:20
Сообщение #15


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(scifi @ Nov 25 2014, 17:00) *
Вы будете смеяться, но это то же самое, что и
Код
flashParam1 = *(struct sFlashParam1*)0x0FE00000;

да таки буду смеятся, какой я тупой. но я сегодня много чего выучил , благодаря вам добрым людям. sm.gif
Go to the top of the page
 
+Quote Post

3 страниц V   1 2 3 >
Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 13:21
Рейтинг@Mail.ru


Страница сгенерированна за 0.01579 секунд с 7
ELECTRONIX ©2004-2016