Перейти к содержанию
    

Запись в информационную Flash.

Добрый день!

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

}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для начала проверьте опции проекта (дебаггер)

Там есть режмиы "заливки", в том числе тереть все или только программную память.

Скорее всего у Вас "трет все", соотв-но при каждой заливке сегменты содержат 0xFF.

После этого имеет смысл анализировать Ваш код.post-45848-1512671647_thumb.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...