Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: FLASH-память в контроллере MSP430F5438
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > MSP430
mzhelezkin
Здравствуйте. Подскажите такую вещь. В контроллере 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". Подскажите, может я что-то забыл. Какой-нибудь разрешающий/запрещающий бит не установил или наоборот не очистил. Или еще что-то.Заранее спасибо.
msalov
Код
    FCTL3 = FWKEY;
    FCTL1 = FWKEY + ERASE;
    __data20_write_char(g, 0);

Для стирания надо во флешь писать 0, а не 0x0F
Читайте главу 5.3.1.4 Initiating Erase From Flash руководства до полного просветления
mzhelezkin
Спасибо. Перечитал я указанный вами раздел. Но все равно не работает так как надо. Я уже не пишу цикл do/while. Просто хочу удалить хотя бы один сегмент. Но после того как я пишу строчку __data20_write_char(0x10000, 0); данные вообще перестают записываться в память. Ни в этом сегменте, ни в последующих.
Сергей Борщ
Цитата(mzhelezkin @ Jan 27 2010, 14:37) *
данные вообще перестают записываться в память. Ни в этом сегменте, ни в последующих.
А посмотрите эррату. Насколько помню, там багов было - "мама дорогая".


Цитата(mzhelezkin @ Jan 26 2010, 23:17) *
Данные во FlASH-памяти смотрю с помощью отладчика в IAR, в окне "Memory".
Простите - внутрисхемным отладчиком или в симуляторе?
SanvaldYV
Код
   while(FCTL3 & BUSY) {};
   FCTL3 = FWKEY;
   FCTL1 = FWKEY + ERASE;
   __data20_write_char(g, 0x0F);


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

Уже не помню, из каких соображений это было сделано. Но можете попробовать проверить у себя.
mdmitry
Примеры работы с flash есть в демонстрационном софте для этого контроллера на сайте TI (MSP-EXP439F5438(A) Example Software (Rev. F)). Почему 439 не знаю, думаю опечатались в имени файла.
mzhelezkin
Цитата(Сергей Борщ @ 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. Все заработало как надо.
Еще раз прошу прощения, всем спасибо.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.