Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Контроллер Флеш-памяти
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > MSP430
binom
Работаю с 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");
//
rezident
Цитата(binom @ Jun 13 2005, 23:30)
в IARе описываю 1-ю ситуацию(стирание инициируется не из ОЗУ а из Флеш) - код не стирается хотя он распольжен начиная с адреса 0х1100.

описываю 2-ю ситуацию(стирание инициируется не из ОЗУ а из Флеш) - код стирается содержимое всей памяти 0xff.
Вопрос: Чё за косяк?

Вы ассемблерный код, который сгенерировал IAR, смотрели? Может компилятор там чего-то такого соптимизировал.
Цитата(binom @ Jun 13 2005, 23:30)
Еще одно наблюдение: при записи в режиме байт/слово можно последовательно записать несколько слов.

Цитата(binom @ Jun 13 2005, 23:30)
А вот стирание 2-х сегментов таким образом не пройдет. Бит ERASE аппаратно сбрасывается после первой команды фиктивной записи, и генерится прерывание ACCVIFG.
*

Ну что тут сказать? Так и должно быть. Точнее так задумано. RTFM smile.gif
Цитата
Бит BUSY устанавливается немедленно после фиктивной записи и остается установленным в течение всего цикла стирания. Биты BUSY, MERAS и ERASE автоматически очищаются, когда цикл завершен.
kilgor
Цитата(binom @ Jun 13 2005, 20:30)
в IARе описываю 1-ю ситуацию(стирание инициируется не из ОЗУ а из Флеш) - код не стирается хотя он распольжен начиная с адреса 0х1100.
*


Конечно все зависит от задачи, но по-моему лучше будет сделать процедуру стирания (точнее запуск стирания и например полинг ее окончания, если и прерыванием по окончанию не хочется работать) расположенную в ОЗУ (подгружамую в озу). С relocatable кодом это вообще не проблема, если конечно дружите с асмом. Кстати - не пробывали стирать из озу эффект с сегментами остается?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.