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

    

Запись в информационную 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

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


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

Спасибо. Вы правы, дело именно Erase main and information memory.

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


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация