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

Кто как сохраняет пользовательские настойки в разрабатываемых девайсах, а то SiLabs пожадничали прикрутить EEPROM к ихним камням.Я просто поражен :cranky: неужели это так сложно было.

Так что остается 2 варианта, писать во флэш, или наружи епром цеплять.

Как лучше получается(из соображения размера кода)?

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


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

Я во внутреннюю flash контроллера пишу. Функция записи небольшая получается, да и быстродействие несоизмеримо по сравнению с вариантом EEPROMа.

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


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

Я во внутреннюю flash контроллера пишу. Функция записи небольшая получается, да и быстродействие несоизмеримо по сравнению с вариантом EEPROMа.

 

Я так понимаю надо работать с целым сектором даже если надо записать 1 байт?

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


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

Я во внутреннюю flash контроллера пишу. Функция записи небольшая получается, да и быстродействие несоизмеримо по сравнению с вариантом EEPROMа.

 

Я так понимаю надо работать с целым сектором даже если надо записать 1 байт?

Да, с целым сектором 512 байт. Поэтому перед записью даже одного байта, придётся все полезные данные сохранить в буфер, т.к. операции записи предшествует операция стирания.

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


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

Я во внутреннюю flash контроллера пишу. Функция записи небольшая получается, да и быстродействие несоизмеримо по сравнению с вариантом EEPROMа.

 

Я так понимаю надо работать с целым сектором даже если надо записать 1 байт?

Да, с целым сектором 512 байт. Поэтому перед записью даже одного байта, придётся все полезные данные сохранить в буфер, т.к. операции записи предшествует операция стирания.

[/7quote]

Явно не подходит для кристалов с RAM<768 байт. :(

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


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

Я во внутреннюю flash контроллера пишу. Функция записи небольшая получается, да и быстродействие несоизмеримо по сравнению с вариантом EEPROMа.

 

Я так понимаю надо работать с целым сектором даже если надо записать 1 байт?

Да, с целым сектором 512 байт. Поэтому перед записью даже одного байта, придётся все полезные данные сохранить в буфер, т.к. операции записи предшествует операция стирания.

[/7quote]

Явно не подходит для кристалов с RAM<768 байт. :(

Почему не подходит? Никто ведь не заставляет запоминать состояние всех 512 байт. Если у Вас, скажем, 10 байт настроек, так и сохраняйте в буфер эти 10 байт. А потом после стирания их восстанавливайте во флеш.

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


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

Почему не подходит? Никто ведь не заставляет запоминать состояние всех 512 байт. Если у Вас, скажем, 10 байт настроек, так и сохраняйте в буфер эти 10 байт. А потом после стирания их восстанавливайте во флеш.

 

 

А у вас есть пример реализации на кейле.Этож надо сразу забить блок флеша размером 512 шоб компилятор его не заюзал.

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


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

Почему не подходит? Никто ведь не заставляет запоминать состояние всех 512 байт. Если у Вас, скажем, 10 байт настроек, так и сохраняйте в буфер эти 10 байт. А потом после стирания их восстанавливайте во флеш.

 

 

А у вас есть пример реализации на кейле.Этож надо сразу забить блок флеша размером 512 шоб компилятор его не заюзал.

Завтра вышлю пример

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


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

Почему не подходит? Никто ведь не заставляет запоминать состояние всех 512 байт. Если у Вас, скажем, 10 байт настроек, так и сохраняйте в буфер эти 10 байт. А потом после стирания их восстанавливайте во флеш.

 

 

А у вас есть пример реализации на кейле.Этож надо сразу забить блок флеша размером 512 шоб компилятор его не заюзал.

Завтра вышлю пример

Я уже сам допер :biggrin:

Поковырялся в апликухах и написал это:

   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 работает.

Но примерчик все рано вышли интересно как у тебя реализовано.

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


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

Почему не подходит? Никто ведь не заставляет запоминать состояние всех 512 байт. Если у Вас, скажем, 10 байт настроек, так и сохраняйте в буфер эти 10 байт. А потом после стирания их восстанавливайте во флеш.

 

 

А у вас есть пример реализации на кейле.Этож надо сразу забить блок флеша размером 512 шоб компилятор его не заюзал.

Завтра вышлю пример

Я уже сам допер :biggrin:

Поковырялся в апликухах и написал это:

   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

Не обязательно работать с такими большими секторами. Scratchpad - это тоже сектор, и имеет размер 128 байт. Очень удобно как раз для хранения настроек, и в XRAM много места не занимает при обработке.

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


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

Не обязательно работать с такими большими секторами. Scratchpad - это тоже сектор, и имеет размер 128 байт. Очень удобно как раз для хранения настроек, и в XRAM много места не занимает при обработке.

Полностью согласен. Всегда стараюсь так делать, если для хранения настроек хватает 128 байт.

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


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

Не обязательно работать с такими большими секторами. Scratchpad - это тоже сектор, и имеет размер 128 байт. Очень удобно как раз для хранения настроек, и в XRAM много места не занимает при обработке.

Полностью согласен. Всегда стараюсь так делать, если для хранения настроек хватает 128 байт.

А если Scratchpad нет в применяемом контроллере

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


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

Не обязательно работать с такими большими секторами. Scratchpad - это тоже сектор, и имеет размер 128 байт. Очень удобно как раз для хранения настроек, и в XRAM много места не занимает при обработке.

Полностью согласен. Всегда стараюсь так делать, если для хранения настроек хватает 128 байт.

А если Scratchpad нет в применяемом контроллере

Используйте 512-байтный сектор

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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