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

STM8S EEPROM надо ли ждать EOP флага после записи 1 байта?

Ну кто ж так проверяет? :)

По-хорошему, тут нужен цикл.

Согласен. За 1-2 такта МК может и не успеть нужный флаг выставить. Нужно немножко подождать.

Пример, кстати, я дурацкий привел: во всех этих вольтметрах EEPROM использовался лишь на стадии отладки (и то, в одном каком-то), и дальше этот код тупо копировался, без реального использования.

Здесь уже более осмысленное использование: в EEPROM сохраняется ROM-код обнаруженных термодатчиков.

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


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

Так нет же, вроде как тут-же строкой выше анлок

Я имел в виду, что обратно-то после записи не залочивается.

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


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

Строчка 45 из того файла (почему-то неправильно ссылки передаются на элементы внутри веб-страницы): сначала ждем окончания записи, потом лочим.

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


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

Лочится ниже это да, но 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...

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


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

А while там нельзя
Так тогда и на EOP while нельзя )))))) А вдруг не закончится программирование и будет зависание? )

Если в даташите не указано, что иногда в ответ на разлочку ипрома флаг DUL может вдруг не подняться - то ваши опасения не обоснованы.

Для сбоев и форс-мажорных обстоятельств есть watchdog.

 

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


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

Так тогда и на EOP while нельзя )))))) А вдруг не закончится программирование и будет зависание? )

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

 

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.

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


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

Вы не дочитали исходники немного, есть процы с ReadWhileWrite и тогда для ипрома ждать ничего не нужно, а есть процы без этой функции и там это учитывается условной компиляцией.

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


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

Всё с точностью до наоборот. Проц без 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.

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


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

/**
  * @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 тоже проверяется в индусском коде.

Может быть у вас старая версия библиотеки?

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


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

Кажется EOP тоже проверяется в индусском коде.

Может быть у вас старая версия библиотеки?

Как видно тут функция определена как "IN_RAM", а в случае исполнения из ОЗУ очевидно, что CPU не остановится до завершения записи, а значит - проверять нужно.

Я вообще на всякий случай сделал загрузку данных в EEPROM кодом выполняющимся в ОЗУ, и этот же код ожидает готовности (EOP), после чего уже - RET во flash. Так как в даташите описано туманно, а индусский код не вызывает доверия.

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


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

Кажется EOP тоже проверяется в индусском коде.

Может быть у вас старая версия библиотеки?

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

 

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

 

Вывод: чти даташит на каждый чип!

 

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


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

Да нет там особого зоопарка. Есть только RWW и не-RWW чипы.

Вся эта история с IN_RAM требуется только для флеша(исходя из даташита).

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


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

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

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

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

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

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

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

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

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

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