Eddy_Em 1 28 июня, 2017 Опубликовано 28 июня, 2017 · Жалоба Ну кто ж так проверяет? :) По-хорошему, тут нужен цикл. Согласен. За 1-2 такта МК может и не успеть нужный флаг выставить. Нужно немножко подождать. Пример, кстати, я дурацкий привел: во всех этих вольтметрах EEPROM использовался лишь на стадии отладки (и то, в одном каком-то), и дальше этот код тупо копировался, без реального использования. Здесь уже более осмысленное использование: в EEPROM сохраняется ROM-код обнаруженных термодатчиков. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 28 июня, 2017 Опубликовано 28 июня, 2017 · Жалоба Так нет же, вроде как тут-же строкой выше анлок Я имел в виду, что обратно-то после записи не залочивается. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Eddy_Em 1 28 июня, 2017 Опубликовано 28 июня, 2017 · Жалоба Строчка 45 из того файла (почему-то неправильно ссылки передаются на элементы внутри веб-страницы): сначала ждем окончания записи, потом лочим. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 28 июня, 2017 Опубликовано 28 июня, 2017 · Жалоба А, точно. Проглядел. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sigmaN 0 28 июня, 2017 Опубликовано 28 июня, 2017 · Жалоба Лочится ниже это да, но DUL всё равно не ожидается,а проверяется. т.е. с вашим if() функция может отработать в холостую и выскочить на return, не записав ничего. Определенно на 41 строке вместо if() по уму должен быть while() Там вообще очень много всего интересного. Например как вы целый массив в один адрес пишите ))))) for(i = 0; i < len; i++) *addr = val[i]; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Eddy_Em 1 29 июня, 2017 Опубликовано 29 июня, 2017 · Жалоба Да я ж говорю, плохой пример привел (в "1-wire" более правильно сделано, но тоже с косяками). А while там нельзя — мало ли что, можно наткнуться на бесконечное зависание. Лучше сделать for с nop и проверкой внутри. Циклов 10-15 подождал, если изменений нет — явно какая-то засада. Но я пока почти забил на STM8, мне на STM32 надо кое-какие вещи делать. И реализовать псевдоEEPROM на flash... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sigmaN 0 29 июня, 2017 Опубликовано 29 июня, 2017 · Жалоба А while там нельзя Так тогда и на EOP while нельзя )))))) А вдруг не закончится программирование и будет зависание? ) Если в даташите не указано, что иногда в ответ на разлочку ипрома флаг DUL может вдруг не подняться - то ваши опасения не обоснованы. Для сбоев и форс-мажорных обстоятельств есть watchdog. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 29 30 июля, 2017 Опубликовано 30 июля, 2017 · Жалоба Так тогда и на 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sigmaN 0 30 июля, 2017 Опубликовано 30 июля, 2017 · Жалоба Вы не дочитали исходники немного, есть процы с ReadWhileWrite и тогда для ипрома ждать ничего не нужно, а есть процы без этой функции и там это учитывается условной компиляцией. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 29 30 июля, 2017 Опубликовано 30 июля, 2017 · Жалоба Всё с точностью до наоборот. Проц без 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 0 31 июля, 2017 Опубликовано 31 июля, 2017 · Жалоба /** * @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 184 31 июля, 2017 Опубликовано 31 июля, 2017 · Жалоба Кажется EOP тоже проверяется в индусском коде. Может быть у вас старая версия библиотеки? Как видно тут функция определена как "IN_RAM", а в случае исполнения из ОЗУ очевидно, что CPU не остановится до завершения записи, а значит - проверять нужно. Я вообще на всякий случай сделал загрузку данных в EEPROM кодом выполняющимся в ОЗУ, и этот же код ожидает готовности (EOP), после чего уже - RET во flash. Так как в даташите описано туманно, а индусский код не вызывает доверия. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 29 31 июля, 2017 Опубликовано 31 июля, 2017 · Жалоба Кажется EOP тоже проверяется в индусском коде. Может быть у вас старая версия библиотеки? Да не старая, а от другого чипа. Даже в приведённом вами коде видно, что для разных чипов всё по разному. Теперь понятно, почему IAR не доделал полноценно работу с __eeprom как в AVR. Именно из-за этого зоопарка. :( Вывод: чти даташит на каждый чип! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sigmaN 0 31 июля, 2017 Опубликовано 31 июля, 2017 · Жалоба Да нет там особого зоопарка. Есть только RWW и не-RWW чипы. Вся эта история с IN_RAM требуется только для флеша(исходя из даташита). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться