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

Пришла пора помощи попросить

Суть проблемы заключается в том, что не удается стереть сектор встроенной флеш средствами 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 - тоже самое только медленно :).

Больше идей нет :(

 

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

 

#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; // погасить светодиод - добавил для отладки, реально не гаснет

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


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

Почему из RAM? Где-то есть в документации? Я по английски плохо, мог пропустить. Но команда записи то работает.

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


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

Почему из RAM?

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

 

Я по английски плохо

по-русски тоже ;)

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


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

Почему из RAM? Где-то есть в документации? Я по английски плохо, мог пропустить. Но команда записи то работает.

Прога не в первом секторе? Прерывания запрещены?

Изменено пользователем GetSmart

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


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

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

 

Вы, случаем, команду Prepare for write не пропустили?

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


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

Прерывания запрещены. Сама программа не в 1 секторе - весь сектор объявлен как массив констант по заданному адресу. Про загрузчик в 1 секторе слышу впервые, до этого читал что он в последнем и еще что в 7-м, но не вникал, т.к. пробовал стирать 1 и 5. Завтра попробую скажем 4 для чистоты эксперимента. Но после зависания и сброса основная программа работает нормально, пока снова не попытаюсь записать во флеш.

Prepare for write не пропустил, она нормально работает, а в приведенном коде она на месте последнего многоточия.

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


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

Вроде разобрался. Как обычно оказалось - "сам дурак". Но всем спасибо за помощь.

Суть проблемы - хотя функции запрета прерываний присутствовали, но контроллер работал в User режиме, поэтому прерывания не запрещались фактически.

Т.е. я еще когда переделывал под себя стандартный стартовый файл - забыл изменить режим.

Бывает.

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


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

Первый сектор стирать не пробовал :)

Докладываю:

на LPC2366 замечательно проходит команда стереть сектора 0..14 (т.е. все), при этом загрузчик расположен в секторе 0.

Рапортовать об успешном завершении, правда, не получается, но не очень-то и хотелось - фича заложена "на всякий случай".

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


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

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...