viael 0 13 августа, 2006 Опубликовано 13 августа, 2006 · Жалоба Кто как сохраняет пользовательские настойки в разрабатываемых девайсах, а то SiLabs пожадничали прикрутить EEPROM к ихним камням.Я просто поражен :cranky: неужели это так сложно было. Так что остается 2 варианта, писать во флэш, или наружи епром цеплять. Как лучше получается(из соображения размера кода)? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Toto Cutugno 0 14 августа, 2006 Опубликовано 14 августа, 2006 · Жалоба Я во внутреннюю flash контроллера пишу. Функция записи небольшая получается, да и быстродействие несоизмеримо по сравнению с вариантом EEPROMа. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Гость Igor_K 14 августа, 2006 Опубликовано 14 августа, 2006 · Жалоба Делаю так же, в scratchpad пишу. Недостаток вижу только в том, что flash пишется не побайтно, а секторами. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
viael 0 15 августа, 2006 Опубликовано 15 августа, 2006 · Жалоба Я во внутреннюю flash контроллера пишу. Функция записи небольшая получается, да и быстродействие несоизмеримо по сравнению с вариантом EEPROMа. Я так понимаю надо работать с целым сектором даже если надо записать 1 байт? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Toto Cutugno 0 15 августа, 2006 Опубликовано 15 августа, 2006 · Жалоба Я во внутреннюю flash контроллера пишу. Функция записи небольшая получается, да и быстродействие несоизмеримо по сравнению с вариантом EEPROMа. Я так понимаю надо работать с целым сектором даже если надо записать 1 байт? Да, с целым сектором 512 байт. Поэтому перед записью даже одного байта, придётся все полезные данные сохранить в буфер, т.к. операции записи предшествует операция стирания. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
viael 0 15 августа, 2006 Опубликовано 15 августа, 2006 · Жалоба Я во внутреннюю flash контроллера пишу. Функция записи небольшая получается, да и быстродействие несоизмеримо по сравнению с вариантом EEPROMа. Я так понимаю надо работать с целым сектором даже если надо записать 1 байт? Да, с целым сектором 512 байт. Поэтому перед записью даже одного байта, придётся все полезные данные сохранить в буфер, т.к. операции записи предшествует операция стирания. [/7quote] Явно не подходит для кристалов с RAM<768 байт. :( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Toto Cutugno 0 15 августа, 2006 Опубликовано 15 августа, 2006 · Жалоба Я во внутреннюю flash контроллера пишу. Функция записи небольшая получается, да и быстродействие несоизмеримо по сравнению с вариантом EEPROMа. Я так понимаю надо работать с целым сектором даже если надо записать 1 байт? Да, с целым сектором 512 байт. Поэтому перед записью даже одного байта, придётся все полезные данные сохранить в буфер, т.к. операции записи предшествует операция стирания. [/7quote] Явно не подходит для кристалов с RAM<768 байт. :( Почему не подходит? Никто ведь не заставляет запоминать состояние всех 512 байт. Если у Вас, скажем, 10 байт настроек, так и сохраняйте в буфер эти 10 байт. А потом после стирания их восстанавливайте во флеш. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
viael 0 15 августа, 2006 Опубликовано 15 августа, 2006 · Жалоба Почему не подходит? Никто ведь не заставляет запоминать состояние всех 512 байт. Если у Вас, скажем, 10 байт настроек, так и сохраняйте в буфер эти 10 байт. А потом после стирания их восстанавливайте во флеш. А у вас есть пример реализации на кейле.Этож надо сразу забить блок флеша размером 512 шоб компилятор его не заюзал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Toto Cutugno 0 15 августа, 2006 Опубликовано 15 августа, 2006 · Жалоба Почему не подходит? Никто ведь не заставляет запоминать состояние всех 512 байт. Если у Вас, скажем, 10 байт настроек, так и сохраняйте в буфер эти 10 байт. А потом после стирания их восстанавливайте во флеш. А у вас есть пример реализации на кейле.Этож надо сразу забить блок флеша размером 512 шоб компилятор его не заюзал. Завтра вышлю пример Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
viael 0 15 августа, 2006 Опубликовано 15 августа, 2006 · Жалоба Почему не подходит? Никто ведь не заставляет запоминать состояние всех 512 байт. Если у Вас, скажем, 10 байт настроек, так и сохраняйте в буфер эти 10 байт. А потом после стирания их восстанавливайте во флеш. А у вас есть пример реализации на кейле.Этож надо сразу забить блок флеша размером 512 шоб компилятор его не заюзал. Завтра вышлю пример Я уже сам допер Поковырялся в апликухах и написал это: void write_flash( unsigned char dat,unsigned char xdata *ptr ) { unsigned char xdata *pwrite; char EA_save,PCA0MD_save; // Disable Watchdog timer PCA0MD_save=PCA0MD; PCA0MD &= ~0x40; // WDTE = 0 (clear watchdog timer // enable) // erase the FLASH page at 0x1000 EA_save = EA; EA = 0; // disable interrupts (precautionary) // initialize write/erase pointer pwrite = ptr; PSCTL = 0x03; // MOVX writes erase FLASH page FLKEY = 0xA5; // FLASH lock and key sequence 1 FLKEY = 0xF1; // FLASH lock and key sequence 2 *pwrite = 0; // initiate page erase PSCTL = 0; // MOVX writes target XRAM // copy a dat FLASH memory at address ptr pwrite = ptr; // initialize FLASH write pointer PSCTL = 0x01; // MOVX writes target FLASH memory FLKEY = 0xA5; // FLASH lock and key sequence 1 FLKEY = 0xF1; // FLASH lock and key sequence 2 *pwrite = dat; // copy byte PSCTL = 0x00; // MOVX writes target XRAM EA = EA_save; // re-enable interrupts PCA0MD=PCA0MD_save; } записывается dat по указателю ptr с предварительным стиранием блока начиная с ptr.Проверил в железе на F321 работает. Но примерчик все рано вышли интересно как у тебя реализовано. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Toto Cutugno 0 16 августа, 2006 Опубликовано 16 августа, 2006 · Жалоба Почему не подходит? Никто ведь не заставляет запоминать состояние всех 512 байт. Если у Вас, скажем, 10 байт настроек, так и сохраняйте в буфер эти 10 байт. А потом после стирания их восстанавливайте во флеш. А у вас есть пример реализации на кейле.Этож надо сразу забить блок флеша размером 512 шоб компилятор его не заюзал. Завтра вышлю пример Я уже сам допер Поковырялся в апликухах и написал это: void write_flash( unsigned char dat,unsigned char xdata *ptr ) { unsigned char xdata *pwrite; char EA_save,PCA0MD_save; // Disable Watchdog timer PCA0MD_save=PCA0MD; PCA0MD &= ~0x40; // WDTE = 0 (clear watchdog timer // enable) // erase the FLASH page at 0x1000 EA_save = EA; EA = 0; // disable interrupts (precautionary) // initialize write/erase pointer pwrite = ptr; PSCTL = 0x03; // MOVX writes erase FLASH page FLKEY = 0xA5; // FLASH lock and key sequence 1 FLKEY = 0xF1; // FLASH lock and key sequence 2 *pwrite = 0; // initiate page erase PSCTL = 0; // MOVX writes target XRAM // copy a dat FLASH memory at address ptr pwrite = ptr; // initialize FLASH write pointer PSCTL = 0x01; // MOVX writes target FLASH memory FLKEY = 0xA5; // FLASH lock and key sequence 1 FLKEY = 0xF1; // FLASH lock and key sequence 2 *pwrite = dat; // copy byte PSCTL = 0x00; // MOVX writes target XRAM EA = EA_save; // re-enable interrupts PCA0MD=PCA0MD_save; } записывается dat по указателю ptr с предварительным стиранием блока начиная с ptr.Проверил в железе на F321 работает. Но примерчик все рано вышли интересно как у тебя реализовано. Например, так #define InternalFLASHAddress 0x7A00 // Адрес начала области для хранения параметров #define SYSTEM_PARAMETERS_SIZE 190 // Размер области для хранения системных параметров xdata unsigned char InternalBuffer[SYSTEM_PARAMETERS_SIZE]; //Внутренний буфер для параметров void WriteToInternalFlash(unsigned char *ptr) { unsigned char xdata *FlashPointToWrite; //Указатель на 512-байтную область памяти idata unsigned char index; FlashPointToWrite = InternalFLASHAddress; FLSCL = 0x88; // set FLASH scale register for 12000000Hz system clock PSCTL = 0x03; // set PSWE and PSEE to ‘1’s (MOVX instructions erase the corresponding FLASH page) *FlashPointToWrite = 0; // initiate the erase cycle PSCTL = 0x01; // clear PSEE, leaving PSWE set to ‘1’. MOVX instructions will write to the corresponding FLASH address. for (index=0;index<SYSTEM_PARAMETERS_SIZE;index++) *(FlashPointToWrite++) = *(ptr+index); PSCTL = 0; FLSCL = 0x8f; return; } void main(void) { // ..... WriteToInternalFlash(&InternalBuffer[0]); // .... } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Гость Igor_K 16 августа, 2006 Опубликовано 16 августа, 2006 · Жалоба Не обязательно работать с такими большими секторами. Scratchpad - это тоже сектор, и имеет размер 128 байт. Очень удобно как раз для хранения настроек, и в XRAM много места не занимает при обработке. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Toto Cutugno 0 16 августа, 2006 Опубликовано 16 августа, 2006 · Жалоба Не обязательно работать с такими большими секторами. Scratchpad - это тоже сектор, и имеет размер 128 байт. Очень удобно как раз для хранения настроек, и в XRAM много места не занимает при обработке. Полностью согласен. Всегда стараюсь так делать, если для хранения настроек хватает 128 байт. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
viael 0 17 августа, 2006 Опубликовано 17 августа, 2006 · Жалоба Не обязательно работать с такими большими секторами. Scratchpad - это тоже сектор, и имеет размер 128 байт. Очень удобно как раз для хранения настроек, и в XRAM много места не занимает при обработке. Полностью согласен. Всегда стараюсь так делать, если для хранения настроек хватает 128 байт. А если Scratchpad нет в применяемом контроллере Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Toto Cutugno 0 17 августа, 2006 Опубликовано 17 августа, 2006 · Жалоба Не обязательно работать с такими большими секторами. Scratchpad - это тоже сектор, и имеет размер 128 байт. Очень удобно как раз для хранения настроек, и в XRAM много места не занимает при обработке. Полностью согласен. Всегда стараюсь так делать, если для хранения настроек хватает 128 байт. А если Scratchpad нет в применяемом контроллере Используйте 512-байтный сектор Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться