STM32F10x (XL series): Похоже нашел багу во флеш-контроллере. Не сбрасывается бит STRT. В описании (PM0068 Programming manual STM32F10xxx XL-density Flash programming) сказано про бит старта операции стирания в Flash control register (FLASH_CR):
Bit 6 STRT: Start
This bit triggers an ERASE operation when set. This bit is set only by software and reset when the BSY bit is reset.
Так вот, он в действительности не снимается после операции стирания памяти опций (The option byte erase sequence) и остается взведенным.
Когда я после программирования option bytes перехожу к стиранию памяти с кодом инициализации, этот бит остается взведенным. Поэтому последовательность стирания страницы:
- Set the PER bit in the FLASH_CR register
- Program the FLASH_AR register to select a page to erase
- Set the STRT bit in the FLASH_CR register
срабатывает слишком рано, сразу после установки бита PER, еще до момента занесения адреса страницы в регистр адреса. При этом стирается страница с кодом выполняющейся программы и все рассыпается.
Эту ошибку удалось обойти принудительным сбросом бита STRT после операции стирания опций.