|
STM8S EEPROM надо ли ждать EOP флага после записи 1 байта? |
|
|
|
Jun 28 2017, 05:32
|
Знающий
   
Группа: Участник
Сообщений: 825
Регистрация: 16-04-15
Из: КЧР, Нижний Архыз
Пользователь №: 86 250

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

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...
|
|
|
|
|
Jun 29 2017, 09:22
|

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

|
Цитата А while там нельзя Так тогда и на EOP while нельзя )))))) А вдруг не закончится программирование и будет зависание? ) Если в даташите не указано, что иногда в ответ на разлочку ипрома флаг DUL может вдруг не подняться - то ваши опасения не обоснованы. Для сбоев и форс-мажорных обстоятельств есть watchdog.
--------------------
The truth is out there...
|
|
|
|
|
Jul 30 2017, 07:42
|
Местный
  
Группа: Свой
Сообщений: 475
Регистрация: 14-04-05
Из: Москва
Пользователь №: 4 140

|
Цитата(sigmaN @ Jun 29 2017, 12:22)  Так тогда и на EOP while нельзя )))))) А вдруг не закончится программирование и будет зависание? ) Писатели SPL о чём-то подобном подозревали  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.
|
|
|
|
|
Jul 30 2017, 16:15
|
Местный
  
Группа: Свой
Сообщений: 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.
|
|
|
|
|
Jul 31 2017, 11:18
|
Местный
  
Группа: Свой
Сообщений: 475
Регистрация: 14-04-05
Из: Москва
Пользователь №: 4 140

|
Цитата(sigmaN @ Jul 31 2017, 12:40)  Кажется EOP тоже проверяется в индусском коде. Может быть у вас старая версия библиотеки? Да не старая, а от другого чипа. Даже в приведённом вами коде видно, что для разных чипов всё по разному. Теперь понятно, почему IAR не доделал полноценно работу с __eeprom как в AVR. Именно из-за этого зоопарка.  Вывод: чти даташит на каждый чип!
|
|
|
|
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|