starmos 2 11 сентября, 2009 Опубликовано 11 сентября, 2009 · Жалоба Суть проблемы заключается в том, что не удается стереть сектор встроенной флеш средствами 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; // погасить светодиод - добавил для отладки, реально не гаснет Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 61 11 сентября, 2009 Опубликовано 11 сентября, 2009 · Жалоба Мне кажется, все это должно выполняться из RAM Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
starmos 2 11 сентября, 2009 Опубликовано 11 сентября, 2009 · Жалоба Почему из RAM? Где-то есть в документации? Я по английски плохо, мог пропустить. Но команда записи то работает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 61 11 сентября, 2009 Опубликовано 11 сентября, 2009 · Жалоба Почему из RAM? чтобы ваша программа сама себя не затерла Я по английски плохо по-русски тоже ;) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GetSmart 0 11 сентября, 2009 Опубликовано 11 сентября, 2009 (изменено) · Жалоба Почему из RAM? Где-то есть в документации? Я по английски плохо, мог пропустить. Но команда записи то работает. Прога не в первом секторе? Прерывания запрещены? Изменено 11 сентября, 2009 пользователем GetSmart Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
esaulenka 7 11 сентября, 2009 Опубликовано 11 сентября, 2009 · Жалоба У меня в 2138 загрузчик живёт в первом секторе (в ОЗУ не копируется), всё нормально стирается. Первый сектор стирать не пробовал :) Вы, случаем, команду Prepare for write не пропустили? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 11 сентября, 2009 Опубликовано 11 сентября, 2009 · Жалоба Вроде, сектор подготавливать надо... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
starmos 2 11 сентября, 2009 Опубликовано 11 сентября, 2009 · Жалоба Прерывания запрещены. Сама программа не в 1 секторе - весь сектор объявлен как массив констант по заданному адресу. Про загрузчик в 1 секторе слышу впервые, до этого читал что он в последнем и еще что в 7-м, но не вникал, т.к. пробовал стирать 1 и 5. Завтра попробую скажем 4 для чистоты эксперимента. Но после зависания и сброса основная программа работает нормально, пока снова не попытаюсь записать во флеш. Prepare for write не пропустил, она нормально работает, а в приведенном коде она на месте последнего многоточия. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
starmos 2 14 сентября, 2009 Опубликовано 14 сентября, 2009 · Жалоба Вроде разобрался. Как обычно оказалось - "сам дурак". Но всем спасибо за помощь. Суть проблемы - хотя функции запрета прерываний присутствовали, но контроллер работал в User режиме, поэтому прерывания не запрещались фактически. Т.е. я еще когда переделывал под себя стандартный стартовый файл - забыл изменить режим. Бывает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
esaulenka 7 15 сентября, 2009 Опубликовано 15 сентября, 2009 · Жалоба Первый сектор стирать не пробовал :) Докладываю: на LPC2366 замечательно проходит команда стереть сектора 0..14 (т.е. все), при этом загрузчик расположен в секторе 0. Рапортовать об успешном завершении, правда, не получается, но не очень-то и хотелось - фича заложена "на всякий случай". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться