jenya7 0 25 ноября, 2014 Опубликовано 25 ноября, 2014 · Жалоба Я работаю с камнем 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-битный регистр? и как мне считать структуру из флэша? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Edit2007 3 25 ноября, 2014 Опубликовано 25 ноября, 2014 · Жалоба Скорее всего как в памяти отображается так и запишется. Со всеми "дырками" от выравнивания. Считывать из флеша надо будет как точно такую же структуру. ЗЫ: Исключение - если функция записит знает, что пишет структуру, знает, какую структуру и будет разбирать ее по полям и записывать каждое поле отдельно. ;) Изврат, но реализуемо. Тогда функция чтения должна заниматься обратным процессом. Считывать отдельные поля и запихивать их в структуру. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 25 ноября, 2014 Опубликовано 25 ноября, 2014 · Жалоба а вы запишите, считайте и узнаете:) наверняка есть функция и ReadFromFlash Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 25 ноября, 2014 Опубликовано 25 ноября, 2014 · Жалоба вопрос как структура запишется? каждый член структуры в 32-битный регистр? Прежде чем брать в руки контроллер, нужно хотя-бы язык си выучить. Тут уже не раз рекомендовали толковые книги для этого. PS: В сад вобщем... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 25 ноября, 2014 Опубликовано 25 ноября, 2014 · Жалоба а вы запишите, считайте и узнаете:) наверняка есть функция и 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)); возвращает нули. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 25 ноября, 2014 Опубликовано 25 ноября, 2014 · Жалоба 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; А ещё учите язык Си. Керниган и Ричи - хороший учебник. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 25 ноября, 2014 Опубликовано 25 ноября, 2014 · Жалоба тут прикол в другом uint32_t size а при вызове человек передавал sizeof(data) а потом в цикле i < size addr = (uint32_t *)(offset + i*4); то есть при передаче 1 32 битного слова, вы считаете 4 инта обратно.... круто! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 53 25 ноября, 2014 Опубликовано 25 ноября, 2014 (изменено) · Жалоба У него есть сектор во флэше для записи данных пользователя - страница 512 байт. И что, прямо так и записывается, без всяких там разрешений записи во флеш, включения режимов записи, предварительного стирания сектора и т.п.?? Интересный камень, вернее, флешка у него интересная ЗЫ. Если не пишется структура, попробуйте записать просто массив чисел, и посмотреть, записался или нет... Изменено 25 ноября, 2014 пользователем mantech Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 25 ноября, 2014 Опубликовано 25 ноября, 2014 · Жалоба тут прикол в другом uint32_t size а при вызове человек передавал sizeof(data) а потом в цикле i < size addr = (uint32_t *)(offset + i*4); то есть при передаче 1 32 битного слова, вы считаете 4 инта обратно.... круто! дебагер показывает корректные адреса в цикле. приращение 4 байта. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 25 ноября, 2014 Опубликовано 25 ноября, 2014 · Жалоба И что, прямо так и записывается, без всяких там разрешений записи во флеш, включения режимов записи, предварительного стирания сектора и т.п.?? ну нет же... есть же 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; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 25 ноября, 2014 Опубликовано 25 ноября, 2014 · Жалоба пусть вам еще дебагер покажет такие вещи int32_t a; sizeof(a); int32_t TotalK = 0; for(int i=0;i<sizeof(a);i++) TotalK = i*4; я наверное туплю, но я не вижу здесь криминала. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 25 ноября, 2014 Опубликовано 25 ноября, 2014 · Жалоба sizeof - выдает длину в байтах. и для инта_32 будет значение 4 и вместо одного слова вы считаете 4, хотя возможно это не криминал в вашей разработке;)... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 25 ноября, 2014 Опубликовано 25 ноября, 2014 · Жалоба сделал по совету scifi . memcpy(&flashParam1, 0x0FE00000, sizeof (struct sFlashParam1)); вроде как считывает корректные данные. значит и запись работает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 25 ноября, 2014 Опубликовано 25 ноября, 2014 · Жалоба memcpy(&flashParam1, 0x0FE00000, sizeof (struct sFlashParam1)); Вы будете смеяться, но это то же самое, что и flashParam1 = *(struct sFlashParam1*)0x0FE00000; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 25 ноября, 2014 Опубликовано 25 ноября, 2014 · Жалоба Вы будете смеяться, но это то же самое, что и flashParam1 = *(struct sFlashParam1*)0x0FE00000; да таки буду смеятся, какой я тупой. но я сегодня много чего выучил , благодаря вам добрым людям. :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться