Код
void erase_test(void) @ "BOOTSECTION"
{
_WAIT_FOR_SPM();
_ENABLE_RWW_SECTION();
_PAGE_ERASE(0x2800);
}
{
_WAIT_FOR_SPM();
_ENABLE_RWW_SECTION();
_PAGE_ERASE(0x2800);
}
Непосредственно перед вызовом прерывания запрещаю. Сама подпрограмма лежит в области загрузчика (в линкере секция BOOTSECTION прописана "куда надо"), страницу действительно стирает, но назад в основную программу не возвращается. Контроллер, кстати, продолжает генерировать ШИМ по одному из таймеров.
В чём может быть проблема?
Добавлю, что по адресу 0x2800..0x2880 (1 страница = 128 байт) нет кода программы, там лежат данные, так что сама себя программа стиранием этой области не портит.