khlenar 5 29 апреля, 2019 Опубликовано 29 апреля, 2019 · Жалоба Здравствуйте все. Есть функция для стирания страницы void PageErase(uint32_t addr) { while((FLASH->SR & FLASH_SR_BSY) != 0); FLASH->CR |= FLASH_CR_PER; FLASH->AR = (uint32_t)addr; FLASH->CR |= FLASH_CR_STRT; while((FLASH->SR & FLASH_SR_BSY) == 1); for(volatile int i = 0; i < 10; i++); // Делаю задержку , иначе дальше не пишет в память FLASH->CR &= ~FLASH_CR_PER; } Если не делать задержку, то далее не пишет в память. Стандартная запись. На STM32F100 нормально без задержек пишет. Задержки во флешке выставлены правильно, в соответствии с частотой. Не критично конечно, но... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 29 апреля, 2019 Опубликовано 29 апреля, 2019 · Жалоба Поставьте вместо задержки положенную инструкцию: __DSB(); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
khlenar 5 29 апреля, 2019 Опубликовано 29 апреля, 2019 · Жалоба 7 часов назад, AHTOXA сказал: Поставьте вместо задержки положенную инструкцию: __DSB(); Ок! Спасибо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Allregia 9 9 мая, 2019 Опубликовано 9 мая, 2019 · Жалоба On 4/29/2019 at 8:15 AM, AHTOXA said: Поставьте вместо задержки положенную инструкцию: __DSB(); А почему не __ISB(); ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 9 мая, 2019 Опубликовано 9 мая, 2019 · Жалоба Я не помню, где-то увидел, так и применяю. Ну и по описанию это то, что нужно: Цитата DSB Data Synchronization Barrier acts as a special kind of memory barrier. No instruction in program order after this instruction executes until this instruction completes. This instruction completes when: All explicit memory accesses before this instruction complete. All Cache, Branch predictor and TLB maintenance operations before this instruction complete. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться