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