Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Запись в информационную Flash.
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > MSP430
JohnKorsh
Добрый день!
Не подскажет ли кто причины следующего явления. Работаю с MSP430F5528. IAR, MSP-FET430UIF. Режим Debug. При записи в информационный сегмент D записанные данные во Flash читаются только в текущем сеансе отладки. Если выйти из режима отладки и снова войти, то читаются 0xFFFFFFFF – то есть сегмент стирается. При записи в сегмент A всё как и положено – после снятия и включения питания читается то, что записал. Привожу тестовые исходники для сегмента A с учётом его персонального LOCKA, хотя это копия примера.

//
// Write of the long word to the EEPROM.
//*****************************************************************
//
void Write_Dayb (void)
{
unsigned long *Flash_ptrD = NULL; // Initialize Flash pointer Seg A.

//---------------------------------------------------------------------------

Flash_ptrD = (unsigned long *) 0x1980; // Set of the segment A.

// Write of the long words to the segment A.

WDTCTL = WDTPW + WDTHOLD; // Stop of the WDT.
asm ("DINT"); // Disable of the interrupts.
//
while ((FCTL3 & BUSY) == BUSY)
{
}
//
FCTL3 = FWKEY; // Clear Lock bit.
FCTL3 = FWKEY + LOCKA; // Unlock of the A segment.
if ((FCTL3 & LOCKA) == LOCKA)
{
FCTL3 = FWKEY + LOCKA; // Unlock of the A segment.
}

FCTL1 = FWKEY + ERASE; // Set of the segment Erase bit.
*Flash_ptrD = 0; // Dummy write to erase Flash seg.
while ((FCTL3 & BUSY) == BUSY)
{
}
//
FCTL1 = FWKEY + BLKWRT; // Enable long-word write.
*Flash_ptrD = 0x12345678; // Write to Flash.
while ((FCTL3 & BUSY) == BUSY)
{
}
FCTL1 = FWKEY; // Clear WRT bit.
FCTL3 = FWKEY + LOCK + LOCKA; // Set LOCK bits.
if ((FCTL3 & LOCKA) != LOCKA)
{
FCTL3 = FWKEY + LOCK + LOCKA; // Set LOCK bits.
}
//
asm ("EINT"); // Enable of the interrupts.
Clr_WDT; // Start of the WDT.
}
//
// Read of the daybook contents from the EEPROM.
//*****************************************************************
//
void Read_Dayb (void)
{
unsigned long *Flash_ptrD = NULL; // Initialize Flash pointer Seg A.

//---------------------------------------------------------------------------

Flash_ptrD = (unsigned long *) 0x1980; // Set of the segment A.
Flash_Val = *Flash_ptrD; // (Flash_Val – global).
}
k155la3
Для начала проверьте опции проекта (дебаггер)
Там есть режмиы "заливки", в том числе тереть все или только программную память.
Скорее всего у Вас "трет все", соотв-но при каждой заливке сегменты содержат 0xFF.
После этого имеет смысл анализировать Ваш код.Нажмите для просмотра прикрепленного файла
JohnKorsh
Спасибо. Вы правы, дело именно Erase main and information memory.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2024 Invision Power Services, Inc.