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

 
 
 
Reply to this topicStart new topic
> FLASH-память в контроллере MSP430F5438, Не могу стереть FLASH-память
mzhelezkin
сообщение Jan 26 2010, 21:17
Сообщение #1





Группа: Участник
Сообщений: 14
Регистрация: 15-01-10
Пользователь №: 54 827



Здравствуйте. Подскажите такую вещь. В контроллере MSP430F5438 есть встроенная FLASH-память. Так вот записать в нее даныые у меня получается, а стереть их я не могу (пользуюсь программой IAR Embeddet Workbench v4.20.1). Для примера я взял простую программу:

CODE
#include "msp430x54x.h"

#define Memstart 0x10000 // Адрес с которого начну запись в FLASH

void main(void)
{
WDTCTL = WDTPW + WDTHOLD;

unsigned long g = Memstart;

do
{

while(FCTL3 & BUSY)
{}
FCTL3 = FWKEY;
FCTL1 = FWKEY + WRT;
__data20_write_char(g, 0x15);
g += 0x0001;
}
while(g <= 0x45BFF);

FCTL1 = FWKEY;
FCTL3 = FWKEY + LOCK;
}


Такой код работает нормально. Записывает в память все отлично.

Теперь попробую очистить FLASH. После цикла, указанного выше пишу такой код:

CODE
do
{

while(FCTL3 & BUSY)
{}
FCTL3 = FWKEY;
FCTL1 = FWKEY + ERASE;
__data20_write_char(g, 0x0F);
g += 0x0200;
}
while(g <= 0x10FF0);

FCTL1 = FWKEY;
FCTL3 = FWKEY + LOCK;


Компилирую. Ошибок никаких, но теперь и память не записывается, и не стирается. Хотя может наоборот стирается.)))) Прошу заметить что данные я записываю с адреса 0x10000 до 0x45BFF. А стирать пытаюсь с адреса 0x10000 до 0x10FF0. Получается что часть памяти я должен очистить, а часть забить своими данными, но ничего подобного не наблюдаю.
Данные во FlASH-памяти смотрю с помощью отладчика в IAR, в окне "Memory". Подскажите, может я что-то забыл. Какой-нибудь разрешающий/запрещающий бит не установил или наоборот не очистил. Или еще что-то.Заранее спасибо.
Go to the top of the page
 
+Quote Post
msalov
сообщение Jan 27 2010, 09:12
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 526
Регистрация: 24-08-07
Из: Беларусь, Минск
Пользователь №: 30 045



Код
    FCTL3 = FWKEY;
    FCTL1 = FWKEY + ERASE;
    __data20_write_char(g, 0);

Для стирания надо во флешь писать 0, а не 0x0F
Читайте главу 5.3.1.4 Initiating Erase From Flash руководства до полного просветления
Go to the top of the page
 
+Quote Post
mzhelezkin
сообщение Jan 27 2010, 12:37
Сообщение #3





Группа: Участник
Сообщений: 14
Регистрация: 15-01-10
Пользователь №: 54 827



Спасибо. Перечитал я указанный вами раздел. Но все равно не работает так как надо. Я уже не пишу цикл do/while. Просто хочу удалить хотя бы один сегмент. Но после того как я пишу строчку __data20_write_char(0x10000, 0); данные вообще перестают записываться в память. Ни в этом сегменте, ни в последующих.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 27 2010, 13:15
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(mzhelezkin @ Jan 27 2010, 14:37) *
данные вообще перестают записываться в память. Ни в этом сегменте, ни в последующих.
А посмотрите эррату. Насколько помню, там багов было - "мама дорогая".


Цитата(mzhelezkin @ Jan 26 2010, 23:17) *
Данные во FlASH-памяти смотрю с помощью отладчика в IAR, в окне "Memory".
Простите - внутрисхемным отладчиком или в симуляторе?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
SanvaldYV
сообщение Jan 27 2010, 13:49
Сообщение #5


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

Группа: Свой
Сообщений: 125
Регистрация: 21-03-07
Из: Санкт-Петербург
Пользователь №: 26 371



Код
   while(FCTL3 & BUSY) {};
   FCTL3 = FWKEY;
   FCTL1 = FWKEY + ERASE;
   __data20_write_char(g, 0x0F);


У меня в функции стирания сектора, написанной для 5418, было еще одно
Код
while ( FCTL3 & BUSY );
между
Код
FCTL3 = FWKEY;
и
Код
FCTL1 = FWKEY + ERASE;

Уже не помню, из каких соображений это было сделано. Но можете попробовать проверить у себя.
Go to the top of the page
 
+Quote Post
mdmitry
сообщение Jan 27 2010, 15:15
Сообщение #6


Начинающий профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648



Примеры работы с flash есть в демонстрационном софте для этого контроллера на сайте TI (MSP-EXP439F5438(A) Example Software (Rev. F)). Почему 439 не знаю, думаю опечатались в имени файла.


--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
Go to the top of the page
 
+Quote Post
mzhelezkin
сообщение Jan 28 2010, 14:00
Сообщение #7





Группа: Участник
Сообщений: 14
Регистрация: 15-01-10
Пользователь №: 54 827



Цитата(Сергей Борщ @ Jan 27 2010, 16:15) *
А посмотрите эррату. Насколько помню, там багов было - "мама дорогая".


Простите - внутрисхемным отладчиком или в симуляторе?

Прошиваю контроллер программатором MSP-FET430UIF. Пользуюсь внутрисхемным отладчиком.


Юрий Санвальд, сделал так как вы предложили. Теперь записывается, но ничего не удаляется)))) mdmitry, я как раз пользуюсь примером, на который вы дали ссылку. Но ничего ттам не нашел. Теперь пойду эррату смотреть. спасибо всем кто откликнулся, буду пробовать еще. О результатах напишу.

Сразу хочу попросить прощения. Я сам виноват, дурак, допустил такую ошибку. Вот код который я пишу в свое программе:

CODE
#include "msp430x54x.h"

#define Memstart 0x10000 // Адрес с которого начну запись в FLASH

void main(void)
{
WDTCTL = WDTPW + WDTHOLD;

unsigned long g = Memstart;

do
{

while(FCTL3 & BUSY)
{}
FCTL3 = FWKEY;
while(FCTL3 & BUSY)
{}
FCTL1 = FWKEY + WRT;
__data20_write_char(g, 0x15);
g += 0x0001;
}
while(g <= 0x45BFF);

FCTL1 = FWKEY;
FCTL3 = FWKEY + LOCK;


do
{
//while(FCTL3 & BUSY)
//{}
FCTL3 = FWKEY;
while ( FCTL3 & BUSY );
FCTL1 = FWKEY + ERASE;
__data20_write_char(g, 0x00);
//while (FCTL3 & BUSY );
g += 0x0200;
}
while(g <= 0x10FF0);

FCTL1 = FWKEY;
FCTL3 = FWKEY + LOCK;
}


Теперь хочу указать на ошибку которую я допустил. Во втором цикле do/while я использую ту же самую перемену g, что и в первом цикле. Но после выполнения первого цикла в этой переменной уже записано не 0x10000 (как я определил в начале программы), а 0x45BFF. Соответственно цикл стирания у меня начинается с адреса 0x45BFF. А это адрес самого последнего бита в памяти. Поэтому я ничего и не мог стереть. Как только я объявил еще одну переменную k, и во втором цикле заменил g на k. Все заработало как надо.
Еще раз прошу прощения, всем спасибо.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 5th July 2025 - 04:18
Рейтинг@Mail.ru


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