Здравствуйте. Я, к сожалению, не работал с МК Миландр, деталей их устройства я не знаю. Но я программирую микроконтроллеры STM ARM ST32F4x и STM32F1x. И для них я я решал ту же задачу, записывал настройки во Flash память. Я опишу, как я делал это у себя. Flash память МК поделена на сектора разного размера(16, 32, 64 Кбайт) Стереть можно только сектор целиком. В Reference Manual не ясно написано, должна ли программа при записи во flash выполняться из SRAM или просто из другого Flash сектора. Я посмотрел примеры от ST, в них в SRAM ничего не записывалось и процедура стирания Flash была записана просто в другой Flash сектор. Я так и делаю у себя и это работает.
То есть, если я стираю/записываю сектор 10, то программа может выполнятся из Flash, но не в секторе 10.
Вот пример того, как я стираю/записываю flash у себя в STM32F4x
CODE
/**
* @brief Запись блока во flash
* @dst Адрес назначения(куда копировать)
* @src Адрес источника(откуда копировать)
* @num Кол-во байт для копирования
* @retval dst
*/
void* flash_memcpy(void* dst, void* src, int num)
{
int i;
irq_disable();
FLASH_Unlock();
for(i = 0; i < num; i++)
{
FLASH_ProgramByte((uint32_t)(dst) + i,
((uint8_t*)src)[i]);
FLASH_WaitForLastOperation();
}
FLASH_Lock();
irq_enable();
return dst;
}
/**
* @brief Стереть содержимое flash-памяти
*/
void flash_erase(void)
{
irq_disable();
FLASH_Unlock();
FLASH_EraseSector(FLASH_Sector_11, VoltageRange_3);
FLASH_Lock();
irq_enable();
}
Если же Вам все же нужно выполнять программу из SRAM, то в Keil проще всего воспользоваться функциональностью scatter/loader, например, как описано вот здесь.
http://www.keil.com/support/docs/3723.htm