реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Запись в информационную Flash., Сегмент D - непонятности при записи.
JohnKorsh
сообщение Dec 7 2017, 15:43
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 182
Регистрация: 6-01-05
Из: Россия, Москва
Пользователь №: 1 820



Добрый день!
Не подскажет ли кто причины следующего явления. Работаю с 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).
}
Go to the top of the page
 
+Quote Post
k155la3
сообщение Dec 7 2017, 18:28
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Для начала проверьте опции проекта (дебаггер)
Там есть режмиы "заливки", в том числе тереть все или только программную память.
Скорее всего у Вас "трет все", соотв-но при каждой заливке сегменты содержат 0xFF.
После этого имеет смысл анализировать Ваш код.
Прикрепленное изображение
Go to the top of the page
 
+Quote Post
JohnKorsh
сообщение Dec 8 2017, 11:11
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 182
Регистрация: 6-01-05
Из: Россия, Москва
Пользователь №: 1 820



Спасибо. Вы правы, дело именно Erase main and information memory.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th April 2024 - 22:10
Рейтинг@Mail.ru


Страница сгенерированна за 0.01377 секунд с 7
ELECTRONIX ©2004-2016