Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM8S EEPROM надо ли ждать EOP флага после записи 1 байта?
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
sigmaN
Мне надо записывать два байта подряд(т.е. 16ти битную переменную)
У меня stm8s003, у которого судя по даташиту нет read-while-write (RWW) capability.

В документации сказано
Цитата
Devices without RWW capability: The application stops for the duration of the byte
program operation.

Это означает, что я могу не проверять EOP флаг? И программировать хоть все 128 байт в цикле?

Я пробовал проверять этот флаг и иногда программа на этом цикле ожидания виснет....А иногда проскакивает. Что очень странно.
Без цикла ожидания работает, но как-то на душе не спокойно....

В исходниках STDLib от ST ожидания EOP тоже нет, но на душе всё равно не спокойно )))))
AHTOXA
Я проверял, зависаний не было. Работал с STM8S105, STM8AF52Ax.
sigmaN
Ощинь странная история. Лаадно, будем тестирвать... Есть дискавэри с S105 устрою более детальный тест
AHTOXA
Цитата(sigmaN @ Jun 22 2017, 16:24) *
В исходниках STDLib от ST ожидания EOP тоже нет, но на душе всё равно не спокойно )))))

Вспомнил. Я тоже сначала подсмотрел в STDLib и сделал без ожидания. И словил глюки - иногда не успевал записываться не первый байт в последовательности. Я добавил ожидание, и глюки пропали.
sigmaN
У меня глюки и так и так. Я правда в функции записи снимал и ставил защиту на запись. Если снятие защиты сделать чуть раньше и потом не трогать то вроде без глюков и с ожиданием и без ожидания пишет.
sigmaN
Оставил ожидание, но с частым снятием/установкой защиты от записи явно присутствуют какие-то проблемы.
Функция записи 2х байт вначале проверяла флаг DUL, если он не стоит то разлочивала ипром и писала два байта, после чего сразу залочивала ипром путем записи 0 в DUL.
Глючило(незапись некоторых байтов) и иногда подвисало на ожидании EOP именно пока не убрал эту разлочку/залочку.
AHTOXA
А пауза после разлочки/залочки не спасает?
sigmaN
Не пробовал, должна по идее спасать. Забил я на это дело, у меня указатель на eeprom по которому все модули считывают настройки сделан const, чтобы компилятор бил по рукам при попытках через него что-то туда писать. А там где надо запись идет через другой указатель в строго дозированных кол-вах)) Посчитал это достаточной защитой на данный момент
sigmaN
Хотел на дискавэри для уточнения всех ньюансов еще раз всё это дело испытать
а оказалось, что на STM8S105, который там стоит, есть read-while-write (RWW) capability. Загуглил STM8AF52A, с которым у вас был опыт работы и оказалось там тоже RWW есть.

Потом как-нибудь именно на 8S003 окончательно разберусь какая задержка после залочки-разлочки нужна и вообще что это было.. Потому как нигде в документации не упоминается ничего похожего. Errata еще надо бы почитать наверно, но что-то терзают меня смутные сомнения, может ложная тревога и я там где-то накосячил при экспериментах....

Add:
Нашел!
А вот и было такое предчувствие, что что-то тут не чисто... Что где-то не доглядел )))
AHTOXA
sm.gif Я чего-то такого и ждал. У STM такое часто бывает.
Интересно, а в либе своей они проверяют этот DUL?
sigmaN
Неа, не проверяют. Я ж туда в первую очередь и полез смотреть как там сделана запись...
Только многократное перечитывание даташита спасет ))

P.S.
А как я тут Independent Watchdog настраивал недавно. Прописал ему в регистры все настройки(с предварительной разлочкой записи, ну всё как положено).
Потом включаю ватчдог прописывая в регистр команду Enable. А собака стартует с дефолтными параметрами.
Я уже и туда и сюда всё перепроверил, использую же библиотеку STшную фирменную....
А потом в даташите вычитываю ВНЕЗАПНО
Цитата
Once enabled, the independent watchdog can be configured through the IWDG_PR, and IWDG_RLR registers.


Т.е. оказывается сначала надо ENABLE а потом у тебя есть 15ms чтобы успеть его сконфигурить до того как эта собака сработает с дефолтными настройками
И это всё указано только в одном предложении и ключевые слова тут Once enabled. Ох и на долго запомню я этот прикол ))))

Эдди
SPL не пользуюсь. DUL проверяю, как и пишут в даташите. Потом пишу данные и жду EOP. Все по даташиту. Работает нормально, ничего не зависает.

