Работаю с 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"); //
|