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

Пишу Bootloader для stm32l.

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

Принцип такой:
1. В основной программе, по приходу команды через USART о том, что появился запрос о перепрошивки, МК заканчивает все операции, отвечает по USART, что готов и начинает прием программы. Данную программу он записывает на микросхему Flash памяти.

2. После приема всей программы и проверки правильности приема - у меня есть функция которая стирает flash МК и перезаписывает из внешней flash новую программу, я расположил данную функцию по определенному адресу flash. Но естественно выполнять ее из flash не могу, она сотрет сама себя и МК повиснет. Для устранения этого я копирую, данную функцию в RAM(Я же знаю по какому адресу она находится). И пытаюсь перейти ассемблерной командой BX (BLX) на ее выполнение.

Вот в последнем действии у меня загвоздка. Во первых нашел интересный факт, что при команде BX и BLX, у адреса перехода первый бит всегда должен быть 1. Грубо говоря если вы хотите перейти по адресу 0x08000000, то команду - BX 0x08000000, давать нельзя, надо давать BX 0x08000001. (http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.faqs/ka12545.html).

НО даже если в конце ставить эту 1, исполнение программы в RAM не хочет переходить, хотя по адресам FLASH все нормально переходит и выполняет команды.

ВОПРОС - почему не хочет переходить на выполнение в RAM? почему переходит только по адресам FLASH?
КАК мне тогда перейти на выполнение программы из RAM, по определенному адресу?

Заранее благодарен за все советы и ответы.
shmur
Проверьте чтобы в функции не использовалась абсолютная адресация.
Но зачем все так усложнять, почему не разделить основную прошивку от бутлоадера? У меня например для stm32f2 бутлоадер лежит во флеше в первых двух секторах, а прошивка в остальнах, и ничего из рама запускать не надо sm.gif Плюс можно даже в самом бутлоадере реализовать прием прошивки по уарту и немедленное прошитие во внутреннюю флеш минуя внешнюю.
PS Бит нужен для того чтобы указать процессору работать в тумб режиме, у кортексов арм режима даже вроде как и нету, так что бит всегда должен быть установлен.
Нортон
Цитата(shmur @ Feb 19 2013, 09:35) *
Проверьте чтобы в функции не использовалась абсолютная адресация.
Но зачем все так усложнять, почему не разделить основную прошивку от бутлоадера? У меня например для stm32f2 бутлоадер лежит во флеше в первых двух секторах, а прошивка в остальнах, и ничего из рама запускать не надо sm.gif Плюс можно даже в самом бутлоадере реализовать прием прошивки по уарту и немедленное прошитие во внутреннюю флеш минуя внешнюю.
PS Бит нужен для того чтобы указать процессору работать в тумб режиме, у кортексов арм режима даже вроде как и нету, так что бит всегда должен быть установлен.




Точно проверил дизассемблер, а там косяки. Это что-же мне писать на ассемблере эту функцию вручную.
А поместить загрузчик вначале, тоже отличная идея.

Спасибо за помощь.
Lotor
Цитата(Нортон @ Feb 19 2013, 10:42) *
Это что-же мне писать на ассемблере эту функцию вручную.

Как вариант - изучить документацию к своему компилятору.

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