Здравствуйте.
Пишу 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, по определенному адресу?
Заранее благодарен за все советы и ответы.
|