реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> STM8S EEPROM надо ли ждать EOP флага после записи 1 байта?
sigmaN
сообщение Jun 22 2017, 11:24
Сообщение #1


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Мне надо записывать два байта подряд(т.е. 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 тоже нет, но на душе всё равно не спокойно )))))


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jun 22 2017, 19:04
Сообщение #2


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Я проверял, зависаний не было. Работал с STM8S105, STM8AF52Ax.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Jun 22 2017, 20:06
Сообщение #3


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Ощинь странная история. Лаадно, будем тестирвать... Есть дискавэри с S105 устрою более детальный тест


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jun 23 2017, 07:21
Сообщение #4


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(sigmaN @ Jun 22 2017, 16:24) *
В исходниках STDLib от ST ожидания EOP тоже нет, но на душе всё равно не спокойно )))))

Вспомнил. Я тоже сначала подсмотрел в STDLib и сделал без ожидания. И словил глюки - иногда не успевал записываться не первый байт в последовательности. Я добавил ожидание, и глюки пропали.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Jun 23 2017, 08:53
Сообщение #5


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



У меня глюки и так и так. Я правда в функции записи снимал и ставил защиту на запись. Если снятие защиты сделать чуть раньше и потом не трогать то вроде без глюков и с ожиданием и без ожидания пишет.


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Jun 25 2017, 08:45
Сообщение #6


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Оставил ожидание, но с частым снятием/установкой защиты от записи явно присутствуют какие-то проблемы.
Функция записи 2х байт вначале проверяла флаг DUL, если он не стоит то разлочивала ипром и писала два байта, после чего сразу залочивала ипром путем записи 0 в DUL.
Глючило(незапись некоторых байтов) и иногда подвисало на ожидании EOP именно пока не убрал эту разлочку/залочку.


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jun 25 2017, 15:36
Сообщение #7


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



А пауза после разлочки/залочки не спасает?


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Jun 25 2017, 20:46
Сообщение #8


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Не пробовал, должна по идее спасать. Забил я на это дело, у меня указатель на eeprom по которому все модули считывают настройки сделан const, чтобы компилятор бил по рукам при попытках через него что-то туда писать. А там где надо запись идет через другой указатель в строго дозированных кол-вах)) Посчитал это достаточной защитой на данный момент


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Jun 26 2017, 09:54
Сообщение #9


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Хотел на дискавэри для уточнения всех ньюансов еще раз всё это дело испытать
а оказалось, что на STM8S105, который там стоит, есть read-while-write (RWW) capability. Загуглил STM8AF52A, с которым у вас был опыт работы и оказалось там тоже RWW есть.

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

Add:
Нашел!
А вот и было такое предчувствие, что что-то тут не чисто... Что где-то не доглядел )))
Эскизы прикрепленных изображений
Прикрепленное изображение
 


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jun 26 2017, 10:38
Сообщение #10


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



sm.gif Я чего-то такого и ждал. У STM такое часто бывает.
Интересно, а в либе своей они проверяют этот DUL?


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Jun 27 2017, 14:18
Сообщение #11


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Неа, не проверяют. Я ж туда в первую очередь и полез смотреть как там сделана запись...
Только многократное перечитывание даташита спасет ))

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. Ох и на долго запомню я этот прикол ))))



--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
Эдди
сообщение Jun 27 2017, 19:25
Сообщение #12


Знающий
****

Группа: Участник
Сообщений: 825
Регистрация: 16-04-15
Из: КЧР, Нижний Архыз
Пользователь №: 86 250



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

Насчет сторожевого пса: читайте внимательно даташит, а не кривые коды SPL. Тем паче, SPL для STM8 — это ж вообще дикость какая-то! Там же RM'а того — полтысячи страниц всего.
Когда мне понадобился сторожевой таймер, взлетело с первой попытки — потому как по даташиту делаю.
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Jun 27 2017, 20:08
Сообщение #13


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Цитата
взлетело с первой попытки — потому как по даташиту делаю.
Ну я вот немного не дочитал с первого раза....


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jun 27 2017, 20:19
Сообщение #14


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(Эдди @ Jun 28 2017, 00:25) *
SPL не пользуюсь. DUL проверяю, как и пишут в даташите.

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

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


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Jun 27 2017, 20:34
Сообщение #15


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Цитата
разблокировка производится только один раз при старте программы

Так нет же, вроде как тут-же строкой выше анлок
Код
// unlock memory
    FLASH_DUKR = EEPROM_KEY1;
    FLASH_DUKR = EEPROM_KEY2;
    // check bit DUL=1 in FLASH_IAPSR
    if(!(FLASH_IAPSR & 0x08))
             return 0;


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
Эдди
сообщение Jun 28 2017, 05:32
Сообщение #16


Знающий
****