Насчет сторожевого пса: читайте внимательно даташит, а не кривые коды SPL. Тем паче, SPL для STM8 — это ж вообще дикость какая-то! Там же RM'а того — полтысячи страниц всего.
Когда мне понадобился сторожевой таймер, взлетело с первой попытки — потому как по даташиту делаю.
sigmaN
Цитата
взлетело с первой попытки — потому как по даташиту делаю.
Ну я вот немного не дочитал с первого раза....
AHTOXA
Цитата(Эдди @ Jun 28 2017, 00:25) *
SPL не пользуюсь. DUL проверяю, как и пишут в даташите.

Ну кто ж так проверяет? sm.gif
Код
    if(!(FLASH_IAPSR & 0x08))
        return 0;

По-хорошему, тут нужен цикл. Ваш код работает только за счёт тормознутости sdcc. (Или за счёт того, что разблокировка производится только один раз при старте программы).
sigmaN
Цитата
разблокировка производится только один раз при старте программы

Так нет же, вроде как тут-же строкой выше анлок
Код
// unlock memory
    FLASH_DUKR = EEPROM_KEY1;
    FLASH_DUKR = EEPROM_KEY2;
    // check bit DUL=1 in FLASH_IAPSR
    if(!(FLASH_IAPSR & 0x08))
             return 0;
Эдди
Цитата(AHTOXA @ Jun 27 2017, 23:19) *
Ну кто ж так проверяет? sm.gif
По-хорошему, тут нужен цикл.

Согласен. За 1-2 такта МК может и не успеть нужный флаг выставить. Нужно немножко подождать.
Пример, кстати, я дурацкий привел: во всех этих вольтметрах EEPROM использовался лишь на стадии отладки (и то, в одном каком-то), и дальше этот код тупо копировался, без реального использования.
Здесь уже более осмысленное использование: в EEPROM сохраняется ROM-код обнаруженных термодатчиков.
AHTOXA
Цитата(sigmaN @ Jun 28 2017, 01:34) *
Так нет же, вроде как тут-же строкой выше анлок

Я имел в виду, что обратно-то после записи не залочивается.
Эдди
Строчка 45 из того файла (почему-то неправильно ссылки передаются на элементы внутри веб-страницы): сначала ждем окончания записи, потом лочим.
AHTOXA
А, точно. Проглядел.
sigmaN
Лочится ниже это да, но DUL всё равно не ожидается,а проверяется.
т.е. с вашим if() функция может отработать в холостую и выскочить на return, не записав ничего.
Определенно на 41 строке вместо if() по уму должен быть while()

Там вообще очень много всего интересного. Например как вы целый массив в один адрес пишите )))))
Код
for(i = 0; i < len; i++)
*addr = val[i];

Эдди
Да я ж говорю, плохой пример привел (в "1-wire" более правильно сделано, но тоже с косяками).
А while там нельзя — мало ли что, можно наткнуться на бесконечное зависание. Лучше сделать for с nop и проверкой внутри. Циклов 10-15 подождал, если изменений нет — явно какая-то засада.
Но я пока почти забил на STM8, мне на STM32 надо кое-какие вещи делать. И реализовать псевдоEEPROM на flash...
sigmaN
Цитата
А while там нельзя
Так тогда и на EOP while нельзя )))))) А вдруг не закончится программирование и будет зависание? )
Если в даташите не указано, что иногда в ответ на разлочку ипрома флаг DUL может вдруг не подняться - то ваши опасения не обоснованы.
Для сбоев и форс-мажорных обстоятельств есть watchdog.
VladislavS
Цитата(sigmaN @ Jun 29 2017, 12:22) *
Так тогда и на EOP while нельзя )))))) А вдруг не закончится программирование и будет зависание? )

Писатели SPL о чём-то подобном подозревали sm.gif

CODE
FLASH_Status_TypeDef FLASH_WaitForLastOperation(FLASH_MemType_TypeDef FLASH_MemType) IN_RAM
{
uint32_t timeout = OPERATION_TIMEOUT;
uint8_t flagstatus = 0x00;
/* Wait until operation completion or write protected page occured */
if (FLASH_MemType == FLASH_MemType_Program)
{
while ((flagstatus == 0x00) && (timeout != 0x00))
{
flagstatus = (uint8_t)(FLASH->IAPSR & (uint8_t)(FLASH_IAPSR_EOP |
FLASH_IAPSR_WR_PG_DIS));
timeout--;
}
}
else
{
while ((flagstatus == 0x00) && (timeout != 0x00))
{
flagstatus = (uint8_t)(FLASH->IAPSR & (uint8_t)(FLASH_IAPSR_HVOFF |
FLASH_IAPSR_WR_PG_DIS));
timeout--;
}
}
if (timeout == 0x00 )
{
flagstatus = FLASH_Status_TimeOut;
}

return((FLASH_Status_TypeDef)flagstatus);
}


