|
Запись структуры во флэш. |
|
|
|
Nov 25 2014, 08:32
|
Профессионал
    
Группа: Участник
Сообщений: 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-битный регистр? и как мне считать структуру из флэша?
|
|
|
|
|
Nov 25 2014, 09:17
|
Местный
  
Группа: Участник
Сообщений: 356
Регистрация: 9-06-07
Пользователь №: 28 315

|
Скорее всего как в памяти отображается так и запишется. Со всеми "дырками" от выравнивания. Считывать из флеша надо будет как точно такую же структуру. ЗЫ: Исключение - если функция записит знает, что пишет структуру, знает, какую структуру и будет разбирать ее по полям и записывать каждое поле отдельно.  Изврат, но реализуемо. Тогда функция чтения должна заниматься обратным процессом. Считывать отдельные поля и запихивать их в структуру.
--------------------
Хорошую систему делают из стандартных блоков нестандартно мыслящие инженеры.
|
|
|
|
|
Nov 25 2014, 09:38
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Цитата(Golikov A. @ Nov 25 2014, 15:18)  а вы запишите, считайте и узнаете  наверняка есть функция и 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)); возвращает нули.
|
|
|
|
|
Nov 25 2014, 09:54
|
Гуру
     
Группа: Свой
Сообщений: 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; А ещё учите язык Си. Керниган и Ричи - хороший учебник.
|
|
|
|
|
Nov 25 2014, 10:06
|
Гуру
     
Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143

|
Цитата(Jenya7 @ Nov 25 2014, 11:32)  У него есть сектор во флэше для записи данных пользователя - страница 512 байт. И что, прямо так и записывается, без всяких там разрешений записи во флеш, включения режимов записи, предварительного стирания сектора и т.п.?? Интересный камень, вернее, флешка у него интересная  ЗЫ. Если не пишется структура, попробуйте записать просто массив чисел, и посмотреть, записался или нет...
Сообщение отредактировал mantech - Nov 25 2014, 10:07
|
|
|
|
|
Nov 25 2014, 10:16
|
Гуру
     
Группа: Свой
Сообщений: 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;
|
|
|
|
|
Nov 25 2014, 11:02
|
Профессионал
    
Группа: Участник
Сообщений: 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; я наверное туплю, но я не вижу здесь криминала.
|
|
|
|
|
Nov 25 2014, 11:22
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
сделал по совету scifi . Код memcpy(&flashParam1, 0x0FE00000, sizeof (struct sFlashParam1)); вроде как считывает корректные данные. значит и запись работает.
|
|
|
|
|
Nov 25 2014, 12:00
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(Jenya7 @ Nov 25 2014, 14:22)  Код memcpy(&flashParam1, 0x0FE00000, sizeof (struct sFlashParam1)); Вы будете смеяться, но это то же самое, что и Код flashParam1 = *(struct sFlashParam1*)0x0FE00000;
|
|
|
|
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|