Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Загрузчик str9
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
OsipovD
Здравствуйте, проблема в следующем:

Хочу иметь загрузчик контроллера str9. Чтобы при включении питания сначала исполнялся код загрузчика (расположен в маленькой флеш контроллера bank1) , если не происходит определённого события ( к примеру нажатие кнопки на отладочной плате), стартует основная программа ( из флеш bank0), если событие происходит, то можно загрузить по СОМ-порту новую основную программа.

Есть пример от ST IAP dtriver. Но в этом примере по нажатию кнопки ресет на плате, ресета не происходит. Связано это с тем, что не все регистры принимают свои reset value при resete, в частности FMI. Т.е по ресету контроллер хочет на нулевой адрес, но флеш с которой он грузится с нулевого адреса не начинается ( мы сделали remap перед jump(ом) на основную программу) и ему не остаётся ничего кроме как зависнуть...

А ресет в основной программе очень нужен. Не удавалось ли кому-нибудь перебороть эту проблему каким-нибудь способом? Буду признателен за любую помощь
MALLOY2
Что бы STR9 стартовал с маленькой памяти его нужно превельно законфигурировать, эти биты конфигурации доступны только через JTAG !!!

Ну а дальше это ваша программа....
AlexandrY
Просто ремап не надо делать и все отдично работает.
Именно так делаю в дивайсах на STR91x.
Область векторов совместно используют и загрузчик и программа.
Этаж область то все равно одинаковая, зачем из-за нее делать ремапинг?

Цитата(OsipovD @ Dec 11 2007, 22:24) *
Здравствуйте, проблема в следующем:

Хочу иметь загрузчик контроллера str9. Чтобы при включении питания сначала исполнялся код загрузчика (расположен в маленькой флеш контроллера bank1) , если не происходит определённого события ( к примеру нажатие кнопки на отладочной плате), стартует основная программа ( из флеш bank0), если событие происходит, то можно загрузить по СОМ-порту новую основную программа.

Есть пример от ST IAP dtriver. Но в этом примере по нажатию кнопки ресет на плате, ресета не происходит. Связано это с тем, что не все регистры принимают свои reset value при resete, в частности FMI. Т.е по ресету контроллер хочет на нулевой адрес, но флеш с которой он грузится с нулевого адреса не начинается ( мы сделали remap перед jump(ом) на основную программу) и ему не остаётся ничего кроме как зависнуть...

А ресет в основной программе очень нужен. Не удавалось ли кому-нибудь перебороть эту проблему каким-нибудь способом? Буду признателен за любую помощь
OsipovD
Цитата(AlexandrY @ Dec 12 2007, 18:07) *
Просто ремап не надо делать и все отдично работает.
Именно так делаю в дивайсах на STR91x.
Область векторов совместно используют и загрузчик и программа.
Этаж область то все равно одинаковая, зачем из-за нее делать ремапинг?

Получился загрузчик с ремапом, причем решение вышло довольно странное:
В программе загрузчике настраиваю FMI - маленькая flash bank1 на адресе 0x00, доступны обе flash (FMI->CR=0x018). Дальше забавнее - перед jump(ом) оставляю всё так же как и в примере IAP -
FMI->BBSR = 0x0;
FMI->NBBSR = 0x6;
//FMI->BBADR = 0x80000 >> 2;
FMI->NBBADR = 0x0 ;
Только вот строку, где маленькой flash присваивается новый адрес, закомментирую. Т.е имею две flash c нулевыми адресами. Если теперь сделать jump на нулевой адрес, то загрузчик начинает вечно крутиться, но если запретить использование маленькой flash:

FMI->CR = 0x010;
То после jump(a) начинает исполняться программа из большой flash, по нажатию клавиши reset снова запускается загрузчик.
Только вот если в основной программе ( большая flash) я "трогаю" регистры FMI, программа перестаёт запускаться ( в IAP было тоже самое). А задачка как раз в том, что бы загрузчик запускал основную программу, безо всяких изменений её кода.
Bosicc
Цитата(AlexandrY @ Dec 12 2007, 17:07) *
Просто ремап не надо делать и все отдично работает.
Именно так делаю в дивайсах на STR91x.
Область векторов совместно используют и загрузчик и программа.
Этаж область то все равно одинаковая, зачем из-за нее делать ремапинг?


Можно поподробней рассказать про совместное использование области под вектора? Меня интересует вектора заданы в загрузчике и как в главной программе?

Просто у меня возникла проблема. Когда я полностью загрузил главную программу в Банк 0 и хочу сделать ДЖАМП на нею, у меня программа слетает. Я так понимаю, есть пару причин:
1. Не срабатывает Ремап ( FMI->CR сбрасывается в значение 0х8 ( взято отсюда ) )
2. Не правильно вызываю функцию jump();

Если Вам будет не сложно, могли бы вы более подробно описать процесс переключения между банками. И если есть тестовый примерчик под Кейл, поделитесь пожалуйста smile.gif

Буду очень благодарен за советы.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.