Группа: Участник
Сообщений: 825
Регистрация: 16-04-15
Из: КЧР, Нижний Архыз
Пользователь №: 86 250



Цитата(AHTOXA @ Jun 27 2017, 23:19) *
Ну кто ж так проверяет? sm.gif
По-хорошему, тут нужен цикл.

Согласен. За 1-2 такта МК может и не успеть нужный флаг выставить. Нужно немножко подождать.
Пример, кстати, я дурацкий привел: во всех этих вольтметрах EEPROM использовался лишь на стадии отладки (и то, в одном каком-то), и дальше этот код тупо копировался, без реального использования.
Здесь уже более осмысленное использование: в EEPROM сохраняется ROM-код обнаруженных термодатчиков.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jun 28 2017, 06:29
Сообщение #17


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(sigmaN @ Jun 28 2017, 01:34) *
Так нет же, вроде как тут-же строкой выше анлок

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


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Эдди
сообщение Jun 28 2017, 08:23
Сообщение #18


Знающий
****

Группа: Участник
Сообщений: 825
Регистрация: 16-04-15
Из: КЧР, Нижний Архыз
Пользователь №: 86 250



Строчка 45 из того файла (почему-то неправильно ссылки передаются на элементы внутри веб-страницы): сначала ждем окончания записи, потом лочим.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jun 28 2017, 09:23
Сообщение #19


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



А, точно. Проглядел.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Jun 28 2017, 19:13
Сообщение #20


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Лочится ниже это да, но DUL всё равно не ожидается,а проверяется.
т.е. с вашим if() функция может отработать в холостую и выскочить на return, не записав ничего.
Определенно на 41 строке вместо if() по уму должен быть while()

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



--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
Эдди
сообщение Jun 29 2017, 05:30
Сообщение #21


Знающий
****

Группа: Участник
Сообщений: 825
Регистрация: 16-04-15
Из: КЧР, Нижний Архыз
Пользователь №: 86 250



Да я ж говорю, плохой пример привел (в "1-wire" более правильно сделано, но тоже с косяками).
А while там нельзя — мало ли что, можно наткнуться на бесконечное зависание. Лучше сделать for с nop и проверкой внутри. Циклов 10-15 подождал, если изменений нет — явно какая-то засада.
Но я пока почти забил на STM8, мне на STM32 надо кое-какие вещи делать. И реализовать псевдоEEPROM на flash...
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Jun 29 2017, 09:22
Сообщение #22


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Цитата
А while там нельзя
Так тогда и на EOP while нельзя )))))) А вдруг не закончится программирование и будет зависание? )
Если в даташите не указано, что иногда в ответ на разлочку ипрома флаг DUL может вдруг не подняться - то ваши опасения не обоснованы.
Для сбоев и форс-мажорных обстоятельств есть watchdog.


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
VladislavS
сообщение Jul 30 2017, 07:42
Сообщение #23


Местный
***

Группа: Свой
Сообщений: 475
Регистрация: 14-04-05
Из: Москва
Пользователь №: 4 140



Цитата(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.
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Jul 30 2017, 10:28
Сообщение #24


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



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


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
VladislavS
сообщение Jul 30 2017, 16:15
Сообщение #25


Местный
***

Группа: Свой
Сообщений: 475
Регистрация: 14-04-05
Из: Москва
Пользователь №: 4 140



Всё с точностью до наоборот. Проц без 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.
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Jul 31 2017, 09:40
Сообщение #26


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Код
/**
  * @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 тоже проверяется в индусском коде.
Может быть у вас старая версия библиотеки?


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jul 31 2017, 09:55
Сообщение #27


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



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

Как видно тут функция определена как "IN_RAM", а в случае исполнения из ОЗУ очевидно, что CPU не остановится до завершения записи, а значит - проверять нужно.
Я вообще на всякий случай сделал загрузку данных в EEPROM кодом выполняющимся в ОЗУ, и этот же код ожидает готовности (EOP), после чего уже - RET во flash. Так как в даташите описано туманно, а индусский код не вызывает доверия.
Go to the top of the page
 
+Quote Post
VladislavS
сообщение Jul 31 2017, 11:18
Сообщение #28


Местный
***

Группа: Свой
Сообщений: 475
Регистрация: 14-04-05
Из: Москва
Пользователь №: 4 140



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

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

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

Вывод: чти даташит на каждый чип!
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Jul 31 2017, 12:57
Сообщение #29


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Да нет там особого зоопарка. Есть только RWW и не-RWW чипы.
Вся эта история с IN_RAM требуется только для флеша(исходя из даташита).


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 2nd August 2025 - 19:03
Рейтинг@Mail.ru


Страница сгенерированна за 0.01652 секунд с 7
ELECTRONIX ©2004-2016