Ксения (20.12.2008 03:26, просмотров: 10079)
Особенности прошивки через AvReal Твердо не уверена, AvReal тут виноват, или сам процесс прошивки через SPI, но расскажу всё как было по порядку.
Сначала я долго мучилась с реализаций "самозаписи" во flash-память с помошью инструкции SPM. Оказалось, что она работает только из boot-области. Когда же я подняла функцию стирания одиночной flash-страницы в boot-область, то моя функция заработала. Но каково было мое удивление, когда я обнаружила, что эта функция срабатывает, стирая страницу, без ее вызова! Т.е. прошиваю кристалл, проверяю его прошивку, а там уже указанная страница стерта! Между прошивкой и повторным чтением кристалл оживал, но как он мог самовольно запустить выполнение boot-области осталось для меня загадкой. Тем более что без "верхней" функции он нормально запускался с нижних адресов.
Сперва я решила, что у меня фузы не в порядке, и потому де МК запускается с boot, а не с application-области. Оказалось, что с фузами все нормально. Тогда я сделала "обводку", установив перед функцией стирания страницы инструкцию rjmp, которая перепрыгивала через нее. От этого всё стало нормально - и МК запускался, и страница стиралась только по команде.
Однако мое любопытство не утихало. Очень захотелось выяснить, каким образом boot-область получает управление. Поначалу я подумала, что запуск идет с верхних адресов, и, пройдя всю boot-область до конца, сбрасывается в начало из-за переполнения счетчика команд. И тогда я решилась на отчаянный шаг - заменила свой rjmp в начале boot-области на вызов процедуры ... Reset! Эта процедура, как известно, состоит из последовательной активации watchdog, запрете всех прерываний и погружения в бесконечный цикл, который я исполнила с подмигиванием светодиодом. Подразумевалось, что если моя гипотеза относительно верхней загрузки верна, то МК так и будет биться в конвульсиях, постоянно перегружаясь по ресету.
Тем не менее результат этого опыта оказался парадоксальным - МК работал, как положено, подмигнув светодиодом только в момент прошивки. Это означало, что при подключении питания МК запускается с нижних адресов application-области, как ему и положено. А запуск верхней boot-области происходит исключительно в процессе прошивки или непосредственного выхода из нее. Короче говоря, после пошивки моего AT90USB647 программатором AvReal32 происходит передача выполнения в boot-область, когда как при обычном подключении питания МК запускается, как ему положено.
Сталкивались ли вы с подобным проявлением? Является ли оно закономерным или ошибкой?
P.S. Побочно обнаружила, что пока boot-область была пустая, то после прошивки МК сам приступал к выполнению только что прошитой программы. А после моей вставки в boot-область оставался после прошивки мертвым, оживая лишь после снятия и возобновления подачи питания. А как у вас? Запускается ли свежая прошивка сама или вам приходится вручную оживлять МК посредством аппаратного ресета или манипуляцией с питанием?