Работаю с msp430f149.
Согласно документации есть возможность 1)масового стирания сегментов основной памяти и 2)массового стирания сегментов основной и информационной памяти.
Соответственно (MERAS = 1 ERASE = 0)- это 1), (MERAS = 1 ERASE = 1) -это 2)
по идее при массовом стирании исполняемый код тоже должен стереться.
в IARе описываю 1-ю ситуацию(стирание инициируется не из ОЗУ а из Флеш) - код не стирается хотя он распольжен начиная с адреса 0х1100.
описываю 2-ю ситуацию(стирание инициируется не из ОЗУ а из Флеш) - код стирается содержимое всей памяти 0xff.
Вопрос: Чё за косяк?
Еще одно наблюдение: при записи в режиме байт/слово можно последовательно записать несколько слов. Т.е. корректно произойдет запись с помощью следующего кода:
int *memory1 = (int*)0x1000;
int *memory2 = (int*)0x1080;
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
//записываем слово в режиме не блочной записи
asm("dint");
FCTL1 = FWKEY + WRT;
FCTL2 = FWKEY + FSSEL_2 + FN0;
FCTL3 = FWKEY;
*memory1 = 0x1234;//записываем в 1-ый инф. сегмент
*memory2 = 0x5678;//записываем во 2-ой инф. сегмент
while( (FCTL3 & BUSY) );
FCTL3 = FWKEY + LOCK;
asm("eint");
//
А вот стирание 2-х сегментов таким образом не пройдет. Бит ERASE аппаратно сбрасывается после первой команды фиктивной записи, и генерится прерывание ACCVIFG.
int *memory1 = (int*)0x1000;
int *memory2 = (int*)0x1080;
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
//стираем сегмент
asm("dint");
FCTL1 = FWKEY + MERAS + ERASE;
FCTL2 = FWKEY + FSSEL_2 + FN0;
FCTL3 = FWKEY;
*memory1 = 0x1234;//ПОСЛЕ ЭТОЙ КОМАНДЫ ERASE = 0
*memory2 = 0x5678;//ПОСЛЕ ЭТОЙ КОМАНДЫ ACCVIFG = 1(косяк)
while( (FCTL3 & BUSY) );
FCTL3 = FWKEY + LOCK;
asm("eint");
//