А ещё EOP они ждут только для FLASH, а для EEPROM ждут HVOFF. И, похоже, что при заблокированной записи ни то ни другое не вскочит, а вылезет WR_PG_DIS.
sigmaN
Вы не дочитали исходники немного, есть процы с ReadWhileWrite и тогда для ипрома ждать ничего не нужно, а есть процы без этой функции и там это учитывается условной компиляцией.
VladislavS
Всё с точностью до наоборот. Проц без RWW останавливает исполнение программы во время записи EEPROM и ждать не надо. RWW позволяет продолжить выполнение программы во время записи EEPROM, поэтому либо делай что-то полезное, либо жди, если хочешь ещё писать.

Я то кусок "индусского" кода привёл, так как они в случае EEPROM ждут (HVOFF или WR_PG_DIS или таймаут). При том что RM настаивает на(EOP или WR_PG_DIS)
Цитата
• In DATA area:
– Program execution stops during the ”End of high voltage” operation, that is when
the HVOFF flag is set, and the byte program operation is performed using the
read-while-write (RWW) capability in IAP mode.

The application can read the FLASH_IAPSR register to verify that the programming or erasing operation has been correctly executed:
• EOP flag is set after a successful programming operation
• WR_PG_DIS is set when the software has tried to write to a protected page. In this
case, the write procedure is not performed.
sigmaN
Код
/**
  * @brief  Wait for a Flash operation to complete.
  * @note   The call and execution of this function must be done from RAM in case
  *         of Block operation.
  * @param  FLASH_MemType : Memory type
  *         This parameter can be a value of @ref FLASH_MemType_TypeDef
  * @retval FLASH status
  */
IN_RAM(FLASH_Status_TypeDef FLASH_WaitForLastOperation(FLASH_MemType_TypeDef FLASH_MemType))
{
  uint8_t flagstatus = 0x00;
  uint16_t timeout = OPERATION_TIMEOUT;
  
  /* Wait until operation completion or write protection page occurred */
#if defined (STM8S208) || defined(STM8S207) || defined(STM8S007) || defined(STM8S105) || \
  defined(STM8S005) || defined(STM8AF52Ax) || defined(STM8AF62Ax) || defined(STM8AF626x)  
    if(FLASH_MemType == FLASH_MEMTYPE_PROG)
    {
      while((flagstatus == 0x00) && (timeout != 0x00))
      {
        flagstatus = (uint8_t)(FLASH->IAPSR & (uint8_t)(FLASH_IAPSR_EOP |
                                                        FLASH_IAPSR_WR_PG_DIS));
        timeout--;
      }
    }
    else
    {
      while((flagstatus == 0x00) && (timeout != 0x00))
      {
        flagstatus = (uint8_t)(FLASH->IAPSR & (uint8_t)(FLASH_IAPSR_HVOFF |
                                                        FLASH_IAPSR_WR_PG_DIS));
        timeout--;
      }
    }
#else /*STM8S103, STM8S903, STM8AF622x */
  while((flagstatus == 0x00) && (timeout != 0x00))
  {
    flagstatus = (uint8_t)(FLASH->IAPSR & (FLASH_IAPSR_EOP | FLASH_IAPSR_WR_PG_DIS));
    timeout--;
  }
#endif /* STM8S208, STM8S207, STM8S105, STM8AF52Ax, STM8AF62Ax, STM8AF262x */
  
  if(timeout == 0x00 )
  {
    flagstatus = FLASH_STATUS_TIMEOUT;
  }
  
  return((FLASH_Status_TypeDef)flagstatus);
}


Кажется EOP тоже проверяется в индусском коде.
Может быть у вас старая версия библиотеки?
jcxz
Цитата(sigmaN @ Jul 31 2017, 12:40) *
Кажется EOP тоже проверяется в индусском коде.
Может быть у вас старая версия библиотеки?

Как видно тут функция определена как "IN_RAM", а в случае исполнения из ОЗУ очевидно, что CPU не остановится до завершения записи, а значит - проверять нужно.
Я вообще на всякий случай сделал загрузку данных в EEPROM кодом выполняющимся в ОЗУ, и этот же код ожидает готовности (EOP), после чего уже - RET во flash. Так как в даташите описано туманно, а индусский код не вызывает доверия.
VladislavS
Цитата(sigmaN @ Jul 31 2017, 12:40) *
Кажется EOP тоже проверяется в индусском коде.
Может быть у вас старая версия библиотеки?

Да не старая, а от другого чипа. Даже в приведённом вами коде видно, что для разных чипов всё по разному.

Теперь понятно, почему IAR не доделал полноценно работу с __eeprom как в AVR. Именно из-за этого зоопарка. sad.gif

Вывод: чти даташит на каждый чип!
sigmaN
Да нет там особого зоопарка. Есть только RWW и не-RWW чипы.
Вся эта история с IN_RAM требуется только для флеша(исходя из даташита).
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.