Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: 8051Fxxx from SiLabs
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры > MCS51
viael
Кто как сохраняет пользовательские настойки в разрабатываемых девайсах, а то SiLabs пожадничали прикрутить EEPROM к ихним камням.Я просто поражен cranky.gif неужели это так сложно было.
Так что остается 2 варианта, писать во флэш, или наружи епром цеплять.
Как лучше получается(из соображения размера кода)?
RedFroggy
Я во внутреннюю flash контроллера пишу. Функция записи небольшая получается, да и быстродействие несоизмеримо по сравнению с вариантом EEPROMа.
Igor_K
Делаю так же, в scratchpad пишу. Недостаток вижу только в том, что flash пишется не побайтно, а секторами.
viael
Цитата(RedFroggy @ Aug 14 2006, 15:20) *
Я во внутреннюю flash контроллера пишу. Функция записи небольшая получается, да и быстродействие несоизмеримо по сравнению с вариантом EEPROMа.


Я так понимаю надо работать с целым сектором даже если надо записать 1 байт?
RedFroggy
Цитата(viael @ Aug 15 2006, 19:05) *
Цитата(RedFroggy @ Aug 14 2006, 15:20) *

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


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

Да, с целым сектором 512 байт. Поэтому перед записью даже одного байта, придётся все полезные данные сохранить в буфер, т.к. операции записи предшествует операция стирания.
viael
[quote name='RedFroggy' date='Aug 15 2006, 19:30' post='144734']
[quote name='viael' post='144726' date='Aug 15 2006, 19:05']
[quote name='RedFroggy' post='144279' date='Aug 14 2006, 15:20']
Я во внутреннюю flash контроллера пишу. Функция записи небольшая получается, да и быстродействие несоизмеримо по сравнению с вариантом EEPROMа.
[/quote]

Я так понимаю надо работать с целым сектором даже если надо записать 1 байт?
[/quote]
Да, с целым сектором 512 байт. Поэтому перед записью даже одного байта, придётся все полезные данные сохранить в буфер, т.к. операции записи предшествует операция стирания.
[/7quote]
Явно не подходит для кристалов с RAM<768 байт. sad.gif
RedFroggy
[quote name='viael' date='Aug 15 2006, 20:27' post='144745']
[quote name='RedFroggy' date='Aug 15 2006, 19:30' post='144734']
[quote name='viael' post='144726' date='Aug 15 2006, 19:05']
[quote name='RedFroggy' post='144279' date='Aug 14 2006, 15:20']
Я во внутреннюю flash контроллера пишу. Функция записи небольшая получается, да и быстродействие несоизмеримо по сравнению с вариантом EEPROMа.
[/quote]

Я так понимаю надо работать с целым сектором даже если надо записать 1 байт?
[/quote]
Да, с целым сектором 512 байт. Поэтому перед записью даже одного байта, придётся все полезные данные сохранить в буфер, т.к. операции записи предшествует операция стирания.
[/7quote]
Явно не подходит для кристалов с RAM<768 байт. sad.gif
[/quote]
Почему не подходит? Никто ведь не заставляет запоминать состояние всех 512 байт. Если у Вас, скажем, 10 байт настроек, так и сохраняйте в буфер эти 10 байт. А потом после стирания их восстанавливайте во флеш.
viael
Цитата
Почему не подходит? Никто ведь не заставляет запоминать состояние всех 512 байт. Если у Вас, скажем, 10 байт настроек, так и сохраняйте в буфер эти 10 байт. А потом после стирания их восстанавливайте во флеш.



А у вас есть пример реализации на кейле.Этож надо сразу забить блок флеша размером 512 шоб компилятор его не заюзал.
RedFroggy
Цитата(viael @ Aug 15 2006, 21:49) *
Цитата

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



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

Завтра вышлю пример
viael
Цитата(RedFroggy @ Aug 15 2006, 22:51) *
Цитата(viael @ Aug 15 2006, 21:49) *

Цитата

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



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

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

Я уже сам допер biggrin.gif
Поковырялся в апликухах и написал это:
Код
   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 работает.
Но примерчик все рано вышли интересно как у тебя реализовано.
RedFroggy
Цитата(viael @ Aug 16 2006, 01:21) *
Цитата(RedFroggy @ Aug 15 2006, 22:51) *

Цитата(viael @ Aug 15 2006, 21:49) *

Цитата

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



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

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

Я уже сам допер biggrin.gif
Поковырялся в апликухах и написал это:
Код
   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 много места не занимает при обработке.
RedFroggy
Цитата(Igor_K @ Aug 16 2006, 19:44) *
Не обязательно работать с такими большими секторами. Scratchpad - это тоже сектор, и имеет размер 128 байт. Очень удобно как раз для хранения настроек, и в XRAM много места не занимает при обработке.

Полностью согласен. Всегда стараюсь так делать, если для хранения настроек хватает 128 байт.
viael
Цитата(RedFroggy @ Aug 16 2006, 20:50) *
Цитата(Igor_K @ Aug 16 2006, 19:44) *

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

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

А если Scratchpad нет в применяемом контроллере
RedFroggy
Цитата(viael @ Aug 17 2006, 11:31) *
Цитата(RedFroggy @ Aug 16 2006, 20:50) *

Цитата(Igor_K @ Aug 16 2006, 19:44) *

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

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

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

Используйте 512-байтный сектор
_Andu_
мы в своих устройствах используем внешнюю флаш. С точки зрения размера кода это это оправдано так как память программ использована вся практически 256кб на F120. Конфигурация устройства занимает несколько кб, также надо хранить журналы итого мы используем 32 кб флаш. еще при записи во внутреннюю флаш надо запрещать прерывания. Это такой скольский момент не всегда это можно. Но смотря для каких задач.
nik_al
Цитата(_Andu_ @ Aug 17 2006, 16:09) *
С точки зрения размера кода это это оправдано так как память программ использована вся практически 256кб на F120.

Если не секрет у какого F120 память программ 256kb мнеб такой пригодился
evg123
Варианотов нет - или работать с внутренним флэшом (но не в последней станице, т.к. там системные флаги), или вешать внешний флэш, или вешать далассовский таймер DS1307. По I2C. Там кроме реального времени есть еще 50 байт статической памяти. Реальное время - вещь тоже не плохая для встроенной техники. Могу дать пример программки на F310 c параметрами во флеш (датчик наклона). Калибровки сохранются там. Но через форумотправить его не смог.
RedFroggy
Цитата(evg123 @ Sep 13 2006, 16:10) *
Варианотов нет - или работать с внутренним флэшом (но не в последней станице, т.к. там системные флаги), или вешать внешний флэш, или вешать далассовский таймер DS1307. По I2C. Там кроме реального времени есть еще 50 байт статической памяти. Реальное время - вещь тоже не плохая для встроенной техники. Могу дать пример программки на F310 c параметрами во флеш (датчик наклона). Калибровки сохранются там. Но через форумотправить его не смог.

Тогда уж лучше PCF8583 от Филипса. Там хоть памяти 240 байт RAM.
evg123
Использовать флэш. Если настроек мало, то можно по i2C подклюичть DS1307, тогда кроме памяти (54 байт доп.стат ОЗУ) получите в придачу реальное время. Может оно вам понадобится. Шлю текст программки, в которой реализована работа с флэшью (датчик угла наклона).

[/quote]
Тогда уж лучше PCF8583 от Филипса. Там хоть памяти 240 байт RAM.
[/quote]
Из 51-ых самые перспективные (в плане производительности) - Сигналы. Лучше ориентироваться на него.
AndreyS
День добрый

А чем плох Даллосовский термодатчик с EEPROM 256 байт?? И температуру на плате имеете и ЕЕПРОМ да еще и на 256 байт. Тем более что при работе с внутренней флешей CPU SiLabs при обновлении прошивки через JTAG вы потеряете свои старые значения (кому то это очень удобно). Мне это только мешает. По этому все калиброванные К передачи храню в DS1624. Мне для обновления бутзагрузчика приходится очищать область кода Code Erase. Правда эта функция за одно очищает еще и скратч (сволочь). Вот по этому в скратч и не кладу К передачи.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.