Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Пришла пора помощи попросить
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
starmos
Суть проблемы заключается в том, что не удается стереть сектор встроенной флеш средствами IAP.
Использую контроллер LPC2134/01, Keil и LPC2000 Flash Utility
Пытаюсь работать с сектором 1 (с 5 еще пробовал).
Средствами LPC2000 Flash Utility сектор стирается и программируется.
Средствами IAP только программируется, если предварительно утилитой стереть.
Все вызовы команд IAP - как в примерах в документации. Подготовка сектора и запись работают нормально. А при стирании команда IAP вызывается, но обратно не выходит. Что-то стирает, судя по тем константам что потом после перезапуска смотрю, но в текущем сеансе виснет.
Стек для IAP в верхней части ОЗУ (128 байт) предусмотрел. Может неправильно (?), задал массив по конкретному адресу, в программе своей его не использую -> unsigned char iap_sys[128] __at(0x40003F80);
Тактовую частоту в параметры IAP передаю в кГц. Причем шьет она и при 12000 и при 60000 - проверил эмпирически. Как правильно надо в итоге не понял, но не стирает в обоих случаях. Пробовал работать без PLL и MAM - тоже самое только медленно smile.gif.
Больше идей нет sad.gif

Все что относится:

#define OSCILLATOR 12000 // тактовая частота микроконтроллера в кГц
#define IAP_LOCATE 0x7FFFFFF1 // точка входа в IAP
.........
typedef void (*IAP)(unsigned long int *cmd, unsigned long int *rez);
IAP iap_entry;
unsigned long int iap_command[5];
unsigned long int iap_result[3];

Вызов команды:

........
iap_entry = (IAP) IAP_LOCATE; // установить адрес входа в IAP
.....
iap_command[0] = 52; // стереть сектор
iap_command[1] = sector;
iap_command[2] = sector;
iap_command[3] = OSCILLATOR; // тактовая частота в кГц
iap_entry(iap_command, iap_result);

IO0CLR.bit.P0_18 = 1; // погасить светодиод - добавил для отладки, реально не гаснет
dimka76
Мне кажется, все это

должно выполняться из RAM
starmos
Почему из RAM? Где-то есть в документации? Я по английски плохо, мог пропустить. Но команда записи то работает.
dimka76
Цитата(starmos @ Sep 11 2009, 10:12) *
Почему из RAM?

чтобы ваша программа сама себя не затерла

Цитата(starmos @ Sep 11 2009, 10:12) *
Я по английски плохо

по-русски тоже wink.gif
GetSmart
Цитата(starmos @ Sep 11 2009, 12:12) *
Почему из RAM? Где-то есть в документации? Я по английски плохо, мог пропустить. Но команда записи то работает.

Прога не в первом секторе? Прерывания запрещены?
esaulenka
У меня в 2138 загрузчик живёт в первом секторе (в ОЗУ не копируется), всё нормально стирается. Первый сектор стирать не пробовал smile.gif

Вы, случаем, команду Prepare for write не пропустили?
adnega
Вроде, сектор подготавливать надо...
starmos
Прерывания запрещены. Сама программа не в 1 секторе - весь сектор объявлен как массив констант по заданному адресу. Про загрузчик в 1 секторе слышу впервые, до этого читал что он в последнем и еще что в 7-м, но не вникал, т.к. пробовал стирать 1 и 5. Завтра попробую скажем 4 для чистоты эксперимента. Но после зависания и сброса основная программа работает нормально, пока снова не попытаюсь записать во флеш.
Prepare for write не пропустил, она нормально работает, а в приведенном коде она на месте последнего многоточия.
starmos
Вроде разобрался. Как обычно оказалось - "сам дурак". Но всем спасибо за помощь.
Суть проблемы - хотя функции запрета прерываний присутствовали, но контроллер работал в User режиме, поэтому прерывания не запрещались фактически.
Т.е. я еще когда переделывал под себя стандартный стартовый файл - забыл изменить режим.
Бывает.
esaulenka
Цитата(esaulenka @ Sep 11 2009, 12:45) *
Первый сектор стирать не пробовал smile.gif

Докладываю:
на LPC2366 замечательно проходит команда стереть сектора 0..14 (т.е. все), при этом загрузчик расположен в секторе 0.
Рапортовать об успешном завершении, правда, не получается, но не очень-то и хотелось - фича заложена "на всякий случай".
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.