Не ограничиваю никакие прерывания, просто выполняю код. У меня все нормально работает. Как под отладчиком, так и без него:
CODE
void InternalFlash::lock()
{
FLASH->CR |= FLASH_CR_LOCK;
}
void InternalFlash::unlock(void)
{
FLASH->KEYR = FLASH_KEY1;
FLASH->KEYR = FLASH_KEY2;
}
//Функция стирает ВСЕ страницы. При её вызове прошивка самоуничтожается
//void flash_erase_all_pages(void)
//{
// FLASH->CR |= FLASH_CR_MER; //Устанавливаем бит стирания ВСЕХ страниц
// FLASH->CR |= FLASH_CR_STRT; //Начать стирание
// while(!FlashReady); // Ожидание готовности.. Хотя оно уже наверное ни к чему здесь...
// FLASH->CR &= FLASH_CR_MER;
//}
void InternalFlash::erasePage(byte page)
{
if(page < 12 && page > 0)
{
while(FLASH_IS_BUSY);// Wait while flash is busy
FLASH->CR |= FLASH_CR_PSIZE_1;// Parallelism to x32
FLASH->CR |= FLASH_CR_SER | (page << 3); //Устанавливаем бит стирания одной страницы и стираем сектор 1 - 11
FLASH->CR |= FLASH_CR_STRT; // Запускаем стирание
while(FLASH_IS_BUSY);//Ждем пока страница сотрется.
}
}
void InternalFlash::write(uint address, uint data)
{
while(FLASH_IS_BUSY);//Ожидаем готовности флеша к записи
FLASH->CR |= FLASH_CR_PG; //Разрешаем программирование флеша
*(uint*)address = data;// Write word cos we have 32bit parallelism
while(FLASH_IS_BUSY);//Ожидаем готовности флеша к записи
FLASH->CR &= ~FLASH_CR_PG; //Запрещаем программирование флеша
}
void InternalFlash::writeBuf(uint address, uint *data, ushort size)
{
while(FLASH_IS_BUSY);//Ожидаем готовности флеша к записи
FLASH->CR |= FLASH_CR_PG; //Разрешаем программирование флеша
for(ushort i = 0; i < size; ++i)
{
((uint *)address)[i] = data[i];// Write word cos we have 32bit parallelism
while(FLASH_IS_BUSY);//Ожидаем готовности флеша к записи
}
FLASH->CR &= ~FLASH_CR_PG; //Запрещаем программирование флеша
}
Все методы класса InternalFlash
stm32f205, но, думаю, разницы не будет с другими ядрами