Добрый день!
Не подскажет ли кто причины следующего явления. Работаю с 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).